1 运行如下代码,可以看到如下效果,我们利用opengl画出一个三角形。
void renderScene(void){ /* glClear清除缓冲区 */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* 将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作 1.X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。 2.OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。 3.中心左面的坐标值是负值,右面是正值。 移向屏幕顶端是正值,移向屏幕底端是负值。 移入屏幕深处是负值,移出屏幕则是正值。 */ glLoadIdentity(); /* 画出三个顶点,根据这三个顶点链接成一个凸包 */ glBegin(GL_TRIANGLES);//GL_TRIANGLES三角形 glVertex3f(-1.0, -1.0, 0.0); glVertex3f(1.0, 0.0, 0.0); glVertex3f(0.0, 1.0, 0.0); glEnd(); /* 双缓冲模式 与 glutInitDisplayMode(GLUT_RGBA) 对应 */ glutSwapBuffers();}
这个代码中需要解释的是glLoadIdentity(),假如这个函数去掉,当我们窗口大小变化的时候,窗口中的所有东西都会消失。
这个小小的细节涉及到opengl的渲染机制,opengl有个变化矩阵堆栈,opengl中的每个定义好的将要渲染的矩阵呈现之前都要先乘以栈顶的矩阵。glLoadIdentity()将栈顶的矩阵设置为固定不变的单位矩阵,所以当窗口大小变化需要重绘窗口的时候,就可以就可以保持不变了。
其他情况类似的情况如下:
glTranslatef:将T(x,y,z)右乘与堆栈的栈顶变换矩阵。右乘的解释,假设目前栈顶变换矩阵为M,那么就相当于把M修改为M*T.
glRotatef :将R(x,y,z,s)右乘与堆栈的栈顶变换矩阵。glLoadIdentity:将堆栈的栈顶变换矩阵设置成单位矩阵。glPushMatrix:将堆栈的栈顶变换矩阵复制一份,然后Push到堆栈中。所谓Push,就像塞子弹一样把一个矩阵压入到堆栈中,此时,栈顶就是这个新的矩阵了,注意定义的向量都是和栈顶变换矩阵作用的。glPopMatrix:将堆栈的栈顶变换矩阵Pop出来。
更多细节参考
2 关于视图显示 glViewport();glOrtho();
void renderScene_1(void){ glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); /* 画笔的颜色 */ glColor3f(1.0, 1.0, 0.0); glLoadIdentity(); /* http://hi.baidu.com/xun1573/item/a872977f9fbbbd366cc37c6f http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html glOrtho获取截屏 procedure glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei); 拉伸之后放在glViewPort上, 根据glViewPort(x, y, width, height) 放在总的窗口上的(x, y)坐标上 */ glViewport(50, 50, 300, 300); glOrtho(0.25, 0.25, 0.75, 0.75, -0.0, 0.5); /* 画一个正方形 */ glBegin(GL_POLYGON); { glVertex3f(0.25, 0.25, 0.0); glVertex3f(0.75, 0.25, 0.0); glVertex3f(0.75, 0.75, 0.0); glVertex3f(0.25, 0.75, 0.0); } glEnd(); /* 双缓冲渲染 */ glutSwapBuffers();}
http://hi.baidu.com/xun1573/item/a872977f9fbbbd366cc37c6f
http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html