J’ai mis en place une scène 3D en mouvement et je souhaite créer une superposition d’interface graphique fixe en 2D toujours au-dessus. Lorsque j’essaie de créer des formes en 2D, je ne vois rien. Quand j’appelle: glMasortingxMode (GL_PROJECTION); ma scène 3d disparaît et je rest avec une fenêtre vierge …
voici le code que j’utilise pour la superposition
EDIT: code mis à jour
glMasortingxMode(GL_MODELVIEW); glLoadIdentity(); glMasortingxMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-100, 100, -100, 100); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glColor3f(1, 1, 1); glPushMasortingx(); glBegin(GL_QUADS); glVertex3f(-5.0f, 5.0f, 0.0f); glVertex3f(-5.0f, -5.0f, 0.0f); glVertex3f(5.0f, -5.0f, 0.0f); glVertex3f(5.0f, 5.0f, 0.0f); glEnd(); glPopMasortingx(); glEnable(GL_DEPTH_TEST); glutSwapBuffers();
Vous devez dessiner votre quad dans l’autre ordre. Par défaut, OpenGL utilise des polygones dans le sens contraire des aiguilles d’une montre. Cela signifie que vous ne voyez pas votre polygone car vous ne voyez que sa face arrière.
Vous pouvez jeter un oeil à glFrontFace .
MODIFIER:
De plus, si cela ne fonctionne pas, vous pouvez essayer de désactiver les états suivants:
glMasortingxMode(GL_MODELVIEW); glLoadIdentity(); glMasortingxMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-100, 100, -100, 100); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_BLENDING); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING);
Vous voudrez peut-être utiliser glPushAtsortingb
et glPopAtsortingb
pour ne pas gâcher votre état.
Hmm … En me basant sur le fragment de code que vous avez posté, je pense que votre scène disparaît à cause de ce que vous faites avec vos masortingces – ça me semble un peu chaotique. L’approche devrait ressembler à ceci:
Pensez également à passer aux shaders (et à une version OpenGL moderne en général) si vous souhaitez vous simplifier la vie :).
glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glMasortingxMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-100, 100, -100, 100); glMasortingxMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(1, 1, 1); glBegin(GL_QUADS); glVertex3f(20.0f, 20.0f, 0.0f); glVertex3f(20.0f, -20.0f, 0.0f); glVertex3f(-20.0f, -20.0f, 0.0f); glVertex3f(-20.0f, 20.0f, 0.0f); glEnd(); /// Now swap buffers
De plus, j’utilise également un FBO séparé pour ce genre de choses. Généralement, la superposition ne doit pas nécessairement être redessinée en permanence, alors transmettez-la à la demande à un FBO et transmettez-la simplement en quadrant plein écran à chaque image. Cela gaspille un peu de remplissage mais en général, je trouve que c’est généralement plus rapide et rend le code tellement plus propre.
Assurez-vous que votre géomésortinge (en particulier les coordonnées z de votre géomésortinge, en termes de votre interface utilisateur 2D) est supérieure au plan proche (derrière le plan proche sur l’axe des z), sinon tout rendu qui se produit devant le plan proche -plan ne sera pas vu. Je suppose que vous avez défini votre sharepoint vue frustré ailleurs dans le code (c’est ici que le plan rapproché est défini).
Si le plan proche est 0.01f, alors vos définitions de vertex pourraient être
glVertex3f(-5.0f, 5.0f, -0.02f); glVertex3f(-5.0f, -5.0f, -0.02f); glVertex3f(5.0f, -5.0f, -0.02f); glVertex3f(5.0f, 5.0f, -0.02f);
Je crois au MasortingxMode( GL_MODELVIEW )
vous regardez toujours dans l’axe -Z. J’espère que ça aide.
Je peux me tromper, mais je pense que DEPTH_TEST
fait référence à la mise en mémoire tampon de votre dernier object rendu. Je ne pense pas que cela désactive la valeur dans le plan rapproché.
' glGetBooleanv(GL_BLEND, &m_origin_blend); glGetBooleanv(GL_DEPTH_TEST,&m_origin_depth); glGetBooleanv(GL_CULL_FACE, &m_origin_cull); setAlphaBlending(true); setDepthTest(false); setCullFace(false); //by stone //ur draw core() setAlphaBlending(m_origin_blend>0?true:false); setDepthTest(m_origin_depth>0?true:false); setCullFace(m_origin_cull>0?true:false); //by stone '