在OpenGL中,如何制作简单的背景四边形?

时间:2009-01-22 07:16:28

标签: opengl graphics image background glut

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

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()是否有更简单的方法?

3 个答案:

答案 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)

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

  1. 使用glClear(GL_DEPTH_BUFFER_BIT);
  2. 清除深度缓冲区
  3. 使用glDisable(GL_DEPTH_TEST);
  4. 关闭深度测试
  5. 使用gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
  6. 加载固定的正投影
  7. 按照描述绘制四边形。
  8. 重新开启深度测试。
  9. 加载常规透视投影并绘制视图的其余部分。

答案 2 :(得分:0)

你不能把它放在背景中,如果你想要它在你周围,请自行装箱。您需要先绘制它以使其落后于所有对象。