Sunt „în proces de a afla cum să împachetez toate informațiile de care am nevoie pentru un Renderer diferit bazat fizic într-un G-Buffer fără a utiliza un obscen cantitatea de ținte de redare.

Ceea ce am până acum sunt 4 vectori în 3 părți:

  • Albedo / Diffuse
  • Normal
  • Tangent
  • Poziție

Și 4 componente simple

  • Metalice
  • Rugozitate
  • Înălțime
  • Ocluzie ambientală

O abordare naivă este de a grupa una dintre componentele unice în canalul alfa (al patrulea) cu unul dintre vectorii din 3 părți, care este linia mea actuală de investigație. Cu toate acestea, având în vedere că patru ținte de redare cu virgulă mobilă de 4 canale cu precizie completă nu sunt „mici, înțeleg că este obișnuit să folosești jumătate de precizie și reprezentări chiar mai mici pentru a fi mai conștient de memorie.

Ceea ce îmi cer este: ce componente pot reduce în siguranță precizia fără a pierde calitatea și cu cât?

Răspunde

În primul rând, nu aveți deloc nevoie de poziție în bufferul G. Poziția unui pixel poate fi reconstituită din buffer-ul de adâncime , cunoscând configurarea camerei și poziția xy a spațiului pe ecran al pixelului. Deci puteți scăpa de acel tampon întreg.

De asemenea, nici nu aveți nevoie de vectori tangenți în tamponul G. Acestea „sunt necesare doar pentru conversia hărților normale din spațiul tangent și pentru maparea paralaxă; acestea ar fi făcute în timpul pasului de umplere a tamponului G (când aveți tangente din rețeaua pe care o redați), iar tamponul G ar fi doar stocați valori normale în spațiul lumii sau vizualizați.

Proprietățile materialului, cum ar fi culorile, rugozitatea și metalicul, sunt de obicei doar valori de 8 biți în bufferul G, deoarece acestea provin din texturi de 8 biți. La fel pentru AO.

Înălțimea nu este, de asemenea, necesară în bufferul G, cu excepția cazului în care veți face un fel de amestecare multi-pass care depinde de acesta, dar dacă aveți nevoie de el, probabil 8 biți sunt suficient și pentru asta.

Normalii pot beneficia de a fi stocate ca valori pe 16 biți, mai degrabă decât pe 8 biți. Half-float este în regulă, dar punctul fix pe 16 biți este chiar mai bun, deoarece vă oferă o precizie mai uniformă pe toate orientările (half-float este mai precis în apropierea axelor și pierde o anumită precizie departe de ele). Mai mult, le puteți tăia de la 3 componente la 2 folosind mapare octaedrică .

Deci, la sfârșitul zilei, un minim G-buffer ar putea arăta ca:

  • Culoarea materialului + metalic: RGBA8
  • Octaedru spațiu-lume normal + rugozitate + AO: RGBA16

și asta este tot! Doar 12 octeți pe pixel.

Alternativ, puteți utiliza un tampon RG16 pentru normale și puteți muta rugozitatea + AO într-un tampon separat de 8 biți. Asta vă va oferi ceva spațiu pentru a crește dacă în cele din urmă aveți nevoie de mai multe componente tampon G de dimensiuni de 8 sau 16 biți.

Comentarii

  • De asemenea, metalism este adesea o valoare binară și, presupunând că nu veți utiliza gradienți de rugozitate (pentru a vedea impactul preciziei reduse), puteți stoca metalitatea și rugozitatea într-un singur canal de 8 biți (1 bit pentru metalitate și 7 pentru rugozitate).

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *