2017-07-25 3 views
0

Als einfache Demonstration meines Problems Rendering zu Framebuffer, Ich versuche, eine große, aber einfache Masche auf eine Textur zu machen, um später verwendet werden, aber seltsamerweise die weitere Teile, die von der Kamera entfernt sind, werden vor den Kamerateilen angezeigt, wenn sie aus einem bestimmten Winkel betrachtet werden. Trotz der unbestreitbaren Tatsache, dass ich über alle Zweifel erhaben Verwendung gründlichere Prüfung tun:OpenGL Tiefensortierung nicht auf einzelne Masche, wenn anstelle von Bildschirm

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 

Als Beispiel Ich versuche, ein unterteilt Gitter (auf der XZ-Ebene) zu machen Zentriert auf den Ursprung, die mit einem glatten „Hügel“ in der Mitte des Gitters.

Wenn auf dem Bildschirm gerendert keine Fehler auftreten und die Maschen sieht wie folgt aus (gerenderte orthographischer Projektion verwendet und mit der Graustufen-Farbtiefe darstellt, wird kein Fehler Weiterhin auftreten, selbst wenn die Masche von jeder Seite betrachtet wird):

Rendering directly to screen, no errors occur, even when mesh is rotated

auf den Bildschirm Rendering ist natürlich getan, indem sichergestellt wird der Framebuffer auf 0 (glBindFramebuffer(GL_FRAMEBUFFER, 0);) gesetzt ist, aber ich brauche diese Szene zu einem anderen Framebuffer zu machen, die nicht mein Bildschirm ist, um dies zu nutzen zu machen als Textur.
Also ich habe eine andere Framebuffer und eine Ausgang Textur, aufgebaut und jetzt bin ich Redering, diese Szene zu den Framebuffer (mit absolut nichts geändert, außer dem Framebuffer und die Darstellungsgröße, die die Ausgabe Textur anzupassen eingestellt ist). Um den Fehler, den ich gerade erlebe, zu demonstrieren, rendere ich dann diese gerenderte Textur auf eine Ebene, die dann auf dem Bildschirm angezeigt wird. Wenn das Gitter von der positiven x - Achse gedreht und um die y - Achse gedreht wird, zentriert auf seinem Ursprung zwischen -0,5 π rad und 0,5 π rad, sieht die gerenderte Textur genau identisch mit dem Ergebnis beim Rendern auf Bildschirm, wie auf dem Bild oben zu sehen. Wenn jedoch die Rotation um die y-Achse größer als 0,5 π rad oder kleiner als -0,5 π rad ist, wird der kuppelnahe Hügel hinter der weiter weg von der Kamera liegenden Ebene gerendert (Fakt dass der Hügel an der Kamera näher ist, kann durch betrachten der Farbe nachgewiesen werden, die debth darstellt):

enter image description here

(hoppla bekam den Titel falsch auf dem Fenster, ignorieren, dass)

In der Grenzflächen mit einer Rotation um die y-Achse von etwa 0,5 π rad oder -0,5 π rad sieht die Szene so aus.

enter image description here

(hoppla den Titel falsch auf dem Fenster stand wieder, ignorieren, dass wieder)

rekapitulieren. Dieser Fehler bei der Tiefensortierung tritt nur auf, wenn mit einem Framebuffer in eine Textur gerendert wird, und nur dann, wenn das Objekt von einem bestimmten Winkel aus betrachtet wird. Wenn das Objekt direkt auf dem Bildschirm gerendert wird, tritt kein Fehler auf. Meine Frage ist deshalb: Warum passiert das und wie (wenn überhaupt) vermeide ich es zu vermeiden.

+0

Das erste Bild ... sieht nicht wie eine orthographische Projektion aus. Es sieht für mich wie eine perspektivische Projektion aus. –

Antwort

1

Wenn dieses Problem tritt nur auf, wenn Sie auf die Textur Framebuffer rendern, Sie haben wahrscheinlich nicht eine Tiefe Bindung an sie richtig verbunden.

Stellen Sie sicher, dass Sie während der FBO-Init auch mit einer Tiefenstruktur verknüpfen. Es gibt ein gutes Beispiel dafür, wie man das macht here.

Überprüfen Sie auch alle Matrizen, die Sie zum Rendern verwenden - ich hatte mehrere Fälle in der Vergangenheit, wo unsaubere Matrizen Tiefenberechnungen abgeworfen haben.

+0

Es war die Tiefe Textur/Puffer, die nicht mit dem rechten Framebuffer verbunden war. – Nikolaj

Verwandte Themen