He implementado el algoritmo de volúmenes de propagación de luz en cascada (sin sombreado indirecto todavía) para la iluminación global difusa en tiempo real detallada aquí y aquí . Funciona bien, pero todavía estoy tratando de arreglar un artefacto en particular.
Breve resumen
Puede omitir esto si ya sabe cómo funciona el algoritmo.
El algoritmo funciona almacenando información de iluminación en forma de armónicos esféricos en una cuadrícula 3D, donde inicialmente los datos en cada celda de la cuadrícula provienen de la representación de un mapa de sombra extendido ( mapa de sombra reflectante) que también incluye el color y la información normal, además de la profundidad. La idea es que esencialmente todos los píxeles vistos por una fuente de luz son la causa del primer rebote de iluminación indirecta, por lo que almacena la información requerida junto con el búfer de profundidad ordinario que usa para el mapeo de sombras, y muestrea todos los datos para inicializar la cuadrícula 3D . La información en la cuadrícula 3D luego se propaga iterativamente (para cada iteración) propagando la información en una celda a todos sus 6 vecinos directos (arriba, abajo, izquierda, derecha, arriba, abajo). Para iluminar la escena utilizando la información en la cuadrícula, aplica un pase de pantalla completa sobre su escena, y para cada píxel rasterizado tiene disponible la posición del espacio mundial de la superficie rasterizada (por ejemplo, de G-Buffers en sombreado diferido), de modo que saber a qué celda de la cuadrícula pertenece un determinado píxel en la pantalla.
Esto funciona bien en su mayor parte, aquí hay dos imágenes sin GI simulado y solo un término ambiental codificado, y al lado una imagen con el algoritmo LPV. Observe reflejos de colores en las superficies, mejor detalle de profundidad, etc.
Problema
Al buscar las celdas durante la etapa de iluminación, se utiliza la interpolación trilineal (utilizando filtros de textura de hardware) para interpolar suavemente los datos entre el centro de una celda, sus celdas vecinas y la coordenada de textura buscada real. Esencialmente, esta interpolación imita la propagación de la información de iluminación en el centro de una celda a los píxeles concretos alrededor del centro donde se busca la información. Esto es necesario porque de lo contrario la iluminación se vería muy áspera y fea. Sin embargo, dado que la interpolación trilineal no tiene en cuenta la dirección de propagación de la luz de la información de iluminación codificada en una celda (recuerde, está en armónicos esféricos), la luz puede propagarse incorrectamente al píxel buscado. Por ejemplo, si el resplandor codificado en la celda solo se propaga hacia (1,0,0) ("
Esto ocasiona que la luz se filtre incorrectamente a través de las paredes cuando el tamaño de las celdas en la cuadrícula es grande en comparación con las superficies de la escena (esto es necesario porque se necesitan celdas grandes para propagar la luz en la escena con la menor cantidad de iteraciones de propagación posible). Esto es lo que parece:
Como puede ver (desde los contornos de sombra en la parte superior derecha), la escena está iluminada por una fuente de luz direccional en algún lugar por encima de la escena, en la parte superior izquierda. Y dado que solo hay una celda que separa el exterior de la aurícula y el interior, la luz se filtra y la pared a la izquierda se ilumina incorrectamente.
Pregunta real
El autor sugiere una forma de filtrado anisotrópico manual para solucionar esto. Da un gradiente de radiancia (supongo que los coeficientes SH muestreados desde la celda actual) hacia la dirección de la superficie normal n como:
Y estados
Por lo tanto, al comparar la derivada direccional de radiación con la dirección de radiación real, se puede calcular si la distribución de radiación comienza más allá de su interpolación trilineal para este punto.
Mis preguntas):
En la ecuación, la función c (x) parece ser los coeficientes SH en el punto (x). Por lo tanto, el gradiente de radiancia parece calcularse como un derivado numérico normal como la diferencia ponderada de los coeficientes SH en los puntos x - (n / 2) y x + (n / 2). Sin embargo, ¿qué es c (x) en mi contexto? Actualmente estoy asumiendo que c (x) se refiere a los coeficientes interpolados trilinealmente en la ubicación de la superficie (x), pero no estoy seguro en absoluto, ya que no sé cómo se supone que eso le dará más información sobre el direccional distribución de los coeficientes SH.
¿Y cómo se usa ese gradiente para cambiar exactamente cómo se aplica la iluminación muestreada desde la celda a las superficies, exactamente? El autor simplemente escribe "comparando la derivada direccional del resplandor con la dirección del resplandor real", pero esto es bastante vago.
Menciona el uso de un "esquema de diferenciación central" y hace referencia a estas diapositivas para la diferenciación central de los coeficientes SH, y también hace referencia a este documento que muestra las derivaciones del gradiente, pero en este momento no puedo sacar ninguna conclusión útil de ellos.