Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
HonzikJ
Založen: 04. 02. 2010 Příspěvky: 21
|
Zaslal: 27. březen 2011, 08:28:34 Předmět: |
|
|
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 |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 27. březen 2011, 11:19:58 Předmět: |
|
|
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 27. březen 2011, 14:37:14 Předmět: |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 27. březen 2011, 14:46:59 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 28. březen 2011, 08:51:29 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 28. březen 2011, 14:08:40 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 28. březen 2011, 14:20:52 Předmět: |
|
|
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 30. březen 2011, 13:00:52 Předmět: |
|
|
#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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 30. březen 2011, 14:33:49 Předmět: |
|
|
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 30. březen 2011, 14:43:21 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 30. březen 2011, 14:47:23 Předmět: |
|
|
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 30. březen 2011, 15:02:54 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 30. březen 2011, 17:26:53 Předmět: |
|
|
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 |
|
 |
HonzikJ
Založen: 04. 02. 2010 Příspěvky: 21
|
Zaslal: 30. říjen 2011, 08:39:20 Předmět: |
|
|
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 |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 30. říjen 2011, 09:50:47 Předmět: |
|
|
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 |
|
 |
|