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
- 1. W modułach cieniujących werteksach OpenGL, co to jest i dlaczego dzielę się przez to?
- 2. Raytracing w OpenGL przez moduł cieniujący Compute
- 3. Testowanie głębokości Z w OpenGL
- 4. numpy dzielę wzdłuż osi
- 5. W jakich sytuacjach warto preferować GDI przez DirectX/OpenGL
- 6. Jak zbudować matrycę z rzutowaniem perspektywicznym (bez interfejsu API)
- 7. Dlaczego ta awaria nie występuje? Czy nie dzielę tutaj przez zero?
- 8. Wykreślanie mapy świata w rzucie prostokątnym daje "punkty nieskończone"
- 9. OpenGL - Renderowanie w teksturę
- 10. Powtarzanie tekstur w OpenGL
- 11. Mapowanie kostki w OpenGL
- 12. OpenGL w systemie Linux: dlopen libGL.so
- 13. Renderowanie ognia w OpenGL
- 14. OpenGL 3.2 w/NSOpenGLView
- 15. Efekty zewnętrzne w OpenGL
- 16. Wypchane zwierzę w OpenGL
- 17. OpenGL VBO w Haskell
- 18. Dlaczego funkcja mieszania OpenGL nie działa w telefonie HTC Desire?
- 19. Dlaczego mój kolor znika, gdy włączam oświetlenie w OpenGL?
- 20. OpenGL: Trójkąty z punktów w nieskończoności
- 21. Pierwsze kroki z OpenGL ... w Androidzie
- 22. Jak korzystać z OpenGL w JavaFX?
- 23. jak zrealizować algorytm Z-Fail w OpenGL?
- 24. Drawing VBO z glDrawArrays działa w OpenGL 2.1, ale nie w OpenGL 3.x
- 25. Kontekst OpenGL Tkinter w Pythonie
- 26. Zmiana przezroczystości tekstury w OpenGL
- 27. CLOD Teksturowanie planety w OpenGL
- 28. Rysunek OpenGL w innym wątku
- 29. Dynamiczna zmiana tekstury w OpenGL
- 30. Jak narysować tło w openGL
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