Jestem w trakcie opracowywania sposobu pakowania wszystkich informacji potrzebnych fizycznie odroczonym renderowaniu do bufora G bez używania nieprzyzwoitych treści ilość celów renderowania.

Do tej pory mam 4 wektory 3-częściowe:

  • Albedo / Diffuse
  • Normal
  • Styczna
  • Pozycja

I 4 pojedyncze komponenty

  • Metaliczne
  • Szorstkość
  • Wysokość
  • Okluzja otoczenia

Naiwnym podejściem jest połączenie jednego z pojedynczych elementów w kanał alfa (czwarty) z jednym z 3-częściowych wektorów, co jest moim obecnym kierunkiem badań. Jednak biorąc pod uwagę, że cztery 4-kanałowe obiekty renderowania zmiennoprzecinkowego o pełnej precyzji nie są małe, rozumiem, że często używa się reprezentacji o połowie dokładności, a nawet mniejszych, aby być bardziej świadomym pamięci.

Pytam o to: które komponenty mogę bezpiecznie obniżyć precyzję bez utraty jakości io ile?

Odpowiedź

Po pierwsze, w ogóle nie potrzebujesz pozycji w buforze G. Pozycję piksela można zrekonstruować z bufora głębi , znając konfigurację kamery i pozycję xy w przestrzeni ekranu piksela. Możesz więc pozbyć się cały ten bufor.

Zwykle nie potrzebujesz też wektorów stycznych w buforze G. Są potrzebne tylko do konwersji normalnych map z przestrzeni stycznej i do mapowania paralaksy; byłyby one wykonywane podczas przejścia wypełnienia bufora G (kiedy masz styczne z siatki, którą renderujesz), a bufor G przechowuj normalne w świecie lub przestrzeni widoku.

Właściwości materiałów, takie jak kolory, chropowatość i metaliczność, są zwykle tylko 8-bitowymi wartościami w buforze G, ponieważ „pochodzą z 8-bitowych tekstur. AO.

Wysokość również nie jest potrzebna w buforze G, chyba że zamierzasz wykonywać jakieś wieloprzebiegowe mieszanie, które zależy od tego, ale jeśli tego potrzebujesz, prawdopodobnie 8 bitów to na to też wystarczy.

Normalne mogą zyskać na przechowywaniu jako wartości 16-bitowe zamiast 8-bitowych. Half-float jest w porządku, ale 16-bitowy stały punkt jest jeszcze lepszy, ponieważ zapewnia bardziej jednolitą precyzję we wszystkich orientacjach (half-float jest dokładniejszy w pobliżu osi i traci pewną precyzję z dala od nich). Co więcej, możesz wyciąć je z 3 komponentów do 2 za pomocą mapowania ośmiościennego .

Tak więc na koniec dnia minimalne Bufor G może wyglądać następująco:

  • Kolor materiału + metalik: RGBA8
  • Ośmiościenna normalna w przestrzeni świata + szorstkość + AO: RGBA16

i to wszystko! Tylko 12 bajtów na piksel.

Alternatywnie możesz użyć bufora RG16 dla normalnych i przenieść szorstkość + AO do oddzielnego 8-bitowego bufora. To dałoby ci trochę miejsca na rozwój, jeśli w końcu będziesz potrzebować więcej komponentów bufora G o rozmiarach 8-bitowych lub 16-bitowych.

Komentarze

  • Ponadto metaliczność jest często wartością binarną i zakładając, że nie będziesz używać gradientów chropowatości (aby zobaczyć wpływ zmniejszonej precyzji), możesz przechowywać metalowość i szorstkość w pojedynczym 8-bitowym kanale (1 bit dla metaliczności i 7 dla szorstkości).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *