Dlaczego korzystne byłoby posiadanie oddzielnej macierzy projekcyjnej, a jednocześnie połączenie Modelu i macierzy widoku?

Kiedy uczysz się programowania 3D, uczysz się, że najłatwiej jest myśleć w kategoriach 3 macierzy transformacji:

  1. Macierz Modelu . Ta matryca jest indywidualna dla każdego modelu i obraca i skaluje obiekt zgodnie z potrzebami, a następnie przenosi go do ostatecznej pozycji w Twoim świecie 3D. "Matryca modelu przekształca współrzędne modelu na współrzędne świata".

  2. Macierz Widoku . Macierz ta jest zwykle taka sama dla duża liczba obiektów (jeśli nie dla wszystkich) i obraca i przesuwa wszystkie obiekty zgodnie z aktualną "pozycją kamery". Jeśli obrazujesz, że scena 3D jest filmowana przez kamerę, a to, co jest renderowane na ekranie, to obrazy przechwycone przez tę kamerę, lokalizacja kamery i jej kierunek oglądania określają, które części sceny są widoczne i jak obiekty pojawiają się na przechwyconym obrazie. Istnieje niewiele powodów do zmiany matrycy widoku podczas renderowania pojedynczego ramki, ale te w rzeczywistości istnieją (np. renderując scenę dwukrotnie i zmieniając matrycę widoku pomiędzy, możesz stworzyć bardzo proste, ale imponujące lustro w swojej scenie). Zazwyczaj matryca widoku zmienia się tylko raz pomiędzy rysowanymi dwiema klatkami. "Macierz widzenia zmienia współrzędne świata na współrzędne oczu".

  3. Macierz Projekcyjna . Macierz projekcji decyduje o tym, jak te współrzędne 3D są odwzorowywane na współrzędne 2D, np. jeśli istnieje perspektywa stosowane do nich (obiekty stają się mniejsze im dalej od widza) lub nie (rzut ortogonalny). Matryca projekcyjna prawie nigdy się nie zmienia. Może się to zmienić, jeśli renderujesz okno i zmienił się rozmiar okna lub jeśli renderujesz Pełny ekran i zmieniła się rozdzielczość, jednak tylko wtedy, gdy nowy rozmiar okna/rozdzielczość ekranu ma inny współczynnik proporcji wyświetlania niż wcześniej. Istnieje kilka szalonych efektów, które możesz chcieć zmienić tę matrycę ale w większości przypadków to prawie stała dla całego życia programu. "Matryca projekcyjna zamienia współrzędne oczu na współrzędne ekranu".

To ma dla mnie sens. Oczywiście zawsze można połączyć wszystkie trzy macierze w jedną, ponieważ mnożenie wektora najpierw przez macierz A, a następnie przez macierz B jest tym samym, co mnożenie wektora przez macierz C, Gdzie C = B * A.

Teraz, jeśli spojrzeć na klasyczny OpenGL (OpenGL 1.x / 2.x), OpenGL zna matrycę projekcyjną. Mimo to OpenGL nie oferuje modelu ani matrycy widoku, oferuje tylko połączoną matrycę widoku modelu. Dlaczego? Ta konstrukcja zmusza cię do trwałego zapisania i przywrócenia "macierzy widoku", ponieważ zostanie ona "zniszczona" przez zastosowane do niej przekształcenia modelu. Dlaczego nie ma trzech oddzielnych matryc?

Jeśli spojrzysz na nowe wersje OpenGL (OpenGL 3.x / 4.x) i nie używasz klasycznego potoku renderowania, ale dostosowujesz wszystko za pomocą shaderów (GLSL), nie ma już dostępnych macierzy, musisz zdefiniować własne macierze. Nadal większość ludzi zachowuje starą koncepcję macierzy projekcyjnej i macierzy widoku modelu. Dlaczego to zrobiłeś? dlaczego nie użyć trzech macierzy, co oznacza, że nie musisz trwale zapisywać i przywracać macierzy widoku modelu lub używasz pojedynczej połączonej macierzy widoku modelu (MVP), która zapisuje mnożenie macierzy w cieniowaniu wierzchołków na zawsze renderowany wierzchołek (w końcu takie mnożenie też nie przychodzi za darmo).

Więc podsumowując moje pytanie: która przewaga ma połączoną macierz widoku modelu wraz z oddzielną macierzą projekcji nad posiadaniem trzech oddzielnych macierzy lub jednej macierzy MVP?

 45
Author: Mecki, 2012-05-16

2 answers

Spójrz na to praktycznie. Po pierwsze, im mniej macierzy wysyłasz, tym mniej macierzy musisz pomnożyć przez positions/normals / etc. A zatem, im szybciej twoje shadery wierzchołków.

Więc punkt 1: mniej macierzy jest lepsze.

Są jednak pewne rzeczy, które prawdopodobnie musisz zrobić. Chyba że robisz renderowanie 2D lub kilka prostych aplikacji demonstracyjnych 3D, będziesz musiał zrobić oświetlenie. Zazwyczaj oznacza to, że będziesz musiał przekształcić pozycje i normalne w albo świat lub przestrzeń kamery( widok), a następnie wykonaj na nich kilka operacji oświetlenia (w cieniowaniu wierzchołków lub cieniowaniu fragmentów).

Nie możesz tego zrobić, jeśli tylko przechodzisz z przestrzeni modelowej do przestrzeni projekcyjnej. Nie można wykonywać oświetlenia w przestrzeni po projekcji, ponieważ przestrzeń ta jest nieliniowa. Matematyka staje się znacznie bardziej skomplikowana.

Więc, punkt 2: potrzebujesz co najmniej jednego zatrzymania między modelem a projekcją.

Więc potrzebujemy co najmniej 2 matryce. Dlaczego model do kamery raczej niż model do świata? Ponieważ praca w przestrzeni świata w shaderach to zły pomysł. możesz napotkać problemy precyzji numerycznej związane z tłumaczeniami, które są odległe od ich pochodzenia. Natomiast gdybyś pracował w przestrzeni kamery, nie napotkałbyś tych problemów, ponieważ nic nie jest zbyt daleko od kamery (a jeśli tak, to prawdopodobnie powinno znajdować się poza płaszczyzną dalekiej głębi).

Dlatego: używamy przestrzeni kamery jako pośredniej przestrzeni dla oświetlenia.

 35
Author: Nicol Bolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-26 04:40:55

W większości przypadków Twój shader będzie potrzebował geometrii w świecie lub współrzędnych oka do cieniowania, więc musisz oddzielić macierz projekcji od modelu i macierzy widoku.

Mnożenie geometrii przez dwie macierze powoduje pogorszenie wydajności. Zakładając, że każdy model ma tysiące (lub więcej) wierzchołków, bardziej wydajne jest obliczenie macierzy widoku modelu w procesorze raz, i niech shader zrobi jeden mniej mtrix-wektor mnożenie.

 2
Author: Tal Darom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-16 11:47:18