2010-09-23 9 views
7

Nie jestem pewien, czy jest to możliwe, ale warto spróbować. Używam bufor szablonowy w celu zmniejszenia objętości Overdraw dla lekkich w odroczonym renderowania za pomocą tego algorytmu (gdy aparat znajduje się na zewnątrz objętości):Bufor wzorcowy OpenGL LUB operacja?

  1. Korzystanie tani shader, cofać twarze z testów głębokości ustawionej na LEQUAL , zaznaczając je w buforze szablonu.
  2. Za pomocą drogiego modułu cieniującego, narysuj przednie twarze z testem głębokości ustawionym na GEQUAL.

Spowoduje to zacienienie tylko pikseli w obrębie jasności światła. Problem z tym pojawia się podczas rysowania wielu świateł. Po pierwsze, ponieważ zmiany stanu są kosztowne, prawdopodobnie nie jest najlepszym rozwiązaniem, aby wielokrotnie przełączać się między tanim i drogim modułem cieniującym dla każdego światła. Idealnie chciałbym wykorzystać wszystkie 8 bitów bufora szablonu, renderując 8 woluminów za pomocą taniego shadera, a następnie 8 jasnych woluminów za pomocą drogiego shadera. Jednak pojawiają się problemy, gdy światła nakładają się, ponieważ nie ma sposobu, aby powiedzieć, które piksele należą do których świateł.

Rozwiązanie, które przychodzi na myśl, to użycie 1-bitowego bufora szablonu na światło. Tak więc, dla światła n, zaznacz ten bit w buforze szablonu w tanim przejściu, a następnie renderuj piksele z tym bitem podczas kosztownego przejścia.

Nie użyłem wcześniej bufora szablonu, ale z tego, co czytam, nie wydaje się to możliwe. Aby to działało, musiałbym ustawić bufor szablonu za pomocą bitowego OR, a funkcja szablonu musiałaby być bitowa ORAZ. Jednak jedyne operacje widoczne na buforze szablonu to: KEEP, ZERO, REPLACE, INCR, DECR i INVERT, a jedynymi funkcjami są: NIGDY, ZAWSZE, MNIEJ, RÓWNY, LEQUAL, GEQUAL, GREATER i NOTEQUAL.

Czy istnieje sposób, aby jakoś uzyskać zachowanie OR i ANDing przy użyciu bufora szablonu? A jeśli nie, czy istnieje alternatywne podejście do wydajnego renderowania ilości światła?

Odpowiedz

6

Aby uzyskać zachowanie aktualizacji ORing, użyj glStencilMask w połączeniu z GL_REPLACE. Aby uzyskać zachowanie testu ANDing, użyj parametru glStencilFuncmask w połączeniu z . W obu przypadkach parametr ref ma być ustawiony na na 0xff.

+0

NIESAMOWITE! Właśnie tego szukałem. Dziękuję bardzo! – Gumgo

Powiązane problemy