Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 24. srpen 2008, 12:53:54 Předmět: Vlastní modelformát + parallax mapping |
|
|
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 ), tak budu vděčný za každou radu, nebo návrh. Díky. |
|
Návrat nahoru |
|
|
kerekes
Založen: 29. 07. 2007 Příspěvky: 57
|
Zaslal: 24. srpen 2008, 13:19:06 Předmět: |
|
|
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 |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 24. srpen 2008, 13:30:04 Předmět: |
|
|
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 |
|
|
kerekes
Založen: 29. 07. 2007 Příspěvky: 57
|
Zaslal: 24. srpen 2008, 13:56:06 Předmět: |
|
|
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 |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 24. srpen 2008, 14:09:35 Předmět: |
|
|
ok, až na pár drobností jsem mě podobny postup na mysli. Tak diky |
|
Návrat nahoru |
|
|
kerekes
Založen: 29. 07. 2007 Příspěvky: 57
|
Zaslal: 24. srpen 2008, 14:17:53 Předmět: |
|
|
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 |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 24. srpen 2008, 14:25:49 Předmět: |
|
|
oki díky, zkusím to pořádně přelouskat a vyzkoušet, ale vyzerá to dobře. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 24. srpen 2008, 14:38:24 Předmět: |
|
|
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 |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 24. srpen 2008, 19:31:35 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 24. srpen 2008, 19:55:20 Předmět: |
|
|
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 |
|
|
|