2010-09-23 10 views
7

Non sono sicuro che sia possibile farlo, ma ne vale la pena. Sto utilizzando stencil buffer per ridurre overdraw per volumi leggeri in un rendering differito utilizzando questo algoritmo (quando la telecamera è fuori del volume):OpenGL stencil buffer OPPURE operazione?

  1. Uso di uno shader economico, inconveniente facce con il test di profondità impostato LEQUAL , contrassegnandoli nel buffer degli stencil.
  2. Utilizzando il costoso shader di illuminazione, disegnare le facce anteriori con il test di profondità impostato su GEQUAL.

Ciò farà sì che solo i pixel all'interno del volume di luce siano ombreggiati. Il problema con questo viene quando si disegnano più luci. Innanzitutto, poiché i cambiamenti di stato sono costosi, probabilmente non è la migliore idea per passare ripetutamente da uno shader economico a uno costoso per ogni luce. Idealmente mi piacerebbe sfruttare tutti gli 8 bit del buffer degli stencil rendendo 8 volumi leggeri con lo shader economico seguito da 8 volumi leggeri con il costoso shader. Tuttavia, i problemi sorgono quando le luci si sovrappongono, poiché non c'è modo di dire quali pixel appartengono a quali luci.

La soluzione che viene in mente sarebbe quella di utilizzare 1 bit nel buffer stencil per luce. Quindi, per la luce n, contrassegnare il n bit nel buffer dello stampino nel passaggio economico, quindi eseguire il rendering dei pixel con quel bit durante il passaggio costoso.

Non ho usato il buffer stencil prima, ma da quello che sto leggendo questo non sembra possibile. Per farlo funzionare dovrei impostare il buffer stencil usando OR bit a bit e la funzione stencil dovrebbe essere bit a AND. Tuttavia, le uniche operazioni sul buffer degli stampini che riesco a vedere sono: KEEP, ZERO, REPLACE, INCR, DECR e INVERT e le uniche funzioni sono: MAI, SEMPRE, MENO, EQUAL, LEQUAL, GEQUAL, GREATER e NOTEQUAL.

Esiste un modo per ottenere in qualche modo questo comportamento OR e AND utilizzando il buffer stencil? E se no, esiste un approccio alternativo per il rendering efficiente dei volumi leggeri?

risposta

6

Per ottenere il comportamento di aggiornamento ORing, utilizzare glStencilMask combinato con GL_REPLACE. Per ottenere il comportamento del test di ANDing, utilizzare il parametro mask combinato con GL_EQUAL. In entrambi i casi, il parametro ref deve essere impostato su glStencilFunc su 0xff.

+0

FANTASTICO! Questo e 'esattamente quello che stavo cercando. Grazie mille! – Gumgo

Problemi correlati