2015-06-27 2 views
5

Ich habe ein paar Objekte in der Szene und selbst wenn ich angeben, dass das Objekt A y = 10 (das höchste Objekt), von der TOP-Kamera habe ich die unteren Objekte durch das Objekt A. Hier ist ein Bild von meiner Szene.Beeinflusst die Zeichenreihenfolge die Position der Objekte in der Tiefe? (Bilder enthalten)

enter image description here

Und erst heute habe ich eine interessante Eigenschaft gefunden, die Reihenfolge der Modelle Angelegenheiten ziehen, kann ich mich irren. Hier ist ein anderes Bild, wo ich die Zeichnungsreihenfolge von "ship1" ändern, Aufmerksamkeit: "ship1" ist weit unter meiner Szene, wenn ich zuerst ship1.draw(); mache, verschwindet das Schiff (korrekt), aber wenn ich ship1.draw(); im letzten mache, erscheint er auf oben (falsch).

enter image description here

Video: Opengl Depth Problem video

  • Q1) Ist die Zeichnungsreihenfolge immer eine Rolle?
  • Q2) Wie behebe ich das, sollte ich die Zeichenreihenfolge jedes Mal ändern, wenn ich die Kameraposition ändere?

bearbeiten: Ich habe auch meine Klasse perspektivische Projektion mit dem GLM-Bibliothek verglichen, nur um sicherzugehen, dass es ist nicht das Problem mit meiner Projektion Matrix. Alles ist richtig.

Edit1: ich mein Projekt auf git haben: Arkanoid git repository (Fenster, Projekt ist bereit, auf jedem Computer laufen mit VS installiert)

EDIT2: Ich benutze Normalen oder Textur dont. Nur Eckpunkte und Indizes.

Edit3: Gibt es ein Problem, wenn jedes Objekt in der Szene Scheitelpunkte aus derselben Datei verwendet (teilt)?

Edit4: Ich habe auch meine Perspective Projection Werte geändert. Ich hatte nahe Ebene bei 0.0f, jetzt habe ich nahe = 20.0f und weit = 500.0f, Winkel = 60º. Aber nichts ändert sich, Ansicht tut aber die Tiefe nicht. =/

Edit5: Hier sind meine Vertex und Fragment Shader.

Edit6: Kontaktieren Sie mich jederzeit, ich bin hier den ganzen Tag, so fragen Sie mich etwas. Im Moment überschreibe ich alle Projekte von Null. Ich habe zwei Würfel, die gut, einen vor dem anderen, rendert. Minenklasse bereits hinzugefügt für: Kamera, Projektionen, Handler für Shader. Zu Klasse wechseln, die Objekte erstellt und zeichnet.

// Vertex shader 

in vec4 in_Position; 
    out vec4 color; 
    uniform mat4 Model; 
    uniform mat4 View; 
    uniform mat4 Projection; 

    void main(void) 
    { 
     color = in_Position; 
     gl_Position = Projection * View * Model * in_Position; 
    } 

// Fragment shader 

     #version 330 core 
    in vec4 color; 
    out vec4 out_Color; 
    void main(void) 
    { 
     out_Color = color; 
    } 

Einige Code:

void setupOpenGL() { 
    std::cerr << "CONTEXT: OpenGL v" << glGetString(GL_VERSION) << std::endl; 
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 
    glDepthMask(GL_TRUE); 
    glDepthRange(0.0, 1.0); 
    glClearDepth(1.0); 
    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 
    glFrontFace(GL_CCW); 
} 

    void display() 
{ 
    ++FrameCount; 
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    renderScene(); 
    glutSwapBuffers(); 
} 
void renderScene() 
{ 
    wallNorth.draw(shader); 
    obstacle1.draw(shader); 
    wallEast.draw(shader); 
    wallWest.draw(shader); 
    ship1.draw(shader); 
    plane.draw(shader); 
} 
+2

Haben Sie einen Tiefenpuffer? Depthtest aktiviert? –

+0

Ja. Vor jedem Rahmen mache ich das: 'glClearColor (0,1f, 0,1f, 0,1f, 1,0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ' Dann starte ich am Anfang des Programms einmal diese: ' glEnable (GL_DEPTH_TEST); \t glDepthFunc (GL_LEQUAL); \t glDepthMask (GL_TRUE); \t glDepthRange (0,0, 1,0); \t glClearDepth (1.0); ' –

+1

Und Sie haben einen Tiefenpuffer angefordert, indem Sie' GLUT_DEPTH' in die Flags eingefügt haben, die an 'glutInitDisplayMode()' übergeben wurden? –

Antwort

7

ich das Repository geklont haben Sie verknüpft haben, um zu sehen, ob das Problem woanders lag.In Ihrer letzten Version der Object3D :: Draw-Funktion sieht wie folgt aus:

glBindVertexArray(this->vaoID); 

    glUseProgram(shader.getProgramID()); 
    glUniformMatrix4fv(this->currentshader.getUniformID_Model(), 1, GL_TRUE, this->currentMatrix.getMatrix()); // PPmat é matriz identidade 
    glDrawElements(GL_TRIANGLES, 40, GL_UNSIGNED_INT, (GLvoid*)0); 
    glBindVertexArray(0); 
    glUseProgram(0); 

    glClear(GL_DEPTH_BUFFER_BIT); <<< clears the current depth buffer. 

Die letzte Zeile löscht nach jedem Objekt den Tiefenpuffer, der gezogen wird, was bedeutet, dass das gezogene nächste Objekt ist nicht richtig verschlossen. Sie sollten den Tiefenpuffer nur einmal pro Frame löschen.

+1

Ich würde auch vorschlagen, 'GL_LESS' anstelle von' GL_LEQUAL' für den Tiefentest zu verwenden, da die Reihenfolge der beiden Objekte gleich ist. – n0rd

+1

GL_LEQUAL könnte nützlich sein, wenn die gleiche Fläche mehrmals getönt wird, zum Beispiel Abziehbilder oder Mehrfache Pass Beleuchtung. Aber in diesem Fall ist es wahrscheinlich eine gute Idee, GL_LESS zu verwenden. –

+2

@ n0rd Die Zeichenreihenfolge ist für beide Vergleichsfunktionen wichtig, wenn die Tiefe gleich ist. Es ist nur so, dass für 'GL_LESS' der erste gewinnt und für' GL_LEQUAL' der letzte gewinnt. –

Verwandte Themen