18 Stimmen

Opengl: 2d HUD über 3D

Ich habe mir einige der hier gestellten Fragen zu diesem Thema angesehen und kann immer noch nicht herausfinden, warum mein 2D-HUD angezeigt wird, aber meine gerenderte 3D-Welt verschwindet.

EDIT: Es scheint, dass die 2D-Szene die Kontrolle über den gesamten Bildschirm übernimmt, so dass ich hin und wieder sehen kann, wie die 3D-Szene durch die 2D-Szene hindurchflackert. Also, auch wenn ich seine nur ment zu sein Rendering ein Quad thats 10 x 10 Pixel es rendert diese dann blanks out den Rest des Bildschirms.

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

Dann tausche ich die Puffer

Hier ist die Reihenfolge meines Codes. Seine wie es macht die 3D-Raum dann macht die 2D-Raum, die wiederum den 3D-Raum aufhebt.

0 Stimmen

Was ist der Unterschied zwischen SCREEN_WIDTH y x (verwendet in glViewport )? Wenn Sie die letzten sechs Zeilen auskommentieren, aber das 2D-Setup beibehalten, verschwindet die 3D-Darstellung dann immer noch? Können Sie die Ursache auf eine Zeile oder einen Befehl eingrenzen, die bzw. der die 3-D-Darstellung beeinträchtigt?

0 Stimmen

@Ben Voigt: Wenn ich die letzten 6 Zeilen (beginnend mit glbegin()) auskommentiere, erscheint das 3D-Rendering immer noch nicht. SCREEN_WIDTH und X sind das gleiche, ich habe zwei vars gemacht ohne es zu merken und habe es noch nicht aufgeräumt.

0 Stimmen

Ok, kommentieren Sie den 2-D-Setup-Code weiter aus, bis die 3-D-Welt zurückkommt. Entweder eine Zeile nach der anderen oder benutze eine binäre Suche, um zu teilen und zu erobern. Wahrscheinlich ändern Sie den OpenGL-Status, von dem der 3D-Code annahm, dass er in der Standardeinstellung belassen wurde, wie z. B. Texturierung oder ein Shader oder etwas Ähnliches.

37voto

Elgoog Punkte 2155

Es hat eine Weile gedauert, bis ich es herausgefunden habe, also nur für den Fall, dass andere die gleichen Probleme haben:

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

:)

7voto

geofftnz Punkte 9606

Wenn Sie eine 2D-Orthoprojektion über eine 3D-Projektion legen, möchten Sie in der Regel den Tiefenpuffer aus der Gleichung herausnehmen:

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

Natürlich müssen Sie diese Werte vor dem nächsten 3D-Durchlauf wieder auf ihre ursprünglichen Werte zurücksetzen.

3voto

Kromster Punkte 6953
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;

Beachten Sie, dass es keine Notwendigkeit gibt, Push/Pop von Matrizen zu behandeln, wenn Sie 2D vollständig auf 3D rendern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X