我正在尝试以纹理作为背景绘制2D场景,然后(当程序流动并进行计算时)在“画布”上绘制不同的基元。作为测试用例,我想在背景图像上绘制蓝色四边形。
我已经查看了几个资源和SO问题,以尝试获取完成任务所需的信息(例如this tutorial用于第一次原始渲染,SOIL "example"用于纹理加载)。
我的理解是纹理将在Z = 0和四边形上绘制。因此Quad会“覆盖”纹理的一部分 - 在它上面绘制,这就是我想要的。相反,我的显示功能的结果是我的黑/蓝色初始纹理,而不是我的纹理(原始颜色),上面绘制了蓝色四边形。这是显示功能代码:
void display (void) {
glClearColor (0.0,0.0,0.0,1.0);
glClear (GL_COLOR_BUFFER_BIT);
// background render
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, 1024.0, 512.0, 0.0, 0.0, 1.f); // window size is 1024x512
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture );
glBegin (GL_QUADS);
glTexCoord2d(0.0,0.0); glVertex2d(0.0,0.0);
glTexCoord2d(1.0,0.0); glVertex2d(1024.0,0.0);
glTexCoord2d(1.0,1.0); glVertex2d(1024.0,512.0);
glTexCoord2d(0.0,1.0); glVertex2d(0.0,512.0);
glEnd(); // here I get the texture properly displayed in window
glDisable(GL_TEXTURE_2D);
// foreground render
glLoadIdentity();
gluPerspective (60, (GLfloat)winWidth / (GLfloat)winHeight, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glColor3f(0.0, 0.0, 1.0);
glBegin (GL_QUADS);
glVertex2d(400.0,100.0);
glVertex2d(400.0,500.0);
glVertex2d(700.0,100.0);
glVertex2d(700.0,500.0);
glEnd(); // now instead of a rendered blue quad I get my texture coloured in blue
glutSwapBuffers(); }
我已经尝试了很多修改,但由于我刚开始使用OpenGL并且还没有理解很多,我的尝试失败了。例如,我尝试在绘制四边形之前和之后推送和弹出矩阵,清除深度缓冲区,更改gluPerspective中的参数等。
如何修改我的代码,以便在我的2D场景的背景纹理图像上正确渲染四边形?作为初学者,对修改的额外解释(以及我们将非常感谢目前代码中的错误)和一般原则。
编辑 - 经过Reto Koradi回答:
我尝试按照说明操作,现在修改后的代码如下:
// foreground render
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glOrtho(0.0f, 1024.0, 512.0, 0.0, 0.0, 1.f);
glColor3f(0.0, 0.0, 1.0);
glBegin (GL_QUADS); // same from here on
现在我可以看到蓝色的“四边形”,但它显示不正确,它看起来像这个。
除此之外,整个场景都在快速闪烁。我需要在代码中更改哪些内容才能正确显示四边形并且屏幕不会闪烁?
答案 0 :(得分:0)
在渲染蓝色四边形之前设置透视变换:
glLoadIdentity();
gluPerspective (60, (GLfloat)winWidth / (GLfloat)winHeight, 1.0, 100.0);
gluPerspective()
的定义方式,它设置了一个从原点向下看负z轴的转换,near
和far
值指定了距离范围是可见的。通过此转换,将显示从-1.0到-100.0的z值。其中不包括z = 0.0的四边形。
如果要在2D坐标空间中绘制四边形,最简单的解决方案是根本不使用gluPerspective()
。只需像初始绘图一样使用glOrtho()
类型转换。
如果您需要透视图,则还需要进行GL_MODELVIEW
转换。您可以从负z方向开始转换,范围为1.0到100.0。您可能还必须调整不同坐标系的坐标,或者使用也可以在xy方向上转换的其他转换,并可能进行缩放。
代码也有错误顺序的坐标用于绘制蓝色四边形。您必须将绘制调用更改为GL_TRIANGLE_STRIP
(建议因为它至少让您更接近使用未弃用的功能),或者交换最后两个顶点的顺序:
glBegin (GL_QUADS);
glVertex2d(400.0,100.0);
glVertex2d(400.0,500.0);
glVertex2d(700.0,500.0);
glVertex2d(700.0,100.0);
glEnd(GL_QUADS);