HTML

gondolataim elsősorban játékfejlesztésről

Elsősorban játékfejlesztés magyarul: az enginem fejlesztése során felmerülő problémák, ötletek, tévutak stb dokumentálása, amely számomra és talán mások számára is hasznos lehet később Másodsorban gondolatok szavakban...

Kapcsolat:
aalberik 'at' gmail 'dot' com

Haletető

Galéria

Címkék

Összes

Linkblog

Naptár

április 2024
Hét Ked Sze Csü Pén Szo Vas
<<  < Archív
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Vertex optimalizálás

2009.04.04. 20:50 :: syam

Mai agymenésem a vertexenként elküldött adatmennyiség csökkentéséről szól. Ezen adatokat -az új terminológia alapján- vertex attribútumoknak hívjuk, amelyeket 4 db lebegőpontos számnégyes reprezentálja és legalább 9 db van belőlük. Míg a régi terminológiában minden egyes attribútum szerepe és neve meghatározott volt, az újban már csak index jelzi őket. Ezek az alábbiak:

pozíciómindenképp szükséges ennek megléte, ez a renderelés alapja!0
súlyhardveres skinning paraméterei1
normála vertex normál vektora2
elsődleges színtexture environmentben felhasznált szín3
másodlagos színcolor sumban felhasznált szín4
köd koordinátavolumetrikus köd számításkor használt adat5
--6
--7

textúra koordináta

a textúra mintavételezéshez felhasznált adat

 

Megjegyzendő, hogy textúra koordinátákból annyi darab lehetséges, ahány texturázó egység elérhető.

 

A táblázatból látható tehát, hogy vertexenként 9*4 adatot tudunk elküldeni a gpunak, amiből 4-t mindig kötelező elküldenünk. Természetesen minél több adatot küldünk vertexenként annál lassabb futásra számíthatunk hiszen

  1. az adatot el kell juttatni a vertex feldolgozónak
  2. a vertex feldolgozónak el kell végeznie a szükséges műveleteket

ezért törekednünk kell ezek mennyiségének csökkentésére. Erre többféle módszer kínálkozik.

Az első esetben legegyszerűbb, ha csökkentjük a kirajzolandó háromszögek mennyiségét - low poly modellek használata - azonban ez jelentős mértékű minőségromláshoz vezethet.

Hatékonyabb módszer a háromszögek szalaggá történő rendezése, amikor a háromszögek számát nem csökkentjük csak a kirajzolásukhoz szükséges vertexek számát probáljuk meg csökkenteni.

Bizonyos esetekben még tovább csökkenthetjük az adataink számát

  • ha "becsomagoljuk" őket. Ehhez viszont szükséges a vertex program megléte, amellyel a kicsomagolást el tudjuk végezni. Például: vertexenként elküldünk egy pozíciót (xyz) egy színt (rgb) és egy textúra koordinátát(st). Ez összesen 8 db számot jelent vagyis ez a 3 adat pontosan elfér 2 attribútumban három helyett! A kitétel csak annyi, hogy a 0. attribútumot mindenképp használnunk kell, de hogy melyik adatot hova és hogyan pakoljuk az már tőlünk függ.
  • ha csökkentjük a bitek számát, amelyen tároljuk az adatainkat. Például: a vertex pozíció néha elég shorton (2byte) tárolni, de a -1.0...1.0 ill. 0.0....1.0 tartományba eső adatok tárolására sokszor elegendő egy byte is!

A második eset optimalizálására maga a gpu kínál fel egy lehetőséget ún. vertex cache néven. Működése a vertexindexeken alapul vagyis csak indexelt vertexek renderelése esetén kerül sor a felhasználására. A gpu a vertex cache-ben képes bizonyos számú, már feldolgozott vertexet az indexek alapján tárolni és ha ismételten ugyanolyan indexű vertexet küldünk el a gpunak akkor az itt tárolt adatot fogja újra felhasználni megspórolva a feldolgozást.

Természetesen a vertexindexek megfelelő sorbarendezésével mi is sokat tehetünk a vertex cache optimális kihasználása érdekében - megtehetjük ezt akár háromszög szalaggal is és így nemcsak a vertexek számát, hanem azok feldolgozásához időt is csökkentjük, de optimalizált háromszög lista is alkalmas e célra.

Tudomásom szerint még öt hardver szintű vertex optimalizálási technika létezik.

  1. Az első az ún. vertex buffer object, amikor minden statikus információt (vertexek és vertexindexek) feltöltünk a video memóriába így ezen adatok elérésének ideje drasztikusan lerövidül. Animált, dinamikusan változó vertex adatok esetén javasolt a dupla bufferelt vbo. Ilyenkor 2 vbot tartunk fenn a renderelés számára: az egyikbe beírjuk a friss adatokat, a másikból renderelünk majd a következő frameben felcseréljük a 2 vbot.
  2. A vertex adatok átküldését optimalizálhatja a draw_range_elements, amely a függvénnyel megadott indexeken kívül eső vertexeket nem küldi el a gpunak.
  3. A compiled_vertex_array esetén az adott vertex tömböt lezárjuk (lock) így azokat vagy a feldolgozott eredményeket a gpu "compile"-olni(?) tudja.
  4. Néhány esetben előfordulhat, hogy ugyanazzal a vertex tömbbel, több geometriát is akarunk renderelni. Erre az esetre készült a multi_draw_arrays.
  5. Instanced geometry, amelyet viszont még nem használtam...

Nem szabad azonban elfelejtenünk, hogy a vertex optimalizálás legalapvetőbb módszere a csak látható elemek renderelése (frustum cull, occlusion cull stb)!

Szólj hozzá!

Címkék: vbo vertex attributum vertex cache triangle strip

A bejegyzés trackback címe:

https://sakura7.blog.hu/api/trackback/id/tr221046492

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása