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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *