Opengl: 2d HUD sobre 3D

Eu olhei para algumas questões postadas aqui sobre o assunto e ainda não posso descobrir por que meu 2d HUD aparece, mas faz o meu mundo renderizado em 3D desaparecer.

EDIT: Parece que a cena 2d está assumindo o controle da canvas inteira para que de vez em quando eu possa ver a cena 3D passando pela 2ª cena. Então, apesar de eu ter apenas de renderizar um quad com 10 x 10 pixels, isso renderiza o resto da canvas.

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

Então eu troco buffers

Aqui está a ordem do meu código. É como se faz o espaço 3D, em seguida, faz o espaço 2d, que por sua vez, anula o espaço 3D.

Demorou um pouco para descobrir isso, para o caso de os outros terem os mesmos problemas:

  ...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... 

🙂

Se você estiver cobrindo uma projeção 2D orto sobre 3D, geralmente quer tirar o buffer de profundidade da equação:

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

Claro, você vai querer redefini-los para seus valores originais antes de fazer sua próxima passagem em 3D.

 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; 

Note que não há necessidade de lidar com Push / Pop de matrizes se você renderizar 2D completamente no topo do 3D.