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).