Opengl: 在3D场景中添加2D HUD

18
我浏览了一些在这里发布的问题,但仍然无法理解为什么我的2D HUD出现后会使我的3D渲染世界消失。
编辑:似乎2D场景控制了整个屏幕,所以偶尔我可以看到3D场景穿过2D场景出现故障。即使它只需要渲染一个10x10像素的四边形,它也会将其渲染出来,然后将其余部分变成空白。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,x,y);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0,-0.5,-6.0);

glPushMatrix();

..Draw some 3d stuff...

glPopMatrix();
// Start 2d
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(0.0f, 255.0f, 1.0f);
glBegin(GL_QUADS);
    glVertex2f(0.0, 0.0);
    glVertex2f(10.0, 0.0);
    glVertex2f(10.0, 10.0);
    glVertex2f(0.0, 10.0);
glEnd();

然后我交换缓冲区。

这是我的代码顺序。它先创建3D空间,然后创建2D空间,最终消除了3D空间。


SCREEN_WIDTHglViewport中使用的x有什么区别?如果您注释掉最后六行,但保留2D设置,3D渲染是否仍会消失?您能否将其缩小到干扰3D部分的一行或命令? - Ben Voigt
@Ben Voigt:如果我注释掉最后6行(从glbegin()开始),3D渲染仍然不会出现。SCREEN_WIDTH和X是相同的,我创建了两个变量而没有意识到,并且还没有整理好。 - Elgoog
好的,等到3D世界回来之前,继续将2D设置代码注释掉。可以逐行注释或使用二分查找进行分治。可能是您更改了OpenGL状态,而3D代码假定该状态保留在其默认值,例如纹理或着色器等。 - Ben Voigt
@Ben Voigt:如果我注释掉第二个glMatrixMode(GL_PROJECTION);,3D渲染就会显示。 - Elgoog
3个回答

37

花了一点时间才弄明白,所以为了避免其他人遇到同样的问题:

    ...After Drawing 3d Stuff...

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, -1.0, 10.0);
glMatrixMode(GL_MODELVIEW);
//glPushMatrix();        ----Not sure if I need this
glLoadIdentity();
glDisable(GL_CULL_FACE);

glClear(GL_DEPTH_BUFFER_BIT);

glBegin(GL_QUADS);
    glColor3f(1.0f, 0.0f, 0.0);
    glVertex2f(0.0, 0.0);
    glVertex2f(10.0, 0.0);
    glVertex2f(10.0, 10.0);
    glVertex2f(0.0, 10.0);
glEnd();

// Making sure we can render 3d again
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
//glPopMatrix();        ----and this?

...Then swap buffers...

:)


请按照相反的push顺序进行pop操作。可能这些矩阵堆栈是分开的,但无论如何都不会有害。此外,在这种情况下,我认为pushMatrix是不必要的。 - Jonas Bötel
@LumpN:我不确定你在反向push顺序中所说的pop是什么意思。 - Elgoog
жҲ‘и®Өдёәд»–зҡ„ж„ҸжҖқжҳҜпјҢиў«жіЁйҮҠжҺүзҡ„glPopMatrix()еә”иҜҘж”ҫеңЁйЎ№зӣ®зҹ©йҳөйҮҚзҪ®д№ӢеүҚгҖӮ - geofftnz
在使用2D HUD时,最好使用gluOrtho2D()而不是glOrtho()。 - Tobias Reich
有人知道如何从3D灯光转换为2D颜色吗? - Bitterblue

7

如果您正在将2D正交投影叠加在3D上,则通常希望将深度缓冲区排除在外:

glDepthMask(GL_FALSE);  // disable writes to Z-Buffer
glDisable(GL_DEPTH_TEST);  // disable depth-testing

当然,在进行下一次3D处理之前,您需要将这些值重置为其原始值。

3
glViewport(0, 0, x, y); //You need to do this only once on viewport resize

//Setup for 3D
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(40.0, (GLdouble)x/(GLdouble)y, 0.5, 20.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BIT);

// ... Render 3D ...

//Setup for 2D
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BIT);

// ... Render 2D ...

SwapBuffers;

请注意,如果您完全在3D之上渲染2D,则无需处理矩阵的推入/弹出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接