Azon vagyok, hogy kidolgozzam, hogyan csomagoljak a fizikai alapú halasztott renderelőhöz szükséges összes információt egy G-pufferbe obszcén használat nélkül. renderelt célok mennyisége.

Eddig 4 db 3 részes vektorom van:

  • Albedo / Diffuse
  • Normál
  • Érintő
  • Pozíció

És 4 egykomponensű

  • Fémes
  • érdesség
  • Magasság
  • Környezeti okklúzió

Naiv megközelítés az, ha az egyes komponenseket az alfa (negyedik) csatornába kötjük a 3 részes vektorok egyikével, ez a jelenlegi vizsgálati vonalam. Tekintettel azonban arra, hogy négy, 4 csatornás, precíziós lebegőpontos renderelési cél nem “kicsi”, megértem, hogy általában félig precíz és még kisebb reprezentációkat használunk a memóriatudatosság növelése érdekében.

Amit kérdezek: melyik alkatrészeket tudnám biztonságosan csökkenteni a pontosság érdekében, anélkül, hogy minőséget vesztenék, és mennyivel?

Válasz

Először is, egyáltalán nincs szüksége pozícióra a G-pufferben. A pixel helyzete rekonstruálható a mélységi pufferből , ismerve a kamera beállításait és a pixel képernyő-tér xy pozícióját. Így megszabadulhat az az egész puffer.

Ezenkívül a G-pufferben általában nincs szükség érintő vektorokra sem. Csak a normál térképek tangens térből történő konvertálására és a parallaxis leképezésre van szükségük; ezeket a G-puffer kitöltési lépés során kell elvégezni (amikor érintők vannak a hálóból, amelyet visszaadunk), és a G-puffer csak tárolja a normálokat a világ vagy a nézet térében.

Az anyagtulajdonságok, például a színek, az érdesség és a metál általában csak 8 bites értékek a G-pufferben, mivel “8 bites textúrákból származnak. AO.

A G-pufferben szintén nincs szükség magasságra, hacsak nem valamiféle többpasszos keverést fogsz csinálni, amely attól függ, de ha mégis szükséged van rá, akkor valószínűleg 8 bit ahhoz is elég.

A normálisak számára előnyös lehet, ha 8 bites helyett 16 bites értékként tárolják őket. A félúszás rendben van, de a 16 bites rögzített pont még jobb, mivel egyenletesebb pontosságot biztosít minden irányban (a félúszó pontosabb a tengelyek közelében, és elveszít némi pontosságot tőlük). Ezenkívül 3 komponensről 2-re vághatja őket a oktaéderes leképezéssel .

Tehát a nap végén egy minimális A G-puffer a következőképpen nézhet ki:

  • Anyagszín + fémes: RGBA8
  • Oktaéderes világtér normál + érdesség + AO: RGBA16

és ez minden! Csak 12 bájt pixelenként.

Alternatív megoldásként használhat RG16 puffert a normálokhoz, és az érdességet + AO külön 8 bites pufferbe helyezheti. Ez megadná némi növekedési hely, ha végül több 8-bites vagy 16-bites G-puffer-összetevőre van szüksége.

Megjegyzések

  • Emellett a fémesség gyakran bináris érték, és feltételezve, hogy nem használ érdességi gradienseket (hogy lássa a csökkent pontosság hatását), a fémességet és az érdességet egyetlen 8 bites csatornában tárolhatja (1 bit a fémességért és 7 az érdességért).

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük