Autor Wątek: Liczenie macierzy normalnej, ustawienie uniformów  (Przeczytany 2563 razy)

Offline KeeL

  • Użytkownik

# Lipiec 21, 2012, 00:04:44
Witam,
Mam mały problem z projektowaniem kodu, więc mam klasę obiekt która posiada macierz modelu itd, dalej mam kamerę, gdzie trzymam macierze widoku i projekcji. Teraz mam problem, gdzie powinienem liczyć iloczyn tych macierzy ( bardziej chodzi o modelu i widokuprojekcji ).
Na razie liczę to wszystko w pętli rysującej, ale nie jest to za eleganckie rozwiązanie. Co z macierzą normalną? Do jej obliczenia są potrzebne macierze widoku i modelu.

Ustawianie uniformów, co z nimi zrobić? Ustawiać w klasie, która ich potrzebuje tzn macierz projekcki w kamerze itd ?

Pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline flexi

  • Użytkownik

# Lipiec 21, 2012, 00:25:18
tip: "normal matrix mozesz obliczyc juz w shaderze"

Offline KeeL

  • Użytkownik

# Lipiec 21, 2012, 00:39:13
tip: "normal matrix mozesz obliczyc juz w shaderze"

Tak wiem, aczkolwiek po co liczyć ją dla każdego wierzchołka, jak można ją po prostu przekazać jako zmienna uniform.

Offline fn2000

  • Użytkownik

# Lipiec 21, 2012, 01:19:27
Kamera odpowiada za View i Projection. Często robi się też tak, że przed wysłaniem do shadera przemnaża się kombinacje WorldViewProjection, InvertWorldViewProjection, itd.

Każdy model ma swój World, który musisz wysłać do shaderów przed rysowaniem i jego miejsce jest IMHO przy modelu, bo np. często jest on wynikową mnożenia przekształceń w systemie animacji czy fizyki.

Macierz normalną - pewnie chodzi o normalne, a nie macierz - powinna być częścią modelu.

Uniformy to są zew. parametry shaderów, które powinieneś ustawiać wtedy, gdy się zmieniają i gdy tego potrzebujesz, uwzględniając jak często je zmieniasz. Jeśli np. masz jakiś parametr, który zmienia się tylko przy zmianie parametrów kamery (np. robisz zoom) to po co ustawiać co drawcall?

Offline ismu

  • Użytkownik

# Lipiec 21, 2012, 02:03:56
Odnośnie ustawiania uniformów odsyłam do mojego tematu w którym poruszyłem problem ustawiania ich i pojawiło się kilka rozwiązań http://forum.warsztat.gd/index.php?topic=25523. Jeśli chodzi o normalne to są one zazwyczaj w przestrzeni modelu(oświetlenie liczy się najczęściej w przestrzeni kamery), więc jest potrzebna odpowiednia macierz przekształcenia nie można przemnożyć normalnej przez macierz modelView, bo otrzyma się błędną transformację. Należy użyć macierzy (modelView-1)T(nie będę tłumaczył skąd się taki wzór bierze, bo to matematyka a wyprowadzenie jest ogólnodostępne ;p). Co do liczenia macierzy widoku, projekcji, ich odwrotności itp. by zmniejszyć ilość obliczeń można zastosować "leniwe wartościowanie", czyli liczyć je wtedy gdy coś się zmieniło. Znowu odsyłam do niezłego artykułu Rega na ten temat http://warsztat.gd/wiki/Zaawansowana+kamera+3D, jednak troszkę rzeczy można zrobić lepiej, ale tam jest pokazana dobra idea ;p Radzę uważać na wzory matematyczne, ponieważ artykuł jest przystosowany pod DX mamy tam układ lewoskrętny, a w OGL jest prawoskrętny, więc wzory się różnią ;p
« Ostatnia zmiana: Lipiec 21, 2012, 02:11:56 wysłana przez ismu »

Offline mihu

  • Użytkownik
    • mihu

# Lipiec 21, 2012, 02:31:16
nie można przemnożyć normalnej przez macierz modelView
Drobna poprawka: można, jeżeli macierz nie zawiera niejednorodnego skalowania.

Offline KeeL

  • Użytkownik

