L’ordine di disegno influisce sulla posizione degli oggetti in profondità? (immagini incluse)

Ho alcuni oggetti sulla scena e anche se specificassi che l’object A ha y = 10 (l’object più alto), dalla fotocamera TOP posso vedere gli oggetti in basso attraverso l’object A. Ecco un’immagine dalla mia scena.

inserisci la descrizione dell'immagine qui

E solo oggi ho trovato una proprietà interessante che attira l’ordine dei modelli, potrei 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 ship1.draw(); prima, la nave scompare (corretta), ma se faccio ship1.draw(); in ultimo, appare in alto (errato).

inserisci la descrizione dell'immagine qui

Video : Opengl Depth Problem video

  • Q1) L’ordine di pesca è sempre importante?
  • Q2) Come posso risolvere questo problema, dovrei cambiare l’ordine di disegno ogni volta che cambio la posizione della fotocamera?

Edit : Ho anche confrontato la mia class di Perspective Projection con la glm library, solo per essere sicuro che non è il problema con la mia proiezione Matrix. Tutto è corretto.

Edit1 : Ho il mio progetto su git: Arkiteid git repository (windows, il progetto è pronto per essere eseguito su qualsiasi computer con VS installato)

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

Edit3 : C’è un problema, se ogni object sulla scena usa i vertici (condivisi) dallo stesso file?

Edit4 : ho anche modificato i miei 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 shader Vertex e Fragment.

Modifica6 : 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; } 

Qualche 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); } 

Ho clonato il repository che hai collegato per vedere se il problema si è verificato altrove. Nella tua versione più recente la funzione Object3D :: draw ha il seguente aspetto:

  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 object che viene disegnato, il che significa che il prossimo object disegnato non è occluso correttamente. Dovresti solo cancellare il buffer di profondità una volta ogni frame.