Ich denke, das ist eher eine mathematische Frage als eine OpenGL, aber ich schweife ab. Wie auch immer, wenn der ganze Zweck der Teilung der Perspektive darin besteht, brauchbare X- und Y-Koordinaten zu erhalten, warum sollte man z durch w teilen? Auch wie bekomme ich w an erster Stelle?
Tatsächlich hat die Erklärung viel mehr mit den Einschränkungen des Tiefenpuffers zu tun als mit Mathe.
Im einfachsten Fall ist der Tiefenpuffer eine Textur, bei der jedem Bildschirmpixel ein Graustufenwert zugewiesen wird, der von der Entfernung zur Kamera abhängt. So können visuelle Effekte leicht mit der Entfernung verändert werden. Quelle
Genauer gesagt ist ein Tiefenpuffer eine Textur, die für jedes Fragment , wobei gilt:
Im folgenden Diagramm wird die Beziehung zwischen z , w und z / w und n entspricht dem Parameter zNear
, der an gluPerspective
oder eine äquivalente Funktion, und f ist gleich dem Parameter zFar
, der an dieselbe Funktion übergeben wird.
Auf einen Blick sieht dieses System nicht intuitiv aus. Aber als Ergebnis ist z / w immer ein Fließkommawert zwischen 0 und 1 (0 / n und f <) / em> / f ) und kann daher als einzelner Kanal einer Textur dargestellt werden.
Eine zweite wichtige Anmerkung: Der Tiefenpuffer ist nichtlinear, was bedeutet, dass ein Objekt genau zwischen den nahen und fernen Clipping-Ebenen nirgends einen Wert von 0,5 im Tiefenpuffer hat. Wie oben gezeigt, würde dies einem Wert von 0,999 im Tiefenpuffer entsprechen. Je nach Ihrer Ansicht könnte dies gut oder schlecht sein; Vielleicht möchten Sie, dass der Tiefenpuffer detaillierter ist (was er ist), oder sogar ganze Details anbieten (was nicht der Fall ist).
TL; DR: