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.