Opengl dessinant une superposition 2D sur un problème de scène 3D

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:

    • nettoyer l’écran
    • 3D:
      • activer l’éclairage, le test z, etc.
      • définir le mode masortingce active sur projection
      • charger l’identité et établir une projection en perspective
      • remet le mode masortingce active à modelview
      • dessiner tout en 3D
    • 2D:
      • désactiver l’éclairage, le test z, etc.
      • définir le mode masortingce active sur projection
      • charger l’identité et établir une projection ortogonale
      • remet le mode masortingce active à modelview
      • dessiner tout en 2D
    • permuter les tampons

    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 '