Sombras en renderizado diferido

12

He leído algunos materiales sobre renderizado diferido, y creo que entiendo lo esencial. Pero lo que no entiendo es cómo logra sombras. El G-buffer, por lo que yo sé, no implica crear un mapa de sombras para cada luz, por lo que estoy confundido sobre cómo el pase de iluminación es consciente de si cada píxel está ocluido o no. Después de todo, un píxel dado que es visible desde la perspectiva de la cámara puede no ser realmente visible desde la perspectiva de una luz dada, y esa geometría oclusiva puede no ser visible desde la perspectiva de la cámara y, por lo tanto, no tiene nada escrito al respecto en el G-buffer .

Si comienza a representar mapas de sombras, entonces parece más o menos lo mismo que el renderizado hacia adelante: representa toda la geometría de la escena para cada luz para representar los mapas de sombras.

Entonces, ¿cómo la representación diferida logra sombras equivalentes a la representación directa?

DeadMG
fuente

Respuestas:

14

El sombreado diferido no hace nada especial para las sombras. Todavía necesita renderizar los mapas de sombras normalmente y luego renderizar cada luz con el mapa de sombras apropiado vinculado como una textura.

Todavía es mejor que el renderizado hacia adelante porque no es necesario volver a dibujar la escena en la vista principal para aplicar la iluminación. Dibujar el mapa de sombras a menudo es mucho más barato que dibujar más pases en la vista principal porque no necesita sombrear píxeles, y los mapas de sombras a menudo contienen menos de la escena (puede seleccionar muchas más cosas).

Las personas a veces hacen "sombras diferidas" para una luz, típicamente la luz direccional principal. La razón principal para hacer esto es usar mapas de sombras en cascada u otro enfoque que use múltiples mapas de sombras para la misma luz. Puede reservar un canal en el G-buffer para una máscara de sombra (blanco donde está iluminado, oscuro donde está sombreado) y aplicar todos los mapas de sombra en cascada en este canal G-buffer; entonces el sombreador para la luz solo lee la máscara de sombra y la multiplica en el color claro. Esto es bueno ya que desacopla las sombras del sombreado, pero aún está dibujando los mismos mapas de sombras.

Nathan Reed
fuente
1
Si es extremadamente inteligente, puede intentar usar un sombreador de geometría durante la creación del GBuffer para 'en línea' la creación del mapa de sombras (como lo hace la muestra del mapa de cubos DX10). No estoy seguro de si se ha hecho, si es del todo posible, o si sería más lento en el final - pero traería la creación de mapas de sombras más cerca de sombreado diferido, o en la definición dependiendo de su religión.
Jonathan Dickinson el
6

Bueno, ¿qué es un mapa de sombras? Un mapa de sombras es una textura cuyos texels responden una pregunta simple: a qué distancia de la luz, en la dirección representada por el texel, ¿está ocluida la luz? Las coordenadas de textura se generan usando varios medios de texturas proyectivas, dependiendo del algoritmo de mapeo de sombras particular.

La textura proyectiva es simplemente una forma de transformar un objeto en el espacio de la textura (y sí, sé que suena al revés. Pero así es como funciona). Los algoritmos de mapeo de sombras usan varios tipos diferentes de transformaciones. Pero en última instancia, estas son solo transformaciones de un espacio a otro.

Al representar el mapa de sombras, toma los vértices de su geometría y los transforma a través de una tubería de representación estándar. Pero la cámara y las matrices de proyección están diseñadas para su posición y dirección de luz, no para la posición y orientación de la vista.

Cuando se procesa hacia adelante con un mapa de sombras, se procesa el objeto como normal, transformando los vértices en el espacio de la cámara de visualización y a través de la matriz de proyección de visualización. Sin embargo, también transforma los vértices a través de su cámara de luz y matrices de proyección, pasándolos como datos por vértice al sombreador de fragmentos. Los usa a través de texturas proyectivas para acceder a la textura de la sombra.

Aquí está el punto importante. El acceso de textura proyectivo está diseñado de tal manera que la ubicación a la que accede en la textura representa la dirección entre ese punto en la superficie (el punto que está renderizando en el sombreador de fragmentos) y la luz. Por lo tanto, recupera el texel que representa la profundidad a la que se produce la oclusión del fragmento que se procesa.

Pero no hay nada especial en esta tubería. No tiene que transformar las posiciones de los vértices en la textura de la sombra y pasarlas al sombreador de fragmentos. Puede pasar las posiciones de vértice del espacio mundial al sombreador de fragmentos y luego hacer que el sombreador de fragmentos las transforme en el espacio proyectivo de la textura de la sombra. De acuerdo, estarías desperdiciando mucho rendimiento, ya que obtendrás exactamente las mismas coordenadas de textura. Pero es matemáticamente viable.

De hecho, podría pasar las posiciones de vértice del espacio de la cámara de visualización al sombreador de fragmentos. Luego podría transformarlos en mundo, luego en espacio de cámara de luz, luego en el espacio proyectivo de textura de sombra. Podría poner toda esa transformación en una matriz (dependiendo de su algoritmo de proyección de sombra). Nuevamente, esto le da exactamente lo que tenía antes, por lo que cuando se procesa hacia adelante, no hay razón para hacerlo.

Pero en el renderizado diferido , ya tiene la vista de las posiciones del vértice del espacio de la cámara. Tienes que hacerlo, de lo contrario no puedes hacer la iluminación. Usted desperdició una gran cantidad de memoria y ancho de banda al escribirlos en un búfer, o fue inteligente y los recalculó utilizando el búfer de profundidad y varias matemáticas (que no voy a analizar aquí, pero está cubierto en línea).

De cualquier manera, tiene que ver las posiciones del espacio de la cámara. Y, como se indicó anteriormente, podemos aplicar una matriz para transformarlos desde el espacio de la cámara de visualización en el espacio de textura proyectiva de sombra. Entonces ... haz eso. Luego acceda a su mapa de sombras.

Problema resuelto.

Nicol Bolas
fuente
¿Es posible excluir la geometría por luz en el renderizado diferido (en aras de la optimización)?
Samaursa
@Samaursa: ¿"Excluir geometría por luz" de qué? ¿De entrar en el mapa de sombras? ¿De ser encendido?
Nicol Bolas
Veo que respondiste la pregunta al respecto, gracias. Para otros, si quieren seguir la pregunta / respuesta: gamedev.stackexchange.com/q/178755/2287
Samaursa