A cikk a két legsűrűbben alkalmazott geometriai primitívvel - TRIANGLELIST és TRIANGLESTRIP - foglalkozik, mindezt az optimalizálás szempontjából vizsgálva.
Kitérek az index puffere is, és a TRIANGLESTRIP / indexpuffer látszólag ellentmondásos viszonyára. A cikkben idézek a nemrég megjelent Shaderprogramozás című könyvemből, ahonnan néhány ábrát is kölcsönvettem a jobb érthetőség kedvéért.
A TRIANGLELIST (különálló háromszögek sorozata) a legalapvetőbb geometriai primitív, amelyből felépíthetjük a geometriánkat.
Előnye, hogy átlátható, hiszen minden háromszög csúcspontja jól beazonosítható, ezért egyszerű testeket akár közvetlenül a kódból is megadhatunk általa:
Nyilvánvaló hátránya az, hogy a csúcspontadatok a vertexpufferben ismétlődő, redundáns módon szerepelnek.
Tehát több adatot kell leküldeni a GPU-nak, és a tárolási igény is magasabb. Egy kockát például 32 vertexszel írunk le, ha TRIANGLELIST-et választjuk, azzal együtt, hogy józan paraszti ésszel erre elégséges lenne nyolc vertex!
Az egyik optimalizálási lehetőség a TRIANGLESTRIP bevetése. DirectX-ben a D3DPT_TRIANGLESTRIP (háromszögek sorozata közös oldallal) alkalmazása esetén nem kényszerülnénk ilyen sok, azonos vertex ismételt megadására.
Ahogy a következő ábra is mutatja, az első három vertex adja az első háromszöget, és minden további vertex egy háromszöget definiál, aminek két vertexe az előző háromszögből származik. A rendszer az A, B és C csúcspontokból állítja elő
az első háromszöget. A B-D-C vertexek adják a másodikat, C-D-E a harmadikat, az E-F-C a negyediket, és így tovább:
A D3DPT_TRIANGLESTRIP érezhető optimalizálást jelenthet, főleg, ha a modell sok közös vertexet tartalmaz. Régebbi videokártyákon komoly teljesítményjavulást lehetett elérni a TRIANGLESTRIP bevetésével.
Az újabb kártyákon egy újabb optimalizálási lehetőséget aknázhatunk ki: az úgynevezett "post transform vertex cache" egy olyan gyorsítótár, amely eltárolja a transzformációkon és megvilágítási (avagy T&L) szakaszon átesett vertexeket, amelyek utólag nem változnak. Erről a gyors - és elég kis méretű - memóriaterületről lényegesen gyorsabban kiolvashatók, mint nem cache-elt társaik.
A dolog azonban kizárólag indexelt primitívek esetében működik. Következzen egy idevágó részlet "Shaderprogramozás - Grafika és játékfejelsztés DirectX-szel" című könyvemből:
"Az indexpuffer, tényleges vertexek helyett, a csúcspontadatokra mutató pointereket tartalmazza (csúcslistamutatós megoldás). Mivel az indexpufferben található pointerek a vertexpuffer elemeire mutatnak, természetesen továbbra is szükségünk lesz a vertexpufferre, amely azonban így kizárólag a nyolc csúcspontot tartalmazza. A szükséges redundancia az indexpufferben jelenik meg, amely azonban lényegesen kisebb és egyszerűbb adathalmazt jelent – hiszen összetett vertexstruktúrák helyett mindössze 16 vagy 32 bites indexeket tartalmaz."
Lásd: "9.5. A vertex- és az indexpuffer", 211. oldal.
A félreértések elkerülése végett kiemelném, hogy az index puffer alkalmazható TRIANGLESTRIP esetén is. A TRIANGLESTRIP ugyanis nem zárja ki annak lehetőségét, hogy 1-1 vertex redundánsan jelenjen meg komplexebb geometria esetén, amin az indexeléssel sokat javíthatunk. Tehát nem az a kérdés, hogy TRIANGLESTRIP vagy index puffer, mivel ezek különálló témakörök, amelyeken egyenként el kell gondolkoznunk.
Üdv,
Nyisztor Károly
http://www.nyisztorkaroly.org
| < Előző | Következő > |
|---|





