书上的例子+百度函数:
#include <Windows.h>
#include <gl/glut.h> //我是通过在电脑中搜索GL.h然后人工的把glut.h放在了里面--vs2012
static GLfloat spin = 0.0;
void init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
//显示回调函数
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0.0, 0.0, 1.0);
glColor3f(1.0,1.0,1.0);
glRectf(-25.0,-25.0,25.0,25.0);
glPopMatrix();
glutSwapBuffers(); //交换缓冲区 双缓冲技术
}
void spinPlay(void)
{
spin = spin + 2.0;
if (spin > 360.0)
spin -= 360.0;
glutPostRedisplay();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void mouse(int button, int state, int x, int y)
{
switch (button)
{
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinPlay);
break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL); //空闲处理函数
break;
default:
break;
}
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //双缓冲
glutInitWindowSize(250,250);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop(); //开启事件循环 已注册的显示回调函数被触发
return 0;
}
void glShadeModel(GLenum model);
参数可以为GL_SMOOTH(默认值)或GL_FLAT; GL_FLAT-恒定着色,使用图元中某个顶点的颜色渲染整个图元
GL-SMOOTH(光滑着色)独立的处理图元中各个顶点的着色。
glPushMatrix()和glPopMatrix()
将本次要进行的缩放,平移等操作放在这两个函数之间,他们两的配对使用可以消除上一次的变化对本次变化的影响。使本次变换是以世界坐标系的原点为参考点进行。
glRotatef(GLfloat angle, GLfloatf x, GLfloatf y, GLfloatf z)
第一个表示旋转的角度,后面的x,y,z貌似表示一个整体向量,图形围绕着这个向量旋转angle度。可以尝试改变后面3个参数来看效果。
glutSwapBuffers是OpenGL中GLUT工具包中用于实现双缓冲技术的一个重要函数,该函数的功能是交换两个缓冲区指针。---用于解决画面闪烁的问题,即使绘制的东西同时出现在屏幕上。双缓冲技术就是使用两个缓冲区-前台缓冲和后台缓冲,前台缓冲是我们看到的屏幕,后台缓冲则在内存当中,每次的绘图操作都在后台进行,当绘制完成时,把绘制的最终结果都复制到屏幕上,这样我们看到的GDI元素都是同时出现在屏幕上,就可解决频繁刷新时屏幕闪烁的问题。
OpenGL中实现双缓冲:1,在调用glInitDisplayModel函数时开启GLUT_DOUBLE。2,调用glutDisplayFunc(display)注册函数时,在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针。3.调用glutIdelFunc注册一个空闲时绘制操作函数,注册的这个函数再调用display函数。
glMatrixModel()指定哪一个矩阵是当前矩阵
这个函数其实就是对接下来要做什么进行声明,也就是在做下一步之前告诉计算机我要对“什么”进行操作了。这个“什么"包括GL_MODELVIEW.GL_PROJECTION, GL_TEXTURE
GL_PROJECTION是对投影矩阵,GL_MODELVIEW是对模型视图,GL_TEXTURE是对纹理矩阵进行操作
与glLoadIdentity一同使用,glLoadIdentity这个函数的功能是重置当前的矩阵为单位矩阵,在glLoadIdentity()之后我们为场景设置了透视图。