3

假设我想画一个像这样的简单四边形:

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()?

4

3 回答 3

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);

这会将一个新的投影矩阵推送到投影堆栈上(我在这个项目中使用了 glut,但它应该只转换为普通的 OpenGL)。然后,我得到窗口的宽度和高度,并使用 gluOrtho2D 设置我的正交投影。

下一个:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Draw your quad here in screen coordinates

Here I just push a new, clean matrix onto the modelview. You may not need to do this.

Lastly:

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

I hope this helps. As you can tell, it requires no use of the eye position. This is mainly because when we use a new orthographic projection that perfectly fits our window, this is irrelevant. This may not put your quad in the back however, if this is executed after the other draw calls.

EDIT: Turning off depth testing and clearing the depth buffer could help as well, as Boojum suggests.

于 2009-01-22T08:09:58.270 回答
3

以下是我对每一帧使用的步骤:

  1. 清除深度缓冲区glClear(GL_DEPTH_BUFFER_BIT);
  2. 关闭深度测试glDisable(GL_DEPTH_TEST);
  3. 加载一个固定的正交投影gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
  4. 按照你的描述画出你的四边形。
  5. 重新打开深度测试。
  6. 加载您的常规透视投影并绘制视图的其余部分。
于 2009-01-22T08:04:08.110 回答
0

你不能把它放在背景中,如果你想要它在你身边,就把自己装进去。您需要先绘制它以使其位于所有对象的后面。

于 2009-01-22T07:46:28.287 回答