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

december 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 31

Játékanatómia - Quake III bsp - a 2. PVS

2014.09.04. 01:43 :: syam

Az elmúlt 2,5 hónap során többek között ismét előkerült a q3bsp (bezier, nosztalgia stb.) olyannyira, hogy "natív" támogatást kapott az enginemben (importáláskor konverzió nélkül az eredeti fileből készül jelenet). Ehhez azonban a q3bsp renderelésének mélyére kellett ásnom a Q3 forrásának felhasználásával (nem elhanyagolható tényező, hogy a kliens-szerver felépítés miatt nagyon nehéz feltérképezni a működését).

A formátum jellemzője, hogy a jelenet geometriáját (nagyon) szétdarabolva tárolja, amiből következik, hogy (nagyon) nagy mennyiségű drawcall szükséges annak kirajzolásához.

Ezenkívül nem tárol és nem használ portálokat frustum vágáshoz csak és kizárólag PVS-t. Mindezekből következik, hogy a nagy méretű / bonyolult, egybenyíló térrészek gyenge pontjai a formátumnak.
Erre valószínűleg rájöttek a fejlesztők és felhasználtak hozzá egy (nem túl szépen megvalósított) megoldást egy "második PVS-t". 
Ez a 2. PVS egy másik térfelosztást használ (cluster-ek helyett area-kat) és félig-meddig dinamikus. A működése egyszerre izgalmas és hack-szagú:

  • az area-k összeköttetését / láthatóságát tárolja egy mátrix, amely a 2. PVS alapja
  • ajtót "tartalmazó" nyílásokban kell elhelyezni egy ún. areaportal-t, amelynek a bounding boxa bele kell lógjon egy kicsit két (egymással szomszédos) area-ba - ha esetleg többe lóg bele azt a Q3 engine az alábbi "Object %i touching 3 areas at %f %f %f" üzenettel jelzi
  • amikor az ajtó kinyílik vagy bezárul, akkor az adott areaportal a hozzá kapcsolódó két area indexe alapján, a mátrixot módosítja egy flood algoritmussal

A renderelés annyiban módosul, hogy nemcsak a kamera clusterét, hanem area-ját is fel kell használni. Amikor egy adott clustert renderelünk akkor a 2. PVS mátrixából megnézzük, hogy a cluster látható-e a kamera area-jából.

Végül ahhoz, hogy ezeket kezelni is tudjam szükség volt a scriptrendszer bevonására. Ez szerencsére nem okozott különösebb problémát, mert az ajtók kezelése eddig is scripteken keresztül történt így mindössze két sort kellett hozzáadnom a megfelelő scripthez.

A másik kihívás a drawcallok számának (további) csökkentése volt, amelyet a geometria összevonásával lehetett elérni. Mivel sajnos ezt nem lehet megtenni betöltéskor mivel több cluster használhatja ugyanazokat a geometriákat run-time (!) kell ezt a problémát megoldani.
Az alapszintű megoldás szerencsére egyszerű:

  • egybemásolni a jelenet összes geometriáját betöltéskor
  • rendereléskor pedig a látható geometriák index buffereit kell összevonni és azzal renderelni.

Az ördög azonban a részletekben rejlik:

  • mivel ES 2.0 a célplatform, ezért figyelni kell, hogy az összevont geometriában a vertexek száma nem lehet több, mint 65535. Amennyiben ezt meghaladjuk több vertex buffert kell használni.
  • összevonáskor figyelembe kell venni nemcsak a materialokat, hanem a lightmapeket is
  • az index buffereket VBO-zni kell, mert a vertexek is VBO-ban vannak tárolva
  • most jön a legjobb: bizonyos ES implementációk nem szeretik (lezuhan a teljesítmény 60 -> 1 fps) ha egy framen belül több VBO update van ezért az összevont index buffereket is össze kell vonni egy nagy bufferbe
  • a VBO update-nél figyelni kell az ún. buffer orphanage-re ill. érdemes használni a mapbuffer extension-t

Mindezek segítségével elértem, hogy Tegra 3-on (szerintem a jelenleg játékra ajánlott minimális konfig) interaktív framerate-tel fut.

Ezeken kívül még

  • a q3bsp-ben tárolt árnyalási adatokat is át tudtam alakítani az engine-m igényeihez vagyis az eredeti lightgrid adatokat lightprobe-szerűen használom fel
  • betöltöm az entityk nagy részét
  • navmesh felhasználásával az AI is működésre bírható
  • nemcsak a q3bsp formátumot támogatom, hanem rbsp-t (Raven BSP, SW:JK2 + JA használja)
  • 5 (!) évvel ezelőtt már készült a q3bsp-ről egy poszt

 

Ha esetleg valakinek hiányozna ehhez demó, akkor szívesen feltöltöm.

A végén pedig következzen egy SW (Coruscant) kép:

shot_0175

 

és egy ST (Voyager híd) kép:

shot_0192

Szólj hozzá!

Címkék: quake3 tegra vbo bsp tree opengl es Raven software

A bejegyzés trackback címe:

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

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