Sombreado con base física - iluminación ambiental / indirecta

15

Implementé un trazado de ruta basado físicamente después de estudiar PBRT por M. Pharr y G. Humphreys. Ahora estoy tratando de aplicar renderizado basado físicamente en gráficos en tiempo real usando OpenGL ES (en una aplicación para iPhone).

Quiero comenzar a usar Oren-Nayar y Cook-Torrance como BRDF difuso y especular, pero tengo un problema: ¿cómo modelo la iluminación indirecta?

En un trazado de ruta (como el contenido en pbrt), la luz indirecta / ambiental se proporciona "automáticamente" desde el algoritmo de trazado de ruta, ya que sigue la ruta de los rayos de luz teniendo en cuenta la iluminación directa e indirecta.

¿Cómo modelo la iluminación indirecta en un render basado físicamente escrito en OpenGL ES, usando gráficos de computadora en tiempo real?

Fabrizio Duroni
fuente

Respuestas:

39

Los gráficos en tiempo real despliegan una variedad de aproximaciones para lidiar con el gasto computacional de simular la iluminación indirecta, compensando entre el rendimiento en tiempo de ejecución y la fidelidad de la iluminación. Esta es un área de investigación activa, con nuevas técnicas que aparecen cada año.

Iluminación ambiental

En el extremo más simple del rango, puede utilizar la iluminación ambiental : una fuente de luz omnidireccional global que se aplica a todos los objetos de la escena, sin tener en cuenta las fuentes de luz reales o la visibilidad local. Esto no es del todo exacto, pero es extremadamente barato, fácil de modificar para un artista y puede verse bien dependiendo de la escena y el estilo visual deseado.

Las extensiones comunes a la iluminación ambiental básica incluyen:

  • Haga que el color ambiental varíe direccionalmente, por ejemplo, utilizando armónicos esféricos (SH) o un pequeño mapa de cubos , y buscando el color en un sombreador basado en el vector normal de cada vértice o píxel. Esto permite cierta diferenciación visual entre superficies de diferentes orientaciones, incluso donde no les llega la luz directa.
  • Aplique técnicas de oclusión ambiental (AO) incluyendo vértice AO precalculado, mapas de textura AO , campos AO y AO de espacio de pantalla (SSAO) . Todo esto funciona al tratar de detectar áreas como agujeros y grietas donde es menos probable que la luz indirecta rebote y oscurecer la luz ambiental allí.
  • Agregue un mapa de cubo de entorno para proporcionar una reflexión especular ambiental. Un mapa de cubo con una resolución decente (128² o 256² por cara) puede ser bastante convincente para especular en superficies curvas y brillantes.

Iluminación indirecta al horno

El siguiente "nivel", por así decirlo, de técnicas involucra hornear (pre-computación fuera de línea) alguna representación de la iluminación indirecta en una escena. La ventaja de hornear es que puede obtener resultados de muy alta calidad por poco gasto computacional en tiempo real, ya que todas las partes duras se realizan en el horneado. Las desventajas son que el tiempo necesario para el proceso de horneado perjudica la tasa de iteración de los diseñadores de nivel; se requiere más memoria y espacio en disco para almacenar los datos calculados previamente; la capacidad de cambiar la iluminación en tiempo real es muy limitada; y el proceso de horneado solo puede usar información de geometría de nivel estático, por lo que se perderán los efectos de iluminación indirectos de objetos dinámicos como los personajes. Aún así, la iluminación al horno es muy utilizada en los juegos AAA de hoy.

El paso de horneado puede usar cualquier algoritmo de representación deseado, incluido el trazado de ruta, la radiosidad o el uso del motor del juego para generar mapas de cubos (o hemicubos ).

Los resultados se pueden almacenar en texturas ( mapas de luz ) aplicados a la geometría estática en el nivel, y / o también se pueden convertir a SH y almacenar en estructuras de datos volumétricos, como los volúmenes de irradiancia (texturas de volumen donde cada texel almacena una sonda de SH) o mallas tetraédricas . Luego puede usar sombreadores para buscar e interpolar colores de esa estructura de datos y aplicarlos a su geometría renderizada. El enfoque volumétrico permite que la iluminación horneada se aplique a objetos dinámicos, así como a la geometría estática.

La resolución espacial de los mapas de luz, etc. estará limitada por la memoria y otras restricciones prácticas, por lo que puede complementar la iluminación horneada con algunas técnicas de AO para agregar detalles de alta frecuencia que la iluminación horneada no puede proporcionar y responder a objetos dinámicos (como oscurecer la luz indirecta debajo de un personaje o vehículo en movimiento).

También hay una técnica llamada transferencia de radiación precalculada (PRT) , que extiende la cocción para manejar condiciones de iluminación más dinámicas. En PRT, en lugar de hornear la iluminación indirecta en sí, se hornea la función de transferencia desde alguna fuente de luz, generalmente el cielo, hasta la iluminación indirecta resultante en la escena. La función de transferencia se representa como una matriz que transforma los coeficientes SH de origen a destino en cada punto de muestra de horneado. Esto permite cambiar el entorno de iluminación, y la iluminación indirecta en la escena responderá plausiblemente. Far Cry 3 y 4 utilizaron esta técnica para permitir un ciclo continuo de día y noche, con iluminación indirecta que varía según los colores del cielo en cada momento del día.

Otro punto sobre el horneado: puede ser útil tener datos horneados separados para iluminación indirecta difusa y especular. Los mapas de cubos funcionan mucho mejor que SH para especular (ya que los mapas de cubos pueden tener muchos más detalles angulares), pero también ocupan mucha más memoria, por lo que no puede permitirse colocarlos tan densamente como muestras de SH. La corrección de paralaje se puede usar para compensar eso, deformando heurísticamente el mapa de cubos para que sus reflejos se sientan más basados ​​en la geometría a su alrededor.

Técnicas en tiempo real.

Finalmente, es posible calcular la iluminación indirecta totalmente dinámica en la GPU. Puede responder en tiempo real a cambios arbitrarios de iluminación o geometría. Sin embargo, nuevamente existe una compensación entre el rendimiento del tiempo de ejecución, la fidelidad de la iluminación y el tamaño de la escena. Algunas de estas técnicas necesitan una GPU robusta para funcionar, y solo pueden ser factibles para tamaños de escena limitados. También suelen admitir un solo rebote de luz indirecta.

  • Un mapa de cubos de entorno dinámico, donde las caras del mapa de cubos se vuelven a representar cada fotograma utilizando seis cámaras agrupadas alrededor de un punto elegido, puede proporcionar reflexiones ambientales decentemente buenas para un solo objeto. Esto se usa a menudo para el automóvil del jugador en juegos de carreras, por ejemplo.
  • Iluminación global del espacio de pantalla , una extensión de SSAO que reúne la iluminación de rebote de píxeles cercanos en la pantalla en un pase de procesamiento posterior.
  • La reflexión de trazado de rayos en el espacio de la pantalla funciona mediante la marcha de rayos a través del búfer de profundidad en un paso posterior. Puede proporcionar reflexiones de bastante alta calidad siempre que los objetos reflejados estén en pantalla.
  • La radiosidad instantánea funciona al rastrear los rayos en la escena utilizando la CPU y colocando un punto de luz en cada punto de impacto del rayo, que representa aproximadamente la luz reflejada saliente en todas las direcciones desde ese rayo. Estas luces, conocidas como luces de punto virtual (VPL), son procesadas por la GPU de la manera habitual.
  • Los mapas de sombras reflectantes (RSM) son similares a la radiosidad instantánea, pero los VPL se generan al representar la escena desde el punto de vista de la luz (como un mapa de sombras) y colocar un VPL en cada píxel de este mapa.
  • Los volúmenes de propagación de luz consisten en cuadrículas 3D de sondas SH ubicadas en toda la escena. Los RSM se procesan y se utilizan para "inyectar" luz de rebote en las sondas SH más cercanas a las superficies reflectantes. Luego, un proceso de relleno de inundación propaga la luz de cada sonda SH a los puntos circundantes en la cuadrícula, y el resultado de esto se utiliza para aplicar iluminación a la escena. Esta técnica también se ha extendido a la dispersión volumétrica de la luz .
  • El trazado de cono de vóxel funciona voxelizando la geometría de la escena (probablemente usando resoluciones de vóxel variables, más finas cerca de la cámara y más gruesas lejos), luego inyectando luz de los RSM en la cuadrícula de vóxeles. Al representar la escena principal, el sombreador de píxeles realiza una "traza de cono", una marcha de rayos con un radio que aumenta gradualmente, a través de la cuadrícula de vóxeles para recoger la luz entrante para el sombreado difuso o especular.

La mayoría de estas técnicas no se usan ampliamente en los juegos de hoy en día debido a problemas para ampliar el tamaño de escenas realistas u otras limitaciones. La excepción es el reflejo del espacio de la pantalla, que es muy popular (aunque generalmente se usa con cubemaps como reserva, para regiones donde falla la parte del espacio de la pantalla).

Como puede ver, la iluminación indirecta en tiempo real es un gran tema e incluso esta respuesta (¡bastante larga!) Solo puede proporcionar una descripción general y un contexto de 10,000 pies para leer más. El enfoque que sea mejor para usted dependerá en gran medida de los detalles de su aplicación en particular, qué restricciones está dispuesto a aceptar y cuánto tiempo tiene para dedicarlo.

Nathan Reed
fuente
Hola @Nathan, gracias por tu respuesta detallada. Sé que este es un gran tema (y un gran tema de estudio). El mayor problema es que la documentación en línea está fragmentada y es difícil encontrar una buena aproximación. Mi proyecto es este goo.gl/Fgo21x : un visor BRDF (inspirado en el visor WDAS) para mostrar los modelos BRDF empíricos y físicos más comunes y que admite el cálculo de colores utilizando datos espectrales: valores de triestímulo. Este es un proyecto educativo para estudiar OpenGL.
Fabrizio Duroni
Creo que un buen primer enfoque podría ser utilizar la extensión común que mencionó: SH o pequeño mapa de cubos + mapa de cubos ambientales (para la reflexión y la refracción). ¿Qué piensa usted al respecto? (Estoy desarrollando esta aplicación después del trabajo durante mis noches de insomnio :)). Gracias nuevamente por la colección de fuentes que vinculó anteriormente (tengo mucho material para estudiar ahora).
Fabrizio Duroni
@FabrizioDuroni ¡Sí! Para un visor BRDF, un ambiente direccional simple más un mapa de cubo ambiental debería ser excelente.
Nathan Reed
Tal vez esto caiga en una de sus categorías, pero ¿no es técnicamente una técnica totalmente en tiempo real el renderizado a todas las caras de un mapa de cubos? Además, ¿no es posible aumentar el ambiente básico con un mapa de cubo de entorno para reflejos difusos también?
@racarate Lo siento, me tomó un tiempo responder, pero sí, ¡tienes razón! Creo que quise mencionar eso, pero lo olvidé. :) De todos modos, lo agregué. (Mencioné el uso de un mapa de cubos para difuso, arriba en el primer punto).
Nathan Reed
5

Este es el principal problema 'difícil' que queda en el CG en tiempo real, y hay muchas investigaciones en curso para resolverlo.

El mayor obstáculo es que en los gráficos de trama, cada componente de la escena se representa 'en el vacío': cada triángulo se representa sin referencia a ningún otro triángulo en la escena, y lo mismo ocurre con los píxeles, a diferencia de los enfoques de trazado de rayos donde cada rayo tiene acceso a toda la escena en la memoria. Por lo tanto, los programadores en tiempo real necesitan usar trucos extravagantes para hacer cosas como reflejos y sombras, y lo mismo se aplica a la iluminación global.

Un método de tiempo de ejecución barato es utilizar mapas de luz horneados, donde ejecuta algo lento pero impresionante como la radiosidad o el trazado de ruta sin conexión primero, luego guarda la información de iluminación junto con sus datos de vértice regulares. Esto es excelente para la geometría estática, pero se vuelve problemático tan pronto como agrega objetos en movimiento. Michal Iwanicki hizo una buena presentación sobre cómo resolvieron esto para 'The Last of Us'.

Los armónicos esféricos se usan mucho en los motores de juego para representar la luz indirecta. Básicamente son una transformación de Fourier a través de la superficie de una esfera, al descartar componentes de alta frecuencia puede obtener una iluminación ambiental visualmente agradable y mayormente precisa en solo 9 coeficientes por color. Unity, por ejemplo, utiliza SH para hornear 'sondas de luz' en varios puntos de la escena, los objetos en movimiento pueden interpolarse entre sondas cercanas para obtener una aproximación de la luz indirecta en su posición. El artículo de Robin Green es básicamente la biblia de esta técnica, pero es bastante pesado.

La técnica actual en este momento parece ser Voxel Cone Tracing, que no implica ningún paso previo al horneado. Yo tampoco estoy muy familiarizado con él, pero, según tengo entendido, implica voxelizar su escena en un mundo de estilo Minecraft de baja resolución, colocar los vóxeles en una estructura espacial rápidamente transitable como un octree, y luego emitir algunos rayos (conos) desde cada punto y verificando a qué vóxeles golpearon para recoger la iluminación de rebote. NVidia está presionando mucho en este momento, y hay documentos aquí y aquí .

Espero que ayude :)

russ
fuente
0

El trazado de ruta es un algoritmo computacionalmente costoso y no es adecuado para el tiempo real. La arquitectura de PBRT tampoco es adecuada para el tiempo real, el objetivo principal de PBRT es resolver la ecuación de representación, utilizando la integración imparcial de Monte Carlo. Consulte https://en.wikipedia.org/wiki/Unditional_rendering para obtener más información.

Sin mucha optimización y restricciones, dudo que pueda alcanzar un rendimiento decente en un dispositivo móvil.

En cualquier caso, el trazado de ruta se puede implementar en OpenGL, sugeriría buscar en sombreadores de cómputo que son muy potentes. OpenGL ES 3.1 admite sombreadores de cómputo con algunas limitaciones menores, en contraste con Desktop GL.

Lea esta página para obtener más información: https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-(Part-I)

¡La mejor de las suertes!

Fred Garnier
fuente