.[ ČeskéHry.cz ].
Vlastní modelformát + parallax mapping

 
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
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 24. srpen 2008, 12:53:54    Předmět: Vlastní modelformát + parallax mapping Odpovědět s citátem

Zdravím,

chtěl jsem si zkusit udělat menší aplikaci na zobrazování vlastního model formátu s parallax mappingem v OpenGL + GLSL. Ale zjistil jsem, že mám několik nedostatků.

1.) Když počítám TBN matici, je nutné ji pro parallax mapping mít pro každý vrchol nebo stačí pro každý triangle?

2.) Dostal jsem se do problému s exportem modelů z maxka. 3DS max má na jednom vrcholu více koordinátů, z čehož vyplívá že musím některé vrcholy zduplikovat. Bojím se ale, že zduplikováním vrcholů si nadělám mnohem více problémů.:-/ Jaké existují možnosti?

Pokud s tím máte někdo zkušenosti (předpokládám že ano Smile ), tak budu vděčný za každou radu, nebo návrh. Díky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kerekes



Založen: 29. 07. 2007
Příspěvky: 57

PříspěvekZaslal: 24. srpen 2008, 13:19:06    Předmět: Odpovědět s citátem

1. TBN matica by mala byt definovana pre kazdy vrchol z dovodu smoothovania povrchu. Ak by bola definovana pre kazdy trojuholnik tak by to neslo definovat. Dalsia vec je ze TBN sa posiela do shaderu ako vertex atribut (zvycajne len 2 vektory + treti sa dopocitava) a teda je tp skor nutnost definovat ju per vertex.

2. max umoznuje pouzivat viacero texturovych koordinatov. Staci nacitat ten kanal, ktory je aktualne pouzity.


Tu je napriklad kod na ziskanie texturovych koordinatov z kanalu 0 a 1.
kód:

--get attribute texcoord0
               if chb_texcoords0.checked then
               (
                  for i=1 to num_faces do
                  (
                     if (meshop.getMapSupport tmesh 1) then
                     (   
                        face=meshop.getMapFace tmesh 1 face_array[i]
                        tv1=meshop.getMapVert tmesh 1 face.x
                        tv2=meshop.getMapVert tmesh 1 face.y
                        tv3=meshop.getMapVert tmesh 1 face.z
                        --tvertex1
                        append vertextexcoord0_array tv1
                        --tvertex 2
                        append vertextexcoord0_array tv2
                        --tvertex 3
                        append vertextexcoord0_array tv3
                     )
                     else
                     (
                         append vertextexcoord0_array (point3 0.0 0.0 0.0)
                        append vertextexcoord0_array (point3 0.0 0.0 0.0)
                        append vertextexcoord0_array (point3 0.0 0.0 0.0)
                     )
                  )
               )
               --get attribute texcoord1
               if chb_texcoords1.checked then
               (
                  for i=1 to num_faces do
                  (
                     if (meshop.getMapSupport tmesh 2) then
                     (   
                        face=meshop.getMapFace tmesh 2 face_array[i]
                        tv1=meshop.getMapVert tmesh 2 face.x
                        tv2=meshop.getMapVert tmesh 2 face.y
                        tv3=meshop.getMapVert tmesh 2 face.z
                        --tvertex1
                        append vertextexcoord1_array tv1
                        --tvertex 2
                        append vertextexcoord1_array tv2
                        --tvertex 3
                        append vertextexcoord1_array tv3
                     )
                     else
                     (
                         append vertextexcoord1_array (point3 0.0 0.0 0.0)
                        append vertextexcoord1_array (point3 0.0 0.0 0.0)
                        append vertextexcoord1_array (point3 0.0 0.0 0.0)
                     )
                  )
               )
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 24. srpen 2008, 13:30:04    Předmět: Odpovědět s citátem

Jasný, díky.

kerekes napsal:
2. max umoznuje pouzivat viacero texturovych koordinatov. Staci nacitat ten kanal, ktory je aktualne pouzity.


