2014-04-25 8 views
6

Ich habe ein Projekt, an dem ich arbeite, das Filme aus einer Simulation macht. Die Simulation wird von einem anderen Programm übergeben, das die Projektionsmatrix definiert.Zunehmende Tiefenpufferpräzision weit von der Kamera entfernt

Das Problem, das ich in laufen lasse, ist, dass das andere Programm eine Art ‚fake‘ orthogonale Ansicht hat, was ich damit meine ist, dass seine Projektionsmatrix wie folgt:

PerspectiveMatrix = glm::perspective(3.5, 1, 1.0f, 50.0f); 

Und es nutzt die LookAt Funktion:

ViewMatrix = glm::lookAt(
    (2000,-3000,2000), // eye 
    (0,0,0), // center 
    (0,0,1)//up 
); 

Also, was ich damit meine ‚fake‘ orthographische Ansicht ist, dass sie die Kamera weit genug weg positioniert haben (und kleine Winkel um die Szene zu vergrößern), dass die „Sichtlinien“ (mangels einem besserer Ausdruck) sind fast parallel wie in einer echten orthographischen Projektion.

Also das ist alles gut und gut, aber was ich gerannt bin, und ist ein Problem in der anderen Programm auch, ist, dass alle der Hochpräzisionsprüfung Tiefe ist nah an der Kamera und in meinem Fall ist dies Freiraum. Das bedeutet, dass es eine ganze Menge von z Kämpfen wie in der unten stehenden Link dargestellt:

    Screenshot

Also meine Frage ist, welche Art und Weise kann ich meine gründlichere Prüfung ändern, um vielleicht den Puffer Ausrichtung auf die weites Flugzeug? oder etwas in dieser Richtung. Ich habe versucht, den NearPlane weiter nach außen zu bewegen, was dazu führt, dass der Bildschirm verkleinert wird, also kompensiere ich mit einem engeren Winkel in der Perspektive. Aber wenn man so oft macht, verschlimmert sich das Problem, da wird nicht gekämpft, aber die Dinge werden nicht in der richtigen Tiefe gezeichnet. Die Kugeln enden oben auf allem.

habe ich einige Infos bei Outerra finden: http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html Sie zum Umkehren des Tiefenpuffers einige Ideen hatten, aber es war Nvidia spezifischen und ich brauche sowohl mit ATI und Nvidia

+0

Warum bewegen Sie die Kamera nicht näher und verwenden Sie eine echte orthographische Projektion? – Wyzard

+0

Es würde sicherlich die Tiefe Problem allein, das Problem ist, dass mein Programm genauso aussehen muss wie das "Eltern" -Programm. Sie zeigen beide die gleichen Bilder, aber meine schreibt diese in ein AVI anstatt nur eine Vorschau der Szene.Im Wesentlichen der Benutzer eine Vorschau des Bildschirms, um sicherzustellen, dass sie das richtige Ergebnis haben, und dann rufen sie mein Programm, um es in einen Film – user3565590

+0

One-Möglichkeit ist, um die Textur, die Sie zeichnen auf größer. Je größer es ist, desto genauer wird Ihr Ergebnis sein, aber es wird sich erhöhen – Caesar

Antwort

2

Beide logarithmische Tiefe und umgekehrt Tiefe kompatibel sein Mapping beschrieben in dem blog post wird für Sie arbeiten.

Reverse Gleitkomma ist besser, und es funktioniert normal in DirectX. In OpenGL bringt es Ihnen aufgrund eines Konstruktionsfehlers keine zusätzliche Präzision, es sei denn, der Treiber exponiert die Erweiterung NV_depth_buffer_float, durch die Sie den Fehler, der ihn normalerweise unbrauchbar macht, effektiv ausschalten können.

AMD unterstützt diese Erweiterung seit dem 13.12 Catalyst Treiber, so dass die Technik auf allen AMD GPUs der Serie 5000+ verwendet werden kann (ältere Serien werden von den Treibern nicht unterstützt).

2

Einfacher als oben: Bewegen Sie Ihr Znear weiter von der Kamera weg. Sieht so aus, als wäre es der dritte Parameter von glm :: perspective(), in Ihrem Beispiel auf 1.0 gesetzt. Stellen Sie es so groß wie möglich ein, bevor es anfängt, Objekte im Vordergrund Ihrer Szene zu entfernen, und Ihre Präzisionsprobleme mit dem z-Puffer werden wahrscheinlich verschwinden.

Reverse-float-z ist großartig, wird aber nur für Szenen mit einem breiteren Sichtfeld und einer tieferen Geometrie benötigt. Für eine nahezu orthographische Szene wie die deine, setze deinen Znear/Zfar entsprechend.

Verwandte Themen