[ glorius @ 11.08.2006. 13:07 ] @
Veciti problem sa ovim vertex array-om.

Pomocu nekog exportera izvezem podatke o vertexima, normalama, tex coords, tangentama, ... i podatke o njihovim indexima.

Problem je sto se indexi vertexa ne slazu sa indexima normala, tex coordinata itd.

Zeleo bih da u array ubacim sve ove podatke i pomocu glDrawElements "izbacim" mesh.

Ovo je moguce uraditi na taj nacin sto cu pakovati vertexe, normale, ... pomocu face informacija i tako mogu dobiti identicne indexe za sve podatke.

Ali, postoji problem. Sve lepo radi ali sada array sadrzi podatke o dupliranim vertexima ( brojVertexa = brojNormala = ... = broj faceova*3 )

Takodje, ako hocu da manipulisem vertexima ( skinning, morphing ), moram da radim sa originalnim vertexima, pa da ih opet pakujem i predam vertex array.

Ima li elegantnijeg resenja?

[ yooyo @ 12.08.2006. 10:15 ] @
Nazalost, mora bas tako kao sto si uradio, mada ti racunica br_vertexa = 3*br_trouglova nije tacna. Ako je geometrija "normalna" onda ce ti se pojaviti dupliranje vertexa samo na "shavovima" UV mapinga. U svakom slucaju model ce zauzimati 10-30% vise u odnosu na trentno stanje.

Kreiraj 2 "buffera". U jednom cuvaj vertexe (kao struktire pos, norm, col, texcoord, tangenta, binormala, ...) a u drugom baferu cuvaj niz trouglova, tj. indexe vertexa.
Code:

za svaki trougao T
  za svaki vertex V trougla T
  {
    sakupi sve atribute V (pos, norm, col, texcoord, ....) u novi vertex NV
    dodaj NV u niz, ali poroveri da li se takav vertex vec nalazi u nizu. ako se nalazi uzmi njegov index, a ako se ne nalazi, samo ga dodaj i vrati index
    ubaci index u novi trougao NT
  }
  ubaci NT u niz novih trouglova


Kada ovako "preradis" model mozes da ga iscrtas samo jednim pozivom glDrawElements. Inace, ovo nije idealan nacin jer bi trebalo voditi racuna o vertex cache-u pa ispremestati nke vertexe tako da se maksimalno iskoristi GPU vertex cache, ali to je vec druga tematika.