Jj, tohle vím. V tom problém nemám, spíš by mě zajímalo jak to nejlépe zpracovat. Mám tím na mysli, zda se musí pak vrcholy zduplikovat a v rendereru pak házet vrchol dvakrát s jiným tex coord, nebo zda je ještě jiné řešení?

Vzhledem k tomu, že TBN musí být pro každej vrchol, tak předpokládám, že nejlepší jej bude spočítat jako s normálou. Tj. pro každej trojuhelník a pak jej zprůměrovat?

Ono když totiž začnu duplikovat vrcholy, tak se dostanu do několika problémů - například si každej vrchol bude muset pamatovat ke kterému trojuhelníku patří - čímž vzrostou paměťové nároky:-/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kerekes



Založen: 29. 07. 2007
Příspěvky: 57

PříspěvekZaslal: 24. srpen 2008, 13:56:06    Předmět: Odpovědět s citátem

Ono sa to zvykne (resp tak to robim ja) pouzivat tak, ze najprv to exportujem kompletne 3 vertexy per face (triangel).
Dalej prebieha algoritmus, ktory zistuje duplikaty vertexov. Vertex je rovnaky ak je rovnaky v kazdom atribute .. teda aj normale (a teda aj tbn) a texturovom koordinate.
Vysledkom tohoto algoritmu je pole vertexov (rozumej struktura trebarz: pozicia, normala, tangenta, uvkoordinat....), a pole indexov. Kazdy triangel ma 3 indexy do pola vertexov.
Toto graficka karta dokaze spracovat a v konecnom dosledku je to este aj efektivnejsie.
Pametovych narokov by som sa nebal. Index ti adresuje vertex ako celok...tj nemas indexy pre kazdy vertex atribut zvlast. Dalsia vec je ze to takto mozes kompletne skopirovat do vertex a index buffera a vybavena vec.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 24. srpen 2008, 14:09:35    Předmět: Odpovědět s citátem

ok, až na pár drobností jsem mě podobny postup na mysli. Tak diky Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kerekes



Založen: 29. 07. 2007
Příspěvky: 57

PříspěvekZaslal: 24. srpen 2008, 14:17:53    Předmět: Odpovědět s citátem

citace:
Vzhledem k tomu, že TBN musí být pro každej vrchol, tak předpokládám, že nejlepší jej bude spočítat jako s normálou. Tj. pro každej trojuhelník a pak jej zprůměrovat?

Nieje celkom spravne. Lepsie nez smoothovat kompletne vsetko je nechat to na grafikovi. Ten to v prislusnom modelovacom softe nastavi tak aby to vyzeralo dobre. Trebarz taka kocka by nemala mat smoothovane rohy a pod.
Pri vypocte TBN je potom potrebne riadit sa nastavenim normaly. Tj napriklad najprv zratat tbn pre triangel ako celok (co tusim inak ani nejde) a nasledne to prisposobit nastaveniu normaly vrcholu.

Priklad:
povedzme ze mas vyexportovane 3 vertexy per face, tj nieje tam ziadne indexovanie.

Kazdy vrchol je teda jedinecny a mozes mu vygenerovat tbn. Tu by som odporucil si pre kazdy vrchol ulozit este aj flag ci je na normalovej texture pouzity mirorring. Tj ak normala, ktoru ti da cross produkt tangenty a bitangenty je v smere normaly, ktora je definovana pre vrchol tak flag je 0 ak je v protismere (dot(normal, tbnnormal) <0.0f) potom flag je 1.

