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)
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).
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);
}
Avete un buffer di profondità? Test di profondità abilitato? –
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); ' –
E hai richiesto un buffer di profondità includendo' GLUT_DEPTH' nei flag passati a 'glutInitDisplayMode()'? –