2016-04-14 6 views
1

Also ich habe eine 3D-openGL-Anwendung und ich wollte ein 2D-HUD anzeigen, verstehe ich das grundlegende Konzept, wie dies nach viel googeln, aber nichts, was ich versuche, es zeigt sich. Mein aktueller Code nach vielen anderen Beispielen gehen vorbei ist dies:OpenGL 2D HUD zeigt nicht

// HUD /////////////////////////////////// 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, (GLdouble)WIDTH, (GLdouble)HEIGHT, 0, -1, 1); 
    glDisable(GL_DEPTH_TEST); 
    glDisable(GL_CULL_FACE); 

    glColor3f(1, 1, 1); 
    glPushMatrix(); 
    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(); 
    glPopMatrix(); 
    glEnable(GL_DEPTH_TEST); 
    glDepthMask(GL_TRUE); 

Gerade jetzt nichts visuell ändert, kann ich den ganzen Bildschirm bekommen, um eine Farbe zu löschen, aber selbst dann scheint ich kann nicht einen Quad auf sie zu ziehen .

EDIT:

glDisable(GL_CULL_FACE); 
    glDisable(GL_DEPTH_TEST); 
    glDepthMask(GL_FALSE); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glClear(GL_DEPTH_BUFFER_BIT); 

    glColor3f(1, 1, 1); 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
    glVertex3f(-10.0f, 10.0f, 0.0f); 
    glVertex3f(-10.0f, -10.0f, 0.0f); 
    glVertex3f(10.0f, -10.0f, 0.0f); 
    glVertex3f(10.0f, 10.0f, 0.0f); 
    glEnd(); 
    glPopMatrix(); 

    glEnable(GL_CULL_FACE); 
    glEnable(GL_DEPTH_TEST); 
    glDepthMask(GL_TRUE); 

EDIT 2: SKYBOX CODE

glDisable(GL_CULL_FACE); 
    glDepthFunc(GL_LEQUAL); // Change depth function so depth test passes when values are equal to depth buffer's content 
    skyShader.Bind(); 
    view = glm::mat4(glm::mat3(camera.GetViewProjection())); // Remove any translation component of the view matrix 
    glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "view"), 1, GL_FALSE, glm::value_ptr(view)); 
    glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "projection"), 1, GL_FALSE, glm::value_ptr(projection)); 
    // SKYBOX CUBE ///////////////////////////////// 
    glBindVertexArray(skyboxVAO); 
    glActiveTexture(GL_TEXTURE0); 
    glUniform1i(glGetUniformLocation(skyShader.getProg(), "skybox"), 0); 
    glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture); 
    glDrawArrays(GL_TRIANGLES, 0, 36); 
    glBindVertexArray(0); 
    glDepthFunc(GL_LESS); // Set depth function back to default 
+1

Sie zeichnen nur 5 Pixel in der oberen linken Ecke Ihres Bildes, die anderen 3/4 Ihres Quads sind außerhalb des Frustums. – derhass

+0

@derhass Vielleicht bin ich nur dumm, aber ich folge nicht, ich habe die Eckwerte geändert, aber sehe immer noch nichts. – thesyncer

+0

Geändert zu was? – derhass

Antwort

3

Ich bin nicht sicher, was HEIGHT und WIDTH gesetzt sind, so habe ich nur 100 für beide. Als ich den von Ihnen geposteten Code ausgeführt habe, kann ich Ihr Quad in der oberen linken Ecke des Bildschirms sehen.

Was ich empfehlen würde, ist einfach Ihren HUD-Code, bis Sie verstehen, was passiert.

Zum Beispiel:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glPushMatrix(); 
glBegin(GL_QUADS); 
glVertex3f(-0.5f, 0.5f, 0f); 
glVertex3f(-0.5f, -0.5f, 0f); 
glVertex3f(0.5f, -0.5f, 0f); 
glVertex3f(0.5f, 0.5f, 0f); 
glEnd(); 
glPopMatrix(); 

Da der Rest des GL Zustand ist unverändert, das sollte ein weißes Quad ziehen, die 50% des Bildschirms ausfüllt, in der Mitte positioniert:

default view matrix

Dies ist, weil die Ansicht standardmäßig einen glOrtho Aufruf, der wie folgt aussieht:

glOrtho(-1f, 1f, -1f, 1f, -1f, 1f); 

Jetzt stellen wir WIDTH und HEIGHT auf 10f. Dies ist, was Ihr glOrtho Anruf wäre:

glOrtho(0f, 10f, 10f, 0f, -1f, 1f); 

Dies ist, was gemacht wird:

modified view matrix

Wenn Ihr HEIGHT und WIDTH ist größer, sagen 800x600, dass Quad so klein sein, wäre es wouldn nicht einmal erscheinen.


EDIT: Mit glPushMatrix und glPopMatrix Modifikationen der Model-View und Projektionsmatrizen

