2015-06-27 32 views
5

Ho alcuni oggetti sulla scena e anche se specifichi che l'oggetto A ha y = 10 (l'oggetto più alto), dalla fotocamera TOP posso vedere gli oggetti in basso attraverso l'oggetto A. Ecco qui un'immagine dalla mia scena.L'ordine di disegno influisce sulla posizione degli oggetti in profondità? (immagini incluse)

enter image description here

e solo oggi ho trovato un'interessante struttura ordine di modelli questioni disegnare, posso sbagliarmi. Ecco un'altra immagine in cui cambio l'ordine di disegno di "ship1", attenzione: "ship1" è il modo in cui metto la mia scena, se faccio prima ship1.draw();, la nave scompare (corretta), ma se faccio ship1.draw(); in ultimo, appare su inizio (errato).

enter image description here

Video: Opengl Depth Problem video

  • Q1) Se l'ordine di visualizzazione importa sempre?
  • Q2) Come posso risolvere questo problema, devo cambiare l'ordine di disegno ogni volta che cambio la posizione della fotocamera?

Edit: Ho anche confrontato la mia classe di proiezione prospettica con la libreria glm, giusto per essere sicuri che non E'il problema con la mia matrice di proiezione. Tutto è corretto.

Edit1: ho il mio progetto su git: Arkanoid git repository (finestre, il progetto è pronto per essere eseguito in qualsiasi computer con installato VS)

Edit2: Io non uso normali o texture. Solo vertici e indici.

Edit3: C'è un problema, se ogni oggetto sulla scena utilizza (condivide) vertici dallo stesso file?

Edit4: Ho anche modificato i valori di Proiezione prospettica. Avevo un piano vicino a 0.0f, ora ho near = 20.0f e lontano = 500.0f, angle = 60º. Ma nulla cambia, la vista non è la profondità. =/

Edit5: Ecco i miei ombreggiatori di vertici e frammenti.

Edit6: contattami in qualsiasi momento, sono qui tutto il giorno, quindi chiedimi qualsiasi cosa. Al momento sto riscrivendo tutto il progetto da zero. Ho due cubi che rendono bene, uno di fronte all'altro. Ho già aggiunto la lezione di mine per: macchina fotografica, proiezioni, handler per shader. Passare a Class che crea e disegna oggetti.

// 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; 
    } 

Alcuni codice:

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

Avete un buffer di profondità? Test di profondità abilitato? –

+0

Sì. Prima di ogni fotogramma faccio questo: 'glClearColor (0.1f, 0.1f, 0.1f, 1.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ' Quindi, all'inizio del programma eseguo una volta queste: ' glEnable (GL_DEPTH_TEST); \t glDepthFunc (GL_LEQUAL); \t glDepthMask (GL_TRUE); \t glDepthRange (0.0, 1.0); \t glClearDepth (1.0); ' –

+1

E hai richiesto un buffer di profondità includendo' GLUT_DEPTH' nei flag passati a 'glutInitDisplayMode()'? –

risposta

7

Ho clonato il repository è stato collegato per vedere se il problema è stato situato da qualche altra parte.Nel suo più recente versione della funzione Object3D :: draw si presenta così:

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. 

L'ultima riga cancella il buffer di profondità dopo ogni oggetto che viene disegnata, il che significa che l'oggetto successivo disegnato non è occluso correttamente. Dovresti solo cancellare il buffer di profondità una volta ogni frame.

+1

Suggerisco anche di usare 'GL_LESS' per il test di profondità invece di' GL_LEQUAL' come per l'ultimo ordine di estrazione (quando due oggetti hanno la stessa profondità) – n0rd

+1

GL_LEQUAL può essere utile quando si ombreggia la stessa superficie più volte, ad esempio decalcomanie o più passare l'illuminazione. Ma in questo caso è probabilmente una buona idea usare GL_LESS. –

+2

@ n0rd L'ordine di disegno è valido per entrambe le funzioni di confronto se la profondità è uguale. È solo per 'GL_LESS', il primo vince, e per' GL_LEQUAL' vince l'ultimo. –