Programación sobre tarjetas gráficas con OpenGL y GLSL

OpenGL
GLSL
C++
Universidad

Deferred rendering

Implementación de la técnica de renderizado de deferred rendering o renderizado diferido. Esta técnica es útil en los casos en los que en una escena se encuentran muchos objetos los cuales se tapan unos a otros. Además, su utilidad se ve intensificada en el caso de una escena con una gran cantidad de luces pues, gracias a esta técnica, el número de operaciones de cálculo de iluminación se reduce considerablemente. En este proyecto se comparan las dos técnicas de forward rendering y deferred rendering ante diferentes situaciones.

¿Cómo funciona?

El renderizado estandar, el llamado forward rendering, ejecuta un shader de fragmento por cada fragmento resultante de cada objeto de la escena. Esto quiere decir que, si varios objetos se superponen unos encima de otros, los fragmentos que pertenecen a partes de objetos ocultas se calcularán y posteriormente serán descartados pues solo se dibujará el fragmento del objeto más cercano. Si hay muchos objetos y muchas luces se ha de calcular la iluminación de muchos fragmentos que finalmente no se verán conllevando una gran pérdida de cómputo. Para ello se utiliza la metodología de deferred rendering.

Para mitigar este problema el renderizado diferido divide el renderizado en dos pasos. Uno el llamado geometry pass en el que se crean texturas con la información de la posición, color, normal y cualquier información relevante para el sombreado. En estas texturas únicamente está la información del fragmento final. Por lo tanto, en una segunda fase del renderizado, el lighting pass en el que se calcula la imagen final y la ilumiación, no es necesario calcular la iluminación para cada objeto sino que únicamente una vez por cada fragmento final haciendo uso de la información de las texturas. Para más información sobre esta técnica visitar Learn OpenGL.
Imagen con muchos objetos y luces renderizada con deferred shading.

Shader de cómputo

Visualización de partículas.
Implementación de un shader de cómputo en coordinación con OpenGL que permite paralelizar el cálculo de simulaciones de partículas. Se tiene en cuenta el tamaño del grupo en relación al número de partículas para así conseguir un cómputo eficiente.

Shaders de teselsación y geometria

Utilización de shaders de teselación para modificar la geometría de diferentes partes de un objeto esférico. Se disminuye el número de vértices en las zonas mas alejadas y aumentan en las zonas más cercanas para lograr detalle con un número menor de vértices en la escena. Se tiene control sobre los límites de zonas con diferente densidad de vértices para evitar discontinuidades entre mallas.

El shader de geometría transforma la posición de cada vertice y además cambia el tipo de primitiva de dibujado a quads. Por cada vértice se crea un quad con una textura aplicada que simula una esfera, técnica conocida como técnica del impostor. Además, la posición de cada quad se traslada con el tiempo simulado un explosión simple.

Visualización aplicando el shader de geometría y de teselación.

Mapas de sombras

La metodología usada consiste en obtener una textura con la información de profundidad renderizando la escena desde la posición de la luz. Posteriormente, dicha textura se utiliza a la hora de renderizar la imagen final desde la posición de la cámara para determinar si un fragmento se encuentra en zona de sombra o zona de luz. Para ello, se ha de transformar las coordenads de los fragmentos final al sistema de coordenadas de la luz para poder saber qué texel de la textura de profundidad le corresponde.

Comparación mapas de sombras con filtros.

Iluminación de hemisferio, iluminación basada en imágenes e iluminación basada en armónicos esféricos

Diferentes métodos de iluminación. La iluminación por hemisferio crea una iluminación ambiente no uniforme suponiendo que la iluminación proveniente de la parte superior es más luminosa que la proveniente de la zona inferior. La iluminación basada en imágenes se basa en el cálculo de la iluminación de los objetos a partir de un mapa de entorno que actúa como luz de la escena. La iluminación con armónicos esféricos pretende obtener los mismos resultados que con la basada en imágenes pero con una aproximación procedural en la que se simplifica la imagen haciendo uso de armónicos esféricos prescindiendo de información inecesaria de la imagen.

Comparación distintas técnicas de iluminación.

Mapeado de normales, de paralaje y de brillos

Imagenes de comparación de diferentes técnicas de mapeado de normales y paralaje.
Implementación de mapas de color, mapas de brillo que determinan la componente especular de la luz en cada punto y mapa de normales simple, con paralaje simple y con paralaje iterativo.

Texturas, reflejos y refracción

Aplicar texturas a objetos, objetos con reflejos a partir de mapas de entorno creando efecto de objetos metálicos, objetos con apariencia de cristas mediante refracción utilizando refracción con índice duplicado (y doble refracción para el caso de la esfera), las ecuaciones de Fresnel y la dispersión cromática de la luz.

Formas de calcular la ilumunación

Imágenes ejemplo de las técnicas básicas de iluminación.
Implementación de diferentes metodologías para el cálculo de la iluminación. Iluminación por vértice o por pixel usando una luz puntual o una luz focal.

Jugando con los shaders de vértice y fragmento

Jugando modificando la posición de los vértices y descartando fragmentos en el shader de fragmento.

Comparando modo retenido e inmediato de OpenGL

Se ha probado e implementado una misma escena usando las dos metodologias y se han comprado. El modo retenido es más sencillo y abstracto pero mucho menos eficiente que el modelo inmediato con el cual tienes mayor control a bajo nivel de la tubería gráfica.