Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Khaj

Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 31. květen 2009, 13:10:09 Předmět: Matice DX vs OGL |
|
|
Pozorovani: V DirectX v shaderech se bezne vertexy nasobi transformacni matici zprava (protoze ukladani matic v registrech ma smysl jen po sloupcich, jinak by se nekde musela delat zbytecna transpozice).
Po prechodu na OpenGL si sice uzivam obecneho luxusu, ale pri mych prvnich pokusech s FFP a nahravanim (tech samych) matic jsem zjistil divne veci...
jednak OGL nefunguje s projekcnima maticema z DirectX a jednak jsou vsechny me stare matice vzhledem k DX transponovane.
Nevite, kde jsou skryty tyto rozdily?
Je to kiks v dokumentaci (ktera rika ze se matice ukladaji po sloupcich), nebo je to tim, ze FFP nasobi vertexy matici zprava misto zleva (a znasilnuje registry v grafarne)? |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 31. květen 2009, 14:10:16 Předmět: |
|
|
http://glprogramming.com/red/images/Image49.gif
takze to je takto
x = M*P*v
kde M je modelview a P projekcna matica. v je vertex a x su vysledne homogenne suradnice.
pre teba bude vhodne pouzivat glLoadTransposeMatrix() s glMultTransposeMatrix().
glMultMatrix(M) nasobi C=C*M kde C je aktualna matica a teda aj vysledna.
za dalsie OpenGL a DX maju rozdielny suradnicovy system. OpenGL pouziva pravotocivy system a DX tusim lavotocivy. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 31. květen 2009, 14:10:32 Předmět: |
|
|
V OpenGL je to obráceně než v DX - tedy matice jsou vzájemně transponované a násobení probíhá z druhé strany. Navíc mají obě GAPI různý systém souřadnic (levotočivý vs. pravotočivý). |
|
Návrat nahoru |
|
 |
Khaj

Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 31. květen 2009, 16:36:48 Předmět: |
|
|
Diky moc, docela jsem se bal ze je chyba u mne ... stacilo zacit ukladat matici po radcich a problem se vyresil (radsi nez loadTranspose, to zni strasne pomalu). Levotocivost nebo pravotocovost bych mel byt schopen kontrolovat sam pomoci projekcni matice.
Jenom nechapu jak to udelali, ze oba fungujou rozdilne... jeden z nich teda musi provadet jednu transpozici navic a byt diky tomu pomalejsi. Nebo ne? |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 31. květen 2009, 19:02:53 Předmět: |
|
|
Teoreticky není problém používat stejné matice v obou 3D API. Jedinej problém bych viděl v tom, že v clip-space je viditelná část osy Z v OpenGL v intervalu [-1,1], zatímco v D3D je v [0,1]. Clip-space je v obou 3D API levotočivý.
Teď s tím transponováním a proč D3D funkce (které nemusíte používat) násobí matice z druhé strany. Přece platí tohle:
(A * B)^T = B^T * A^T
Takže je to po transponování s OpenGL ekvivalentní.
EDIT:
Transpozice není na škodu. V případě skalárních (NVIDIA) a superskalárních (ATI) architektur je to jedno. U DX9 GPU to jedno být nemusí, ale to nevíme. Je možné, že ty GPU mají implementované rychlé násobení s transponovanou maticí. Pseudo-asm (D3D i OGL) nemá moc společného s tím, jak to v GPU funguje, i když nějaký náznak tam je. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
|