V dalsom kroku zacnes zjednocovat rovnake vrcholy kvoli efektivite. Ak je vrchol rovnaky vo vsetkych atributoch (normala, texturovy koordinat vratane flagu mirrorovania) OKREM tangenty a bitangenty (tie mozu mat jemne odlisny smer vdaka texturovaniu) tak vrchol mozes zjednotit. Mozes si vytvarat pole zjednocovania, tj napriklad ze vrchol cislo 5 v novom poli je zjednotenim vrcholov cislo 18,45,98 tak tangenta/bitangenta pre vrchol c5 bude zjednotenim tangent/bitangent vrcholov cislo 18,45,98 s tym ze je potrebne vykonat ich (niesom si isty pojmom) orthogonalizaciu voci normale definovanej grafikom. Tj prepocitat novu tangentu ako cross normaly a bitangenty a bitangentu ako cross novej tangenty a normaly. (Pozor smer (znamienko) starej a novej tangenty a bitangenty musi zostat zachovany (tj dot(Tstara, Tnova) > 0)).

Dufam ze som nieco nesplietol.

EDIT:
Este by som doplnil ze ten indexacny algoritmus a aj samotny vypocet tbn je dost narocny na vykon. Tj odporucam z maxka dostat len nejaky "surovy" model v nejakom temp formate a tieto algoritmy si napisat bokom trebarz v ccku ako konzolovu aplikaciu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 24. srpen 2008, 14:25:49    Předmět: Odpovědět s citátem

oki díky, zkusím to pořádně přelouskat a vyzkoušet, ale vyzerá to dobře. Smile
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: 24. srpen 2008, 14:38:24    Předmět: Odpovědět s citátem

Výborně, akorát...

kerekes napsal:
Dalsia vec je ze TBN sa posiela do shaderu ako vertex atribut (zvycajne len 2 vektory + treti sa dopocitava)

Třetí vektor dopočítávat nemůžeš, pokud ti jde o přesnost. Problém je v tom, že TBN matice není (většinou) ortogonální, tedy tangenta nemusí být kolmá na bitangentu, oba vektory se musí počítat zvlášť. Typicky to neplatí u jakéhokoliv zakřiveného povrchu (když smoothuješ), u rovných povrchů to problém není, pokud textura není namapována zkosená. Můžeš ale využít jednotkovosti těch vektorů a přenášet jen 2 složky, 3. dopočítat, nebo lépe - přenášet ty vektory jako 4x unsigned byte každý, a buď si rozpakování do 4D vektoru nechat provést automaticky nebo udělat rozpakování z jednoho 32bit floatu ručně.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 24. srpen 2008, 19:31:35    Předmět: Odpovědět s citátem

Eosie napsal:
Třetí vektor dopočítávat nemůžeš, pokud ti jde o přesnost. Problém je v tom, že TBN matice není (většinou) ortogonální, tedy tangenta nemusí být kolmá na bitangentu, oba vektory se musí počítat zvlášť. Typicky to neplatí u jakéhokoliv zakřiveného povrchu (když smoothuješ), u rovných povrchů to problém není, pokud textura není namapována zkosená. Můžeš ale využít jednotkovosti těch vektorů a přenášet jen 2 složky, 3. dopočítat, nebo lépe - přenášet ty vektory jako 4x unsigned byte každý, a buď si rozpakování do 4D vektoru nechat provést automaticky nebo udělat rozpakování z jednoho 32bit floatu ručně.


Mohl by jsi to prosím ještě malinko rozepsat, moc jsem tohle nepochopil.
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: 24. srpen 2008, 19:55:20    Předmět: Odpovědět s citátem

To už tady lidi ani nerozumí mým příspěvkům? OK, tak stručně:

1) Tangentu a bitangentu počítej každou zvlášť, tzn. nepočítej jeden z nich jako vektorový součin předchozích dvou.
2) Zabalení a rozbalení kusu paměti obsahující 4x unsigned byte ale do shaderu posláno jako float a extrahování těch 4x 8bitů z jednoho floatu do 4x float jsem popsal tady: http://forum.builder.cz/read.php?124,2649130 (poslední můj příspěvek v tom vlákně)
_________________
AMD Open Source Graphics Driver Developer
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
Strana 1 z 1

 
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