zu isolieren Nach der Lektüre mir Ihre Änderungen und Kommentare lassen einige Beispiel-Code hinzufügen, dass ich glaube, zeigt, was Sie wollen.Es funktioniert nicht mit dem Tiefenpuffer umgehen, die was können Sie Probleme verursacht, aber ich wollte es einfach halten und darauf aufbauen, was ich hatte vor:

int width = 500; // window width 
int height = 500; // window height 

// define our GL viewport 
glViewport(0, 0, width, height); 

// setup 3d projection 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glPerspective(60f, width/height, 1f, 50f); 

// setup 3d modelview 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

// move the camera to put the tetrahedron behind the UI element 
glRotatef(135f, 0f, 0f, 1f); 
glTranslatef(0f, 5f, -30f); 

// draw 3d object (tetrahedron) 
glBegin(GL_TRIANGLES); 
// triangle 1 
glColor3f(1f, 0f, 0f);   // red 
glVertex3f(0f, 10f, 0f);  // a 
glColor3f(1f, 1f, 0f);   // yellow 
glVertex3f(0f, -10f, -10f);  // b 
glColor3f(0f, 1f, 0f);   // green 
glVertex3f(-10f, -10f, 10f); // c 
// triangle 2 
glColor3f(1f, 0f, 0f);   // red 
glVertex3f(0f, 10f, 0f);  // a 
glColor3f(1f, 0f, 1f);   // purple 
glVertex3f(10f, -10f, 10f);  // d 
glColor3f(1f, 1f, 0f);   // yellow 
glVertex3f(0f, -10f, -10f);  // b 
// triangle 3 
glColor3f(1f, 0f, 0f);   // red 
glVertex3f(0f, 10f, 0f);  // a 
glColor3f(0f, 1f, 0f);   // green 
glVertex3f(-10f, -10f, 10f); // c 
glColor3f(1f, 0f, 1f);   // purple 
glVertex3f(10f, -10f, 10f);  // d 
// triangle 4 
glColor3f(1f, 1f, 0f);   // yellow 
glVertex3f(0f, -10f, -10f);  // b 
glColor3f(1f, 0f, 1f);   // purple 
glVertex3f(10f, -10f, 10f);  // d 
glColor3f(0f, 1f, 0f);   // green 
glVertex3f(-10f, -10f, 10f); // c 
glEnd(); 

// revert to original modelview matrix 
glPopMatrix(); 
// revert to original projection matrix 
glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 

// setup 2d projection 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glOrtho(0f, 1f, 1f, 0f, -1f, 1f); 

// setup 2d modelview 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

// draw the 2d interface 
glBegin(GL_QUADS); 
glColor3f(0.5f, 0.5f, 0.5f); // grey 
glVertex3f(0.05f, 0.05f, 0f); // top-left 
glVertex3f(0.95f, 0.05f, 0f); // top-right 
glVertex3f(0.95f, 0.2f, 0f); // bottom-right 
glVertex3f(0.05f, 0.2f, 0f); // bottom-left 
glEnd(); 

// revert to original modelview matrix 
glPopMatrix(); 
// revert to original projection matrix 
glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 

Dies macht die folgenden:

interface over tetrahedron

Sie werden bemerken, wenn wir Setup die ModelView Matrix für die 2D-Oberfläche verwenden wir diese die Sichtstumpfs zu definieren:

glOrtho(0f, 1f, 1f, 0f, -1f, 1f); 

Dies definiert unseren Ansichtsraum, da oben links 0,0 und unten rechts 1,1 ist. Dadurch können wir Dinge auf dem Bildschirm platzieren, ohne die Größe des Darstellungsbereichs zu berücksichtigen. Wenn wir unsere 2d-Schnittstelle zeichnen, müssen wir nur Werte innerhalb eines Bereichs von 0.0 bis 1.0 angeben, und es wird in das Ansichtsfenster passen.

Wichtig: Sie sollten immer daran denken, dass die Model-View und Projektionsmatrizen sind Stapel. Bevor Sie Änderungen daran vornehmen, denken Sie daran, eine neue Ebene auf den Stapel zu schieben und sie dann wieder zu entfernen, wenn Sie fertig sind. Auf diese Weise können Sie Ihre Änderungen isolieren.

+0

Danke für die eingehende Antwort, Sie haben mir geholfen, einige Punkte besser zu verstehen. Ich habe immer noch Probleme, aber ich habe meinen Code in einer Bearbeitung geändert. Ich konnte sehen, dass ein Quad gezeichnet wird, wenn ich seine z-Position in der Szene positioniere, es verbirgt meine 3D-Objekte, aber ich kann es immer noch Sehe das Quad nicht. Ich denke, dass mein Skybox-Code möglicherweise Tiefenprobleme verursacht, ich habe es auch bearbeitet. – thesyncer

+0

Kannst du einen Screenshot von dem, was du siehst, posten? Das könnte mir helfen, ein bisschen mehr zu verstehen. – Exide

+0

http://i.imgur.com/XaNWM24.jpg mit meiner Skybox auf. http://i.imgur.com/Xm8WbH5.png gedreht Perspektive mit Skybox auskommentiert, das ist ein flacher Quad durch die Mitte der Szene. – thesyncer