Hintergrund-Objekt gezeichnet wird, vor dem Vordergrund-Objekt in OpenGL?
Für Testzwecke nehmen wir an, ich habe ziehe 2 Teekannen mit glutSolidTeapot()
wie diese:
glColor3f(1.0f, 0.0f, 0.0f); //Red teapot
glutWireTeapot(1.0f);
glColor3f(0.0f, 1.0f, 0.0f); //Green teapot
glTranslatef(0.0f, 0.0f, 3.0f);
glutWireTeapot(1.0f);
Die Kamera zunächst an (x,y,z) = (0.0f, 0.0f, 5.0f)
und ich freue mich auf z = -1
(das ist Kamera-position #1). Ich bin sicher, Sie verstehen, dass die grüne Teekanne ist das nächstgelegene Objekt an der Kamera und die rote ist dahinter. Das problem ist, dass die rote gezogen wird, wie es vor den grünen, die nicht richtig Aussehen:
Beispiel: http://i.stack.imgur.com/8WoEn.png
Nun, wenn ich die Kamera bewegen zu (x,y,z) = (0.0f, 0.0f, -5.0f)
und schauen z = 1
(dies ist die position der Kamera #2), will ich sehen, die rote Teekanne vor dem grün ein, dieses Verhalten ist normal. Das rot ist jetzt das Objekt der Kamera am nächsten und die grünen hinter den roten. Alles ist in Ordnung.
Beispiel: http://i.stack.imgur.com/eJvPE.png
Ich weiß, das hat etwas zu tun mit der Ordnung, wenn ich wechseln den code oben (grün Teekanne code first), als es behebt das problem in der Kamera position #1, aber das problem wird jetzt sichtbar in die Kamera position #2.
Warum ist das passiert und wie kann ich die Objekte hinter anderen Objekten aus gezeichnet wird vor, oder bei allen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie reservieren einen depth-buffer (wirst du wahrscheinlich dies bereits tun), und verwenden Sie dann
glEnable(GL_DEPTH_TEST)
Dies ist passiert, weil ohne Tiefe, Prüfung, OpenGL tut sich einfach nicht reagieren auf unterschiedliche tiefen in Bezug auf die Kamera. Wenn Sie aktivieren die Tiefe, Prüfung, GL lehnt alle neuen Pixel/Fragmente, die weiter Weg sind als die der aktuellen am nächsten kommt.
Wenn Sie wollen, sich zu bewegen in der Szene, die Sie wahrscheinlich wollen, um klar die Tiefe durch Zugabe von
GL_DEPTH_BUFFER_BIT
zuglClear
oder andere wird es erinnern, die nächste fragment aus dem vorherigen frame.Andere als das, die Perspektive matrix möglicherweise fehlerhaft. Dies ist besonders wahrscheinlich, da die rote Teekanne gezeichnet wird vor dem grün, während Sie ziehen Sie Sie so, dass die grünen würden überziehen das rote mit den richtigen tiefenpufferung. Also, die Tiefe, die Werte selbst sind wohl schlecht.
GL_DEPTH_TEST
. Und falls es einen Unterschied macht, bin ich auch mit diesem:glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
. Was fehlt mir dann?GLUT_DEPTH
sollten sicherstellen, dass ein depth-buffer reserviert ist. Ok, was ist seltsam, ist, dass rot gezeichnet, über grün, auch tho Sie zeichnen Sie in dieser Reihenfolge. Möglicherweise ist Ihr Perspektive-Projektion-matrix ist nicht korrekt eingerichtet - können Sie nach dem code, der das tut?gluPerspective()
, diezNear
war0.0f
statt1.0f
als ich normalerweise habe. Ich hätte nie gedacht, würde dies dazu führen, dass solche ein problem, ich wollte nur zu verringern, die nahe clipping-Ebene.Wahrscheinlich haben Sie noch nicht aktiviert Depth-Buffer aka z-Puffer.
Um dies zu tun in der Initialisierungs-Teil fügen Sie so etwas wie dieses
Und vor dem Rendern jedes Frames Sie haben, deaktivieren Sie diese Puffer auch mit
Konnte man überprüfen Nehe OpenGL Tutorials für mehr Informationen http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=01