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

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

最佳答案

听起来您想要做的类似于在简单游戏中绘制 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

在这里,我只是将一个新的、干净的矩阵推到模型 View 上。您可能不需要这样做。

最后:

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 建议的那样,关闭深度测试并清除深度缓冲区也会有所帮助。

关于opengl - 在 OpenGL 中,如何制作简单的背景四边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/468297/

相关文章:

opengl - OpenGL 是什么类型的 API?

android - 绘制固定长度曲线

graphics - 沿着 CoreAudio 编程 : CoreGraphics? CoreAnimation 最快的动画图形是什么?科科斯2D? OpenGL?

c# - 是否有可能获得对 system.drawing.graphics 类的原始图像缓冲区的引用?

ruby - Rmagick 裁剪到相同的图像?

opengl - 我们如何获得 glDrawElements() 的索引?

c++ - 渲染到纹理,读取像素导致大部分为黑色

c++ - std::vector 的正确分配

java - Java编译器给出 “file not found”错误

PHP 从字符串中获取图像的所有 URL