# Lipiec 21, 2012, 11:39:41
Odnośnie ustawiania uniformów odsyłam do mojego tematu w którym poruszyłem problem ustawiania ich i pojawiło się kilka rozwiązań http://forum.warsztat.gd/index.php?topic=25523.
Ok, dzięki przejrzę
Jeśli chodzi o normalne to są one zazwyczaj w przestrzeni modelu(oświetlenie liczy się najczęściej w przestrzeni kamery), więc jest potrzebna odpowiednia macierz przekształcenia nie można przemnożyć normalnej przez macierz modelView, bo otrzyma się błędną transformację. Należy użyć macierzy (modelView-1)T(nie będę tłumaczył skąd się taki wzór bierze, bo to matematyka a wyprowadzenie jest ogólnodostępne ;p). Co do liczenia macierzy widoku, projekcji, ich odwrotności itp. by zmniejszyć ilość obliczeń można zastosować "leniwe wartościowanie", czyli liczyć je wtedy gdy coś się zmieniło. Znowu odsyłam do niezłego artykułu Rega na ten temat http://warsztat.gd/wiki/Zaawansowana+kamera+3D, jednak troszkę rzeczy można zrobić lepiej, ale tam jest pokazana dobra idea ;p Radzę uważać na wzory matematyczne, ponieważ artykuł jest przystosowany pod DX mamy tam układ lewoskrętny, a w OGL jest prawoskrętny, więc wzory się różnią ;p
Totak macierz o której piszesz modelView-1)T nazywana jest też macierzą normalną, przynajmniej tak piszą w wielu kursach dotyczących opengl.

W artykule Reg'a nie znalazłem rozwiązania mojego problemu, bardziej chodzi mi gdzie to powinienem obliczać niż jak.

Offline voytech

  • Użytkownik

# Lipiec 21, 2012, 23:13:10
Np. na chwilę przed rysowaniem modelu. W tym czasie szadery powinny być już załadowane i wiadomo już czy potrzebują określonych macierzy lub ich iloczynu albo odwrotności.

Offline Veldrin

  • Użytkownik

# Lipiec 21, 2012, 23:25:42
To w jaki sposób to wszystko zaprojektujesz i zorganizujesz będzie wyróżniało Twój system od innych ;). Cała magia silników(subiektywnie dla mnie, efekty, narzędzia. wydajność na drugim planie :D )

Architektura silnika to bardzo interesujące zagadnienie i nie ma rozwiązań "tak i tak". Kombinuj, eksperymentuj, patrz jak jest u innych. Co u innych jest źle i nie elegancko. Co fajnego daje dane rozwiązanie, a w czym ogranicza. Ja nie raz przekazywałem uniformy w miejscach przechowywania danych np. obiektach bytów, kamery czymś odpowiedzialnym za stan. W innych projektach, wszystkie wołania API uniformów były w przestrzeni renderera.

Jeżeli chodzi o normalmatrix, to liczyłem(dla obiektów które tego wymagały, w sytuacjach gdy się zmieniał) w momencie przygototywania stanu do renderingu w rendererze. Wraz z innych macierzami i siup.

PS. Skoro masz takie problemy - wracał do kartki/tablicy i poprawiał projekt(chyba że nie ma projektu <ooops>). To w takim razie wracamy do projektowania. Myślenie palcami jest bolesne.

Offline KeeL

  • Użytkownik

# Lipiec 22, 2012, 00:49:34
Np. na chwilę przed rysowaniem modelu. W tym czasie szadery powinny być już załadowane i wiadomo już czy potrzebują określonych macierzy lub ich iloczynu albo odwrotności.
No to chyba przy tym zostane.

To w jaki sposób to wszystko zaprojektujesz i zorganizujesz będzie wyróżniało Twój system od innych ;). Cała magia silników(subiektywnie dla mnie, efekty, narzędzia. wydajność na drugim planie :D )

Architektura silnika to bardzo interesujące zagadnienie i nie ma rozwiązań "tak i tak". Kombinuj, eksperymentuj, patrz jak jest u innych. Co u innych jest źle i nie elegancko. Co fajnego daje dane rozwiązanie, a w czym ogranicza. Ja nie raz przekazywałem uniformy w miejscach przechowywania danych np. obiektach bytów, kamery czymś odpowiedzialnym za stan. W innych projektach, wszystkie wołania API uniformów były w przestrzeni renderera.
Kombinuję próbuję, ale moje rozwiązanie wydawało mi się nie eleganckie, dlatego proszę was, o zaprezentowanie swoich rozwiązań albo przemyśleń na ten temat. Warto znać rozwiązania innych, mogą na prowadzić kogoś na dobry trop.