Jsem v procesu přípravy, jak zabalit všechny informace, které potřebuji pro fyzicky odložený vykreslovač, do G-bufferu bez použití obscénního obsahu množství cílů vykreslení.
Dosud mám 4 3dílné vektory:
- Albedo / Diffuse
- Normální
- Tangens
- Pozice
A 4 jednotlivé komponenty
- Metalické
- Drsnost
- Výška
- Okolní okluze
Naivním přístupem je svazování jedné z jednotlivých komponent do alfa (čtvrtého) kanálu s jedním z třídílných vektorů, což je můj současný směr vyšetřování. Avšak vzhledem k tomu, že čtyři 4kanálové cíle vykreslení s plovoucí desetinnou čárkou s plnou přesností nejsou malé, chápu, že je běžné používat poloviční přesnost a ještě menší reprezentace, aby si pamatovaly více paměti.
Ptám se: na které komponenty mohu bezpečně snížit přesnost bez ztráty kvality a o kolik?
Odpovědět
Nejprve nepotřebujete vůbec žádnou pozici v G-bufferu. Pozici pixelu lze rekonstruovat z vyrovnávací paměti hloubky , protože znáte nastavení kamery a polohu xy pixelu na obrazovce. Takže se můžete zbavit celý tento buffer.
Rovněž nepotřebujete tangenciální vektory v G-bufferu. „Jsou potřeba pouze pro převod normálních map z tečného prostoru a pro mapování paralaxy; to by se dělo během průchodu výplně G-bufferu (když máte tečny ze sítě, kterou vykreslujete) a G-buffer by pouze ukládat normály do světa nebo do zobrazovacího prostoru.
Vlastnosti materiálu, jako jsou barvy, drsnost a metalíza, jsou obvykle jen 8bitové hodnoty v G-bufferu, protože „pocházejí z 8bitových textur. Totéž pro AO.
V G-bufferu také není potřeba výška, pokud nebudete dělat nějaký druh multi-pass blendingu, který na tom záleží, ale pokud to potřebujete, 8 bitů je pravděpodobně i na to stačí.
Normálům může být prospěšné, když budou uloženy jako 16bitové hodnoty místo 8bitové. Half-float je v pořádku, ale 16bitový pevný bod je ještě lepší, protože vám poskytuje jednotnější přesnost ve všech orientacích (half-float je přesnější v blízkosti os a ztrácí určitou přesnost od nich). Navíc je můžete snížit ze 3 komponent na 2 pomocí oktaedrického mapování .
Takže na konci dne bude minimální G-buffer může vypadat takto:
- Barva materiálu + metalíza: RGBA8
- Osmiboký světový prostor normální + drsnost + AO: RGBA16
a to je vše! Pouze 12 bajtů na pixel.
Alternativně můžete pro normály použít vyrovnávací paměť RG16 a přesunout drsnost + AO do samostatné 8bitové vyrovnávací paměti. To vám dá nějaký prostor pro růst, pokud byste nakonec potřebovali více komponent G-bufferu o 8bitové nebo 16bitové velikosti.
Komentáře
- Také metalita je často binární hodnota a za předpokladu, že nebudete používat přechody drsnosti (abyste viděli dopad snížené přesnosti), můžete metalitu a drsnost uložit do jediného 8bitového kanálu (1 bit pro drsnost a 7 pro drsnost).