2016-05-06 26 views
2

Ich musste eine manuelle Perspektive Division auf etwas anderes als gl_Position, wenn ich bemerkte, meine Ergebnisse waren aus, so habe ich einige Experimente gemacht.Manuelle Perspektive Division

Ich habe bemerkt, dass, wenn ich es die Standard-Transformation verwenden lassen, ist die resultierende Tiefenwert (gl_Position.z) korrekt ist:

void main() 
{ 
    gl_Position = MVP *vertexPosition; 
} 

jedoch beim Versuch, die Perspektive Teilung manuell zu tun, der Tiefenwert ist nicht die gleiche, auch wenn es gleichwertig sein soll (?):

void main() 
{ 
    gl_Position = MVP *vertexPosition; 
    gl_Position.xyz /= gl_Position.w; 
    gl_Position.w = 1.0; 
} 

So funktioniert die Perspektive Teilung funktioniert anders in Vulkan? Wenn das so ist, wie?

Der Tiefenbereich für das Ansichtsfenster ist auf [0,1] eingestellt, falls dies Auswirkungen hat.

+1

klingt ein bisschen wie der Unterschied zwischen Perspektive korrekte Interpolation und Screenspace-Interpolation. Das wäre in opengl gleich –

+0

Definiere "ist nicht gleich". Versuchen Sie, einen Gleitkommavergleich zwischen den beiden Fällen durchzuführen? –

Antwort

0

Vulkan hat eine Reihe von Regeln Invarianz, angegeben in Anhang D. Keine dieser Regeln Zustand, dass die festen Funktionsscheitel Nachverarbeitungsschritte in Kapitel 23 wird mit dem Vertexshader versuchen invariant zu tun das gleiche. Daher können Sie nicht erwarten, dass diese beiden Vorgänge zu invarianten Ergebnissen führen.