假设我想画一个像这样的简单四边形:
glBegin(GL_QUADS); glVertex2f(-1.0,-1.0); glVertex2f(1.0,-1.0); glVertex2f(1.0, 1.0); glVertex2f(-1.0, 1.0); glEnd();
有没有办法绘制它,使它出现在所有3D对象后面并填满整个屏幕?我的相机随着鼠标移动,因此这个四边形也必须在相机移动时显得静止不动.目的是做一个简单的背景.
我是否必须根据眼睛位置/旋转进行一些疯狂的变换,或者使用glMatrixMode()是否有更简单的方法?
听起来你想要做的就像你在一个简单的游戏中绘制2D HUD时那样,或者只是一个持久的背景.我不是专家,但我最近才做到这一点.你想要做的是将投影矩阵更改为正交投影,渲染四边形,然后切换回之前的投影.您可以使用矩阵堆栈完成此操作,它完全独立于任何相机.
所以,首先:
glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); int w = glutGet(GLUT_WINDOW_WIDTH); int h = glutGet(GLUT_WINDOW_HEIGHT); gluOrtho2D(0, w, h, 0);
这将一个新的投影矩阵推到投影堆栈上(我在这个项目中使用过剩,但它应该转换为普通的OpenGL).然后,我得到窗口的宽度和高度,并使用gluOrtho2D来设置我的正投影.
下一个:
glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); // Draw your quad here in screen coordinates
在这里,我只是将一个新的,干净的矩阵推到模型视图上.您可能不需要这样做.
最后:
glPopMatrix() // Pops the matrix that we used to draw the quad glMatrixMode(GL_PROJECTION); glPopMatrix(); // Pops our orthographic projection matrix, which restores the old one glMatrixMode(GL_MODELVIEW); // Puts us back into GL_MODELVIEW since this is probably what you want
我希望这有帮助.如您所知,它不需要使用眼睛位置.这主要是因为当我们使用完全适合我们窗户的新正投影时,这是无关紧要的.如果在其他绘制调用之后执行此操作,则可能不会将四边形置于后面.
编辑:关闭深度测试和清除深度缓冲也可能有所帮助,正如Boojum所说.