Aktualnie programuję mały silnik 3D i zastanawiałem się, dlaczego powinienem użyć współrzędnych przestrzeni oczu w module cieniowania fragmentów. Aby to zrobić, muszę umieścić moją matrycę kamery w mundurze, aby przekształcić pozycje światła we współrzędnych oczka i macierz camera_normal, aby umieścić kierunki światła we współrzędnych oka. Dlaczego wszyscy używają tych współrzędnych? Nie widzę żadnej przewagi, więc jeśli mógłbyś pomóc mi zrozumieć ten wybór, byłbym wdzięczny. Dzięki :)dlaczego powinniśmy używać współrzędnych przestrzeni oczu podczas etapu fragmentacji w potoku OpenGL?
Odpowiedz
Istnieje kilka powodów służy oko-space:
- Jest to wygodne. Jest to dobrze zdefiniowana przestrzeń, która istnieje, i którą oblicza się na drodze do transformacji pozycji.
- Ma taką samą skalę jak przestrzeń światowa, ale nie ma problemów z przestrzenią światową. Przestrzeń oczu jest zawsze (względnie) bliska zeru (ponieważ oko jest na poziomie 0), więc jest to rozsądna przestrzeń dla posiadania jawnej macierzy przekształceń. Skala jest ważna, ponieważ możesz podać odległości (takie jak warunki tłumienia światła), które są obliczane w przestrzeni świata. Odległości nie zmieniają się w przestrzeni oczu.
- Musisz mimo wszystko przekształcić go w przestrzeń liniową. Robienie oświetlenia, szczególnie przy attentuacji, w nieliniowej przestrzeni, takiej jak przestrzenie post-projekcyjne, jest ... trudne. Musiałbyś więc dostarczyć normalne i pozycje w jakiejś liniowej przestrzeni, więc równie dobrze może być przestrzenią oczu.
- Wymaga to najmniejszej liczby transformacji. Przestrzeń oczu to przestrzeń tuż przed transformacją projekcji. Jeśli musisz odwrócić przekształcenie do przestrzeni liniowej (na przykład odroczone renderowanie), przestrzeń oczna to taka, która wymaga najmniejszej liczby operacji.
Nie musisz dostarczać matrycy kamery do modułu cieniującego i wykonywać tam transformację położenia światła i kierunku. W rzeczywistości jest to raczej nieefektywne, ponieważ robimy te same operacje na tych samych numerach raz za razem dla każdego wierzchołka.
Po prostu przekształć pozycję światła i kierunek strony procesora i dostarczaj łatwo przekształcalnych parametrów światła do modułu cieniującego. Jednak obliczenia oświetlenia są jeszcze bardziej zwięzłe w przestrzeni oka, szczególnie jeśli chodzi o normalne mapowanie. Ale i tak musisz przekształcić wszystko w przestrzeń widzenia, ponieważ normalne nie są transformowane przez transformację perspektywy (chociaż pozycje wierzchołków mogą zostać bezpośrednio przekształcone w przestrzeń klipu).
- 1. Dlaczego powinniśmy używać lua_pushinteger()?
- 2. Kiedy i dlaczego powinniśmy używać klasy System.ComponentModel.Container?
- 3. Kiedy powinniśmy (naprawdę) używać RenderScript?
- 4. Dlaczego powinniśmy używać tylko "static" w klasie lub funkcji (C++)?
- 5. Czy powinniśmy używać Fakera w Rails Factories?
- 6. Czy powinniśmy używać personów w historiach użytkowników?
- 7. Czy powinniśmy używać ScalaSignature bezpośrednio?
- 8. Dlaczego warto używać wielu kontekstów OpenGL
- 9. Dlaczego powinniśmy używać zakodowanych ui, gdy mamy Specflow?
- 10. dlaczego powinniśmy używać funkcji subscribe() over map() in angle2?
- 11. Dlaczego powinniśmy używać klas, a nie rekordów lub odwrotnie?
- 12. Kiedy powinniśmy używać klasy, a kiedy nie powinniśmy
- 13. Kiedy powinniśmy używać dostawcy w Java 8?
- 14. OpenGL: Wyświetlanie współrzędnych przestrzeni widoku z NDC, pozornie poza zakresem [-1,1]
- 15. Jak używać `jq` w powłoce potoku?
- 16. Czy powinniśmy używać jQuery z AngularJS?
- 17. Dlaczego String.split wymaga separatora potoku?
- 18. Kodowanie przeniesienia fragmentacji - zachowanie przeglądarki
- 19. Dlaczego indeks fragmentacji podcinania poza zasięgiem działa w języku Python?
- 20. Dlaczego dzielę Z przez W w rzucie perspektywicznym w OpenGL?
- 21. Dlaczego powinniśmy zadeklarować interfejs wewnątrz klasy?
- 22. wymiary załadowanego etapu swf
- 23. Powinniśmy używać dbref lub osadzonego dokumentu w ciężkiej aplikacji czytającej
- 24. Współrzędne ekranu Android OpenGL ES 2.0 do współrzędnych światowych
- 25. układ współrzędnych oświetlenia per-fragment
- 26. jak używać przestrzeni nazw Yii
- 27. Układ współrzędnych grafiki rdzenia
- 28. „czytać” nie limit czasu podczas czytania z potoku w bash
- 29. Błąd podczas konfigurowania potoku przetwarzania akcji
- 30. Dlaczego warto używać QObject :: setObjectName()?