Sądzę, że jest to raczej pytanie matematyczne, niż pytanie OpenGL, ale dygresja. W każdym razie, jeśli cały cel perspektywy dzieli się na uzyskanie współrzędnych X i Y, po co zawracać sobie głowę dzieleniem Z przez W? W jaki sposób mogę uzyskać w w pierwszej kolejności?Dlaczego dzielę Z przez W w rzucie perspektywicznym w OpenGL?
Odpowiedz
W rzeczywistości wyjaśnienie ma znacznie więcej wspólnego z ograniczeniami bufora głębokości niż z matematyką.
W najprostszym przypadku "bufor głębi jest teksturą, w której piksel na ekranie ma przypisaną wartość skali szarości w zależności od jego odległości od kamery, co pozwala łatwo zmieniać efekty wizualne wraz z odległością." Source
Dokładniej, bufor głębokości tekstury zawierający wartość Z/wagowo dla każdego fragment, gdzie:
- Z jest odległością od najbliższej wycinek płaszczyzny do fragmentu.
- W to odległość od kamery do fragmentu.
W poniższym schematem przedstawiającym zależność pomiędzy Z, wag i Z/wag, n jest równy parametrowi zNear
przekazywany do gluPerspective
lub równoważną funkcję i f jest równy parametrowi zFar
przekazanemu do tej samej funkcji.
Na pierwszy rzut oka, ten system wyglądać nieintuicyjne. Jednak w wyniku tego oo/w zawsze wartość zmiennoprzecinkową między 0 i 1 (0/n i F/f), a zatem mogą być przedstawione w postaci pojedynczego kanału lub tekstura.
Druga ważna uwaga: bufor głębi jest nieliniowy, co oznacza, że obiekt znajdujący się dokładnie pomiędzy bliską a daleką płaszczyzną przycinania jest nigdzie bliski wartości 0,5 w buforze głębokości. Jak pokazano powyżej, korelowałoby to z wartością 0,999 w buforze głębokości. W zależności od widoku może to być dobre lub złe; możesz chcieć, aby bufor głębi był bardziej szczegółowym zbliżeniem (które to jest) lub oferował nawet szczegóły w całym (czego nie ma).
TL, DR:
- podzielić z przez w tak, że zawsze znajduje się w przedziale [0, 1].
- W to odległość od kamery do fragmentu.
Naprawdę nie całkiem zgadzam się z tą odpowiedzią, pytanie dotyczy problemu czysto matematycznego, wyjaśniono tutaj szczegóły implementacji algorytmu opengl i z-buffer (bufor głębi). –
Z w NDC mieści się w zakresie [-1, 1], a nie [0, 1], które jest konwencją DirectX. – SnappleLVR
http: //en.wikipedia.org/wiki/Transformation_matrix # Perspective_projection –
Ma to związek z homogenicznymi współrzędnymi. Ich mapowanie R^3 -> R^4 najwyraźniej nie jest jedno-do-jednego. Współczynnik w może być "zsynchronizowany" do 1. Ale jeden stosujący operator macierzy 4x4 może spowodować zmianę "w". Jeśli dobrze pamiętam, jedną z zalet homogenicznych współrzędnych jest tłumaczenie jako operator liniowy. – Yotam