2010-09-23 43 views
7

No estoy seguro si esto es posible, pero vale la pena intentarlo. Estoy usando el stencil buffer para reducir los volúmenes de descubierto por la luz en un procesador diferidos utilizando este algoritmo (cuando la cámara está fuera del volumen):OpenGL stencil buffer O operación?

  1. Uso de un sombreado barato, retroceder caras con las pruebas de la profundidad establecida en LEQUAL , marcándolos en el buffer de esténcil.
  2. Usando el costoso sombreador de iluminación, dibuje las caras frontales con la prueba de profundidad establecida en GEQUAL.

Esto causará que solo los píxeles dentro del volumen de luz queden sombreados. El problema con esto viene cuando dibujas luces múltiples. Primero, dado que los cambios de estado son costosos, probablemente no sea la mejor idea cambiar repetidamente entre el sombreador barato y el caro para cada luz. Idealmente, me gustaría aprovechar los 8 bits de la memoria intermedia de plantilla al representar 8 volúmenes ligeros con el sombreador barato seguido de 8 volúmenes ligeros con el costoso sombreador. Sin embargo, surgen problemas cuando las luces se superponen, ya que no hay forma de saber qué píxeles pertenecen a qué luces.

La solución que me viene a la mente sería usar 1 bit en el buffer de esténcil por luz. Por lo tanto, para light n, marque n th bit en la memoria intermedia de esténcil en el pase barato, luego solo renderice píxeles con esa bit activada durante el pase costoso.

No he utilizado anteriormente el búfer de estarcido, pero por lo que estoy leyendo esto no parece posible. Para que esto funcione, tendría que configurar el buffer de esténcil usando OR a nivel de bit y la función de estarcido debería ser Y a nivel de bit. Sin embargo, las únicas operaciones en el búfer del esténcil que puedo ver son: MANTENER, CERO, REEMPLAZAR, INCR, DECR e INVERTIR, y las únicas funciones son: NUNCA, SIEMPRE, MENOS, IGUAL, LEQUAL, GEQUAL, MAYOR Y NOTAQUAL.

¿Hay alguna manera de obtener de alguna manera este comportamiento OR y AND utilizando el buffer de esténcil? Y si no, ¿existe un enfoque alternativo para rendir de manera eficiente volúmenes ligeros?

Respuesta

6

Para obtener el comportamiento de actualización OR, use glStencilMask combinado con GL_REPLACE. Para obtener el comportamiento de prueba AND, use el parámetro glStencilFuncmask combinado con GL_EQUAL. En ambos casos, querrá que el parámetro ref en glStencilFunc sea 0xff.

+0

AWESOME! Esto es exactamente lo que estaba buscando. Muchas gracias! – Gumgo

Cuestiones relacionadas