2014-08-30 10 views
8

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?

+0

http: //en.wikipedia.org/wiki/Transformation_matrix # Perspective_projection –

+0

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

Odpowiedz

12

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.

Diagram illustrating the relationship between *z*, *w*, and *z*/*w*

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.
+4

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). –

+0

Z w NDC mieści się w zakresie [-1, 1], a nie [0, 1], które jest konwencją DirectX. – SnappleLVR