假设我想画一个像这样的简单四边形:
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()是否有更简单的方法?
答案 0 :(得分:5)
听起来你想做的事情与你在简单游戏中绘制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所说。
答案 1 :(得分:3)
以下是我每帧使用的步骤:
glClear(GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
答案 2 :(得分:0)
你不能把它放在背景中,如果你想要它在你周围,请自行装箱。您需要先绘制它以使其落后于所有对象。