Optimización de Shadow Maps

He hecho una optimización en las sombras del motor 3D bastante buena, con la que han subido unos 20-25 los Frames Per Second (FPS) en ZXVR con dos luces (la lámpara y el monitor)


Como seguramente debes saber, en la técnica del shadow mapping se representa la escena desde la posición de la luz, para obtener una imagen de profundidad o “búfer Z”. Esta imagen de profundidad se usa a continuación en la representación final desde la cámara, para saber qué píxeles están en sombra y cuáles están iluminados.


shadow_map_example


Pues bien, para representar la escena desde la luz yo lo hacía exactamente igual que para la cámara, así que aunque sólo se estuviera escribiendo en el búfer Z y no hubiera ningún búfer de color, los shaders usados en la escena estaban haciendo todos los cálculos de texturizado e iluminación, vamos, que se estaba calculando el color de los píxeles cuando sólo se usa el valor Z de la posición para escribir en el búfer de profundidad.


La optimización ha consistido en usar un shader simple, muy rápido, durante el dibujado de la escena vista por la luz, en lugar de establecer el shader de cada material de los objetos. Además de que este shader se ejecuta mucho más rápido, el hecho de usar un sólo shader para toda la escena –sin estar cambiando de shader para cada material– implica que no se cambia el estado de OpenGL y se acelera mucho el proceso.


El inconveniente de esta optimización es que no puedo usar geometry shaders para generar geometría, a no ser que en la escena sólo se usase un único shader, o que el objeto con geometry shader no arroje sombras. Por ejemplo, yo uso un geometry shader para representar texto en 3D (cada letra está formada por un solo punto que se expande después a un cuadrilátero), pero como no me importa que el texto no tenga sombras (si se trata del menú de ZXVR por ejemplo), pues le desactivo la escritura en el búfer Z y problema solucionado.


Por eso he hecho que la optimización se use opcionalmente, sólo si la aplicación lo especifica.


Hasta la próxima!