Autor Wątek: kwaterniony w shaderach  (Przeczytany 2576 razy)

Offline Piot

  • Użytkownik

# Maj 06, 2008, 22:12:17
Mam takie oto pytanie

W vertex shader obliczam animacje postacji (skining animation).
Poniewaz skielet składa sie z dozej ilosci kosci ( 100 i wiecej) to do stałych shadera
przesyłam kwaterniony i vektor przesuniecia zamiast macierzy w shaderze wykorzystuje te kwaterniony
do obliczania odpowiednich połozen wierzchołkow.

Pytanie. Czy wykorzystanie kwaternionu w szhadrze jest opłacalne , jak wy sobie radzicie z animacja obiektow skaladajacych
sie z duzej ilosci kosci.

Offline Mr. Spam

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

maxest

  • Gość
# Maj 06, 2008, 23:20:23
Chyba ciezko bedzie to zrobic inaczej niz przesylac przekonwertowane kwaterniony na macierze. Trza przeslac wiecej danych ale tego CHYBA nie da sie uniknac

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 06, 2008, 23:31:40
Cytuj
Pytanie. Czy wykorzystanie kwaternionu w szhadrze jest opłacalne , jak wy sobie radzicie z animacja obiektow skaladajacych
sie z duzej ilosci kosci.
Zależy od sytuacji. Moim zdaniem, zazwyczaj nie aż tak bardzo, bo kwaterniony pozwolą Ci jedynie na wpakowanie 50% więcej kości (kwaternion+pozycja = 2 wektory, macierz = 3 wektory, a czwarty zawsze jest [0 0 0 1]). Jeżeli tych kości jest naprawdę dużo, to i tak będziesz musiał model podzielić żeby to upchnąć w stałych. Możesz także zastosować inne podejście i uzywając SM 3.0 upchnąć macierze lub kwaterniony na teksturze vertex shadera (tu wypadało by te macierze jakoś skompresować do 16-bitowego formatu).

Warto też przypomnieć o czymś takim, jak bone level of detail - obiekty bardziej odległe mogą używać mniej kości. :)


Cytuj
Chyba ciezko bedzie to zrobic inaczej niz przesylac przekonwertowane kwaterniony na macierze. Trza przeslac wiecej danych ale tego CHYBA nie da sie uniknac
Shadery wręcz idealnie nadają się do wykonywania operacji na kwaternionach, więc nie przesadzaj. Jedyna kwestia to to, że trochę jest z tym zabawy, a i tak zyskujesz nie aż tak wiele. :)

maxest

  • Gość
# Maj 06, 2008, 23:36:57
Cytuj
Shadery wręcz idealnie nadają się do wykonywania operacji na kwaternionach, więc nie przesadzaj. Jedyna kwestia to to, że trochę jest z tym zabawy, a i tak zyskujesz nie aż tak wiele. Smiley
Idealnosc a jednoczesnie "zabawa" i "zyskiwanie nie az tak wiele" chyba nia sie okresleniami ktore ida ze soba w parze :P. Ale tez nie bede stawial swojej wiedzy przeciwko Twojej ;)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 07, 2008, 00:10:12
Cytuj
Idealnosc a jednoczesnie "zabawa" i "zyskiwanie nie az tak wiele" chyba nia sie okresleniami ktore ida ze soba w parze :P.
Chodziło mi o to, że obliczenia na kwaternionach to głównie matematyka na 4-elementowych wektorach, więc zestaw operacji pięknie się nadaje, a że kwaterniony same w sobie są nieco pogięte, to już inna kwestia. :)

maxest

  • Gość
# Maj 07, 2008, 01:11:58
No tak - to rzeczywiscie w tym kontekscie kwaterniony "wpasowuja" sie w zestaw instrukcji shadera :). Ale koniec koncow i tak kwaternion to tylko sposob reprezentacji, ktory jeszcze w aplikacji powinno sie przekonwertowac na macierz i dopiero na koncu wyslac do shadera. Gdyby nie bylo to najsensowniejsze rozwiazanie to pewnie instnialyby jakies gotowe instrukcje do zabawy z kwaternionami, a takowych niestety nie ma :)

Offline Hans

  • Użytkownik

# Maj 07, 2008, 12:16:56
yo

jeżeli traktujemy kwaterniony tylko jako sposób kompresji macierzy to faktycznie zysk raczej niewielki

ale używając ich w shaderze można całkowicie zmienić sposób transformacji vertexów ze standardowego "transformuj a potem blenduj" na "poskładaj obroty i transformuj raz"
dzięki temu można uniknąć np efektu cukierkowego, gdzie po skręceniu jednej części o 180 stopni (wzdłuż osi) dostajemy właśnie coś na kształt cukierka w poskręcanym papierku :)

chciałem zapodać linka do artykułu w którym to było fajnie opisane, ale jak zawsze nie mogę go namierzyć
znalazłem za to: http://isg.cs.tcd.ie/projects/DualQuaternions/ traktuje o tym samym tylko w trochę ciekawszej formie (bo wektor translacji też jest zamieniony na kwaterniona)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 08, 2008, 00:29:59
Cytuj
ale używając ich w shaderze można całkowicie zmienić sposób transformacji vertexów ze standardowego "transformuj a potem blenduj" na "poskładaj obroty i transformuj raz"
dzięki temu można uniknąć np efektu cukierkowego, gdzie po skręceniu jednej części o 180 stopni (wzdłuż osi) dostajemy właśnie coś na kształt cukierka w poskręcanym papierku :)
To samo osiągniemy używając kwaternionów na CPU.

Offline DarkJarek

  • Użytkownik
    • DarkJarek HomePage

# Maj 08, 2008, 00:47:02
Jak mówił krzysiek dobrym rozwiązaniem jest podzielenie siatki na części. To jeszcze zależy od SM jakiego chcesz użyć. W obliwione sama jedna dłoń miała chyba coś ponad 20 kości! Siatka była podzielona na jakieś 10 części.