.[ ČeskéHry.cz ].
Skeletální animace+VBO+GLSL
Jdi na stránku Předchozí  1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
HonzikJ



Založen: 04. 02. 2010
Příspěvky: 21

PříspěvekZaslal: 27. březen 2011, 08:28:34    Předmět: Odpovědět s citátem

Takže chyba byla ve vykreslování, jsem vykresloval menší počet vertexů než kolik jich měl model. Takže všechno už funguje.
Rád bych se ale zeptal v čem by byla výhoda použití kvaternionu, teda v posílání kvaternionu do shaderu. Tak zřejmě přece jenom menší nároky na uložení, takže bych si držel ne pole matic ale pole kvaternionu a pole translací, které bych pak posílal do shaderu. Ale z výpočetního hlediska ušetřilo by se? Když přece pošlu kvaternion a pozice, tak z nich v shaderu vyrobím mat4 a tou to všechno pronásobím...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 27. březen 2011, 11:19:58    Předmět: Odpovědět s citátem

Predpokládám, že ty matice máš uložený v paměti CPU, takže se musí na GPU vždycky přenést a tady právě oproti posílání celý matice ušetříš (výměnou za výpočet na GPU, ale myslím že se to vyplatí). Stejně tak ušetříš i přenos matic z paměti GPU do shader procesorů.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 27. březen 2011, 14:37:14    Předmět: Odpovědět s citátem

Moment, rotace pomocí kvaternionu je oproti rotaci pomocí matice docela složitá, ne? A kdyby se to počítalo třeba pro 1000 vertexů, tak by to rozhodně bylo poznat. Proč neposílat vec3 transformaci a mat3 rotaci? To by bylo 12 floatů, což oproti 7 floatům v případě kvaternionu nebylo tolik, výpočetní náročnost by byla nízká a mohla by se předávat i scale.
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 27. březen 2011, 14:46:59    Předmět: Odpovědět s citátem

no povedal by som ze sa casto vyplati vymenit prenos z pamete za vypocty. na GPU plati ze radsej trikrat vypocitat ako to prenasat z/do pamete.

ono to mozete vidiet takta ATI zdvojnasobuje hruby vypocetny vykon kazdu generaciu. ale pametova priepustnost isla hore omnoho pomalsie.

ale to je pre HonzikJ irelevetatne teraz. odporucam mu sa zamerat na to aby mu fungovali animacie s maticami a na nejake quateriony sa teraz vykaslal pretoze mu neprinesu nic nove.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 28. březen 2011, 08:51:29    Předmět: Odpovědět s citátem

Budu citovat sám sebe :-). Chceš-li si bezbolestně ušetřit velikost přenášených dat RAM->VRAM, zkus tohle:

]semo[ napsal:
..., může použít trik, který tu někdo na fóru před časem popisoval:

Když nebude mít scale, tak bázové vektory v transformační matici jsou jednotkové. Proto může poslat jen dvě složky vektoru a třetí dopočítat (ví, že délka je 1). Navíc ty tři vektory jsou na sebe kolmé, takže může poslat jen dva a třetí dopočítat cross-produktem. Takhle může mít pro rotaci jen 4 čísla, ale neni to quaternion.

_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 28. březen 2011, 14:08:40    Předmět: Odpovědět s citátem

Ten trik by fungoval, ale můžeš dostat jiný znamínka.
1) Z=sqrt(1-X*X-Y*Y) nikdy nedává záporný číslo a co když původní Z bylo záporný?
2) Musíš si pohlídat, jak je otočený třetí vektor u matice, abys vědel, jestli udělat cross(U,V) nebo cross(V,U).
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 28. březen 2011, 14:20:52    Předmět: Odpovědět s citátem

eosie:
1) To máš pravdu, na to jsem nepomyslel. Zřejmě bych znaménko zapakoval do jedný z komponent X nebo Y. (Abs(X) > 1 znamená záporný Z a z X použít jen desetinnou část). Ale je to asi zbytečná komplikace, záleží, kolik těch dat bude potřeba předávat. Jeden nebo dva panáky do hry stačí udělat jednnoduše.

2) To neni problém, spíš otázka použitého souřadného systému ("right hand" nebo "left hand").
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 30. březen 2011, 13:00:52    Předmět: Odpovědět s citátem

#Eosie - přesnost sqrt na grafických kartách je docela ubohá (podobně jako funkce sqrtss, na CPU).

Quaterniony pro rotaci jsou taky všechny jednotkové a analogicky se dá aplikovat toto:
x^2 = 1 - (i^2 + j^2 + k^2) ... takže jen 3 hodnoty.

Quaternionová matematika není pro výpočet složitější než maticová, dokonce je rychlejší (možná až na sférickou interpolaci, ale ta se dá napsat taky rychle - pokud nepoužíváš pomalý sin a cos (EDIT: vlastně ani není potřeba ...), jaký má math.h ... na procesoru, na GPU se afaik používá optimalizovaný (a pokud ne, tak si napíšeš rychlejší)). Jenom narozdíl od matematiky maticové, je ta kvaternionová docela složitá na naučení.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.


Naposledy upravil Vilem Otte dne 30. březen 2011, 15:09:39, celkově upraveno 2 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 30. březen 2011, 14:33:49    Předmět: Odpovědět s citátem

Transformace quaternionem rozhodně složitější je a doporučuju se jí vyhnout (vím to, páč jsem to implementoval).

Vzorec, o kterém se bavíme, je: w = q * (v.x, v.y, v.z, 1) * q^-1 (v-vektor, q-quaternion, w-výsledek)
Pak se ještě musí udělat: w.xyz /= w.w;
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 30. březen 2011, 14:43:21    Předmět: Odpovědět s citátem

citace:
Transformace quaternionem rozhodně složitější je a doporučuju se jí vyhnout (vím to, páč jsem to implementoval).

Jak přesně jsi ji implementoval? Narážíš přímo na transformaci vertexu quaternionem, já měl na mysli samotný výpočet animace na CPU (tedy ještě před skinningem), a skinning ála MD5 (na CPU).

On quaternion skinning umí být sakra efektivní, např. v případě implementace formátu MD5 (používám CPU skinning, protože potřebuju data jak v RAM tak ve VRAM); bohužel na GPU se to nedá nijak pěkně převést (a to moc nepotěší).

Nevím zda znáš model, který se používá u MD5 specifikace - je trochu odlišný než klasický maticový skinning. Pro CPU efektivnější (a řádově při dobré implementaci), pro GPU ... ani náhodou.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 30. březen 2011, 14:47:23    Předmět: Odpovědět s citátem

Neznám MD5.

Operátor * v tom vzorci je násobení quaternionu quaternionem. A to je celá implementace.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 30. březen 2011, 15:02:54    Předmět: Odpovědět s citátem

Mno, jak jsem říkal, provádí se trošku jinak, stručně je to popsané tady (kdybys měl zájem se podívat) - http://tfc.duke.free.fr/coding/md5-specs-en.html jedná se prakticky o jednu z nejúčinnějších metod pro cpu skinning.

Bohužel pro gpu skinning jsem nenašel zatím lepší řešení (pro stejný formát), než ho po načtení převést na klasický model (s maticemi) a provádět klasický maticový skinning, bohužel to zase prodlužuje loading time.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 30. březen 2011, 17:26:53    Předmět: Odpovědět s citátem

Dík za info.

BTW ten samej vzorec je v tom dokumentu skoro na začátku: R = Q.P.Q*
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
HonzikJ



Založen: 04. 02. 2010
Příspěvky: 21

PříspěvekZaslal: 30. říjen 2011, 08:39:20    Předmět: Odpovědět s citátem

Po čase jsem se k tomuto vrátil a trochu postoupil dál a objevil se nový problém. Mám nyní model pokrytý OBB. Funguje to u mě tak, že pro každou skupinu vertexů příslušející k jointu mám spočítaný jeden OBB. Vypadá to celkem dobře, ale teď problém:
Jak zařídit aby se ty OBB updatovaly spolu s animací. Jde to i nějak jinak, než v každém kroku animace přepočítávat?

Díky za případné nápovědy...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 30. říjen 2011, 09:50:47    Předmět: Odpovědět s citátem

Vilem Otte napsal:
Mno, jak jsem říkal, provádí se trošku jinak, stručně je to popsané tady (kdybys měl zájem se podívat) - http://tfc.duke.free.fr/coding/md5-specs-en.html jedná se prakticky o jednu z nejúčinnějších metod pro cpu skinning.

Když jsem to v rychlosti prolétl, tak jsem zjistil, že to dělám ve svém enginu, až na drobné rozdíly, úplně stejně...
A to jsem se původně inspirovával u Half-Life skeletálních animací...

HonzikJ napsal:
Jak zařídit aby se ty OBB updatovaly spolu s animací. Jde to i nějak jinak, než v každém kroku animace přepočítávat?

Co třeba ten BB počítat až tehdy, když ho budeš potřebovat? Interpolované pozice a rotace kostí (jointů) máš, takže by v tom neměl být velký problém, ne?
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3  Další
Strana 2 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna