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)
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).
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);
}
Haben Sie einen Tiefenpuffer? Depthtest aktiviert? –
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); ' –
Und Sie haben einen Tiefenpuffer angefordert, indem Sie' GLUT_DEPTH' in die Flags eingefügt haben, die an 'glutInitDisplayMode()' übergeben wurden? –