Trazado de ruta

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 14 de junio de 2013; la verificación requiere 31 ediciones .

El trazado de rutas es una  técnica de renderizado en gráficos por computadora que busca simular el comportamiento físico de la luz lo más cerca posible de la realidad. El trazado de rutas es un caso especial avanzado del trazado de rayos tradicional , cuyo algoritmo rastrea los rayos de una cámara virtual a través del espacio; el rayo "rebota" en los objetos hasta que se absorbe o se dispersa por completo. La calidad de las imágenes producidas por el método de rastreo de ruta es generalmente mejor que la calidad de las imágenes producidas por otros métodos de representación, pero el rastreo de ruta es mucho más intensivo desde el punto de vista computacional.  

El rastreo de ruta es el método de renderizado más simple, más preciso físicamente y más lento. El trazado de rutas reproduce naturalmente muchos efectos ópticos que son difíciles de lograr o incluso inalcanzables con otras técnicas de renderizado: sombreado , profundidad de campo, desenfoque de movimiento , cáusticos , oclusión ambiental e iluminación indirecta . Implementar estos efectos ópticos con el trazado de rutas es mucho más fácil que con otras técnicas.   

En función de su precisión y la ausencia de aproximaciones y suposiciones ( inglés  imparcial ), el rastreo de rutas se utiliza para generar imágenes, que luego se utilizan como muestras comparativas para evaluar la calidad de representación de otros algoritmos. Para obtener imágenes de alta calidad generadas por el trazado de trayectorias, es necesario trazar una gran cantidad de rayos; de lo contrario, aparecerán artefactos gráficos en forma de ruido .

Historia

James  Kajiya introdujo la ecuación de renderizado y su aplicación a los gráficos por computadora en 1986 [1] . Esta presentación fue la primera descripción del algoritmo de rastreo de rutas. Más adelante en el año, Lafortune propuso  muchas mejoras al algoritmo, incluido el rastreo de ruta bidireccional [2] .

El transporte ligero de Metropolis para perturbar caminos encontrados previamente para aumentar el rendimiento en escenas complejas, fue presentado en 1997 por Eric  Veach y Leonidas J. Guibas [ 3 ] . 

Después de un tiempo, las GPU alcanzaron tal nivel de desarrollo que pudieron generar interés en ellas en términos de transferirles cálculos de trazado de rutas. Tim Purcell fue el  primero en introducir un algoritmo de iluminación global en 2002 que se ejecutaba en una GPU [4] . En 2009, Vladimir Koilazov demostró la primera implementación comercial del algoritmo de seguimiento de rutas que se ejecuta en una GPU [5] . Esto fue facilitado por la maduración de las herramientas de programación centradas en GPGPU como CUDA y OpenCL .

Descripción

En el mundo real, muchas pequeñas porciones de luz son emitidas por fuentes de luz y se propagan en línea recta como rayos a través del medio y de un objeto a otro, cambiando su color e intensidad. Este "viaje" continúa hasta que los rayos son absorbidos por objetos, incluidos objetos como el ojo humano o una cámara. Este proceso de propagación de rayos se simula mediante el trazado de trayectorias, excepto que los rayos se trazan a la inversa, desde la cámara virtual (observador) hasta la fuente de luz. Esto se debe a que solo una parte muy pequeña de esos rayos que provienen de la fuente de luz inciden en la lente de la cámara virtual, por lo que el cálculo de la mayoría predominante de los rayos no afecta la imagen recibida por la cámara virtual. de cualquier manera.

Este comportamiento se describe matemáticamente en la ecuación de renderizado . Esta ecuación intenta resolver algoritmos de trazado de rutas.

El trazado de rutas no es un simple trazado de rayos con reflejos de rayos ilimitados (es decir, profundidad recursiva). En el trazado de rayos tradicional, la luz se calcula en el momento en que el rayo intersecta directamente una superficie difusa. En el trazado de rutas, se genera aleatoriamente un nuevo rayo dentro del hemisferio del objeto y luego se rastrea hasta que se cruza con una fuente de luz, lo que puede ocurrir o no. Con el trazado de trayectorias, la trayectoria de un rayo puede cruzarse con muchas superficies difusas antes de cruzarse con la fuente de luz.

El pseudocódigo que implementa el seguimiento de rutas podría verse así:

Color TracePath ( Rayo de rayos , profundidad de conteo ) { if ( profundidad >= MaxDepth ) { volver Negro ; // Rebotado suficientes veces. } rayo _ BuscarObjetoMásNearest (); if ( ray . hitSomething == false ) { volver Negro ; // Nada fue golpeado. } material material = rayo . cosaHit -> material ; emitancia de color = material . emisión ; // Elija una dirección aleatoria desde aquí y continúe. Ray nuevoRay ; nuevoRay . origen = rayo . pointwhereObjWasHit ; // ¡Esta NO es una distribución ponderada por coseno! nuevoRay . dirección = RandomUnitVectorInHemisphereOf ( ray . normalWhereObjWasHit ); // Probabilidad del newRay constante flotante p = 1 / ( 2 * M_PI ); // Calcule el BRDF para este rayo (suponiendo una reflexión lambertiana) float cos_theta = DotProduct ( newRay . direction , ray . normalWhereObjWasHit ); Color BRDF = material . reflectancia / M_PI ; // Rastrea recursivamente las fuentes de luz reflejada. Color entrante = TracePath ( newRay , profundidad + 1 ); // Aplicar la Ecuación de Representación aquí. emitancia de retorno + ( BRDF * entrante * cos_theta / p ); } void Render ( Imagen finalImage , cuenta numSamples ) { foreach ( píxel en imagen final ) { foreach ( i en numSamples ) { Rayo r = cámara . generarRay ( píxel ); píxel _ color += TracePath ( r , 0 ); } píxel _ color /= numMuestras ; //Promedio de muestras. } }

En el ejemplo anterior, si cada superficie de espacio cerrado irradiara y reflejara (0.5, 0.5, 0.5), entonces cada píxel de la imagen sería blanco .

Trazado de rayos bidireccional

Puede muestrear la integral de un punto utilizando dos métodos independientes:

  • Dispara rayos  de fuentes de luz y crea caminos en la escena. El camino es interrumpido por un número aleatorio de pasos-rebote del rayo. Luego, la luz se dirige al píxel proyectado de la imagen resultante. Durante este método de representación, se crean millones de rutas y los resultados de la representación de las rutas contribuyentes se almacenan en la imagen.
  • Recopilación de rayos  desde un punto de la superficie. El rayo se dispara a través de los píxeles de la imagen y rebota alrededor de la escena hasta que encuentra una fuente de luz en su camino. Luego, la luz de la fuente de luz se envía en la dirección de los píxeles de la imagen. El proceso de creación de una ruta se llama "muestreo". Un punto de superficie generalmente recibe de 800 muestras (hasta 3 mil). La imagen final se traduce con la ayuda de operaciones aritméticas, no una simple suma de muestras.

El trazado de rayos bidireccional combina Disparo  y  Recopilación  en un algoritmo y esto da como resultado una convergencia de imagen más rápida (más rápida y con menos ruido). Estos 2 métodos de generación de ruta se rastrean de forma independiente y luego el comienzo de la ruta de disparo se conecta a la cola de la ruta de ganancia. La atenuación de la luz en cada rebote del haz se tiene en cuenta y se almacena en píxeles de imagen. Esta técnica parece a primera vista paradójicamente lenta, pero esto se debe al hecho de que se consideran 2 caminos a la vez. En la práctica, por el contrario, la tasa adicional de convergencia de la imagen compensa las ralentizaciones que surgen debido a la necesidad de liberar cada vez más rayos nuevos.

Para acelerar la convergencia (convergencia, acercamiento) de las imágenes, los algoritmos bidireccionales trazan caminos en ambas direcciones. En la dirección de avance, los rayos se trazan desde la fuente de luz hasta que son tan débiles que no se pueden ver, o hasta que golpean la lente de una cámara virtual. En la dirección opuesta, es decir, la dirección convencional estándar, los rayos se trazan desde la cámara virtual hasta que chocan con la fuente de luz, o hasta que el número de sus reflejos supera un cierto límite. Este enfoque generalmente da como resultado una imagen que converge mucho más rápido que usar una sola dirección.

Veach y Guibas dieron una descripción más precisa del trazado de ruta bidireccional [3] :

Estos métodos generan dos subtrayectos: uno a partir de la fuente de luz y el segundo a partir de la lente de la cámara virtual. Luego, los <métodos> consideran todas las rutas que se obtienen concatenando cada prefijo de una subruta con cada sufijo de otra subruta. Esto conduce a una familia de diferentes técnicas de muestreo importantes, que luego se combinan para minimizar las discrepancias.

Texto original  (inglés)[ mostrarocultar]

Estos métodos generan un subcamino que comienza en una fuente de luz y otro que comienza en la lente, luego consideran todos los caminos obtenidos al unir cada prefijo de un subcamino con cada sufijo del otro. Esto conduce a una familia de técnicas de muestreo de diferente importancia para las rutas, que luego se combinan para minimizar la varianza.

Rendimiento

El rastreador de ruta muestrea constantemente ( muestreo en inglés  - muestreo ) píxeles de la imagen. La imagen se vuelve distinguible solo cuando se toman varias muestras por píxel, hasta 100 muestras por píxel. Como regla general, para imágenes normales y para reducir el ruido digital a un nivel aceptable, se toman alrededor de 5000 muestras. Sin embargo, para casos el número de muestras se vuelve mucho mayor El proceso de renderizado puede tardar horas o días, según la complejidad de la escena y el rendimiento del hardware y el software. Las implementaciones actuales de GPU prometen entre 1 y 10 Ms/s, lo que permite generar una imagen relativamente silenciosa de calidad aceptable en segundos o minutos. El ruido digital plantea un problema particular para la animación , creando un efecto "granulado" generalmente indeseable en una imagen.

métodos de transporte ligero de Metropolis modifica ligeramente las rutas exitosas previamente enrutadas y produce primero las muestras más importantes para la imagen. Esto puede resultar en un ruido de imagen reducido y menos muestras.

Es bastante difícil evaluar de manera justa el nivel de rendimiento de un renderizador. Un enfoque es contar muestras por segundo, el otro cuenta la cantidad de rutas que se pueden rastrear y agregar a la imagen por segundo. Los resultados de estos métodos varían considerablemente de una escena a otra y dependen de la "profundidad de la ruta", es decir, cuántas veces se permite que el haz rebote en el objeto antes de que se detenga. El resultado de la medición del rendimiento también depende en gran medida del hardware utilizado. Finalmente, un renderizador puede producir muchas muestras de baja calidad, mientras que otro puede renderizar la imagen final más rápido utilizando menos muestras de mayor calidad.

Funciones de distribución de dispersión

La reflectividad de las superficies (la cantidad de luz reflejada, su dirección y su color) se modela mediante una función de reflectancia de dos haces . El equivalente de la luz transferida (la luz que ha pasado a través del objeto) es la función de dispersión de reflexión de superficie bidireccional ( ing.  Función de distribución de dispersión bidireccional ). El trazador de rutas puede aprovechar al máximo las funciones de distribución complejas, cuidadosamente modeladas o calculadas que definen la apariencia ("material", "textura" y "sombreado" en términos de CG) de un objeto.

Notas

  1. Kajiya, JT, La ecuación de renderizado Archivado el 6 de octubre de 2012 en Wayback Machine , Actas de la 13.ª conferencia anual sobre gráficos por computadora y técnicas interactivas , ACM, 1986
  2. Lafortune, E, Mathematical Models and Monte Carlo Algorithms for Physically Based Rendering Archivado el 24 de abril de 2010 en Wayback Machine , (tesis doctoral), 1996
  3. 1 2 Veach, E. y Guibas, LJ Metropolis light transport Archivado el 16 de mayo de 2017 en Wayback Machine . En SIGGRAPH'97 (agosto de 1997), págs. 65–76.
  4. Purcell, TJ; dólar, yo; Marcos, W; y Hanrahan, P, "Trazado de rayos en hardware de gráficos programables", Proc. SIGGRAPH 2002 , 703 - 712. Véase también Purcell, T, Ray tracing on a Stream Processor. Archivado el 10 de octubre de 2017 en Wayback Machine (tesis doctoral), 2004.
  5. ↑ Demostración de Vray Archivado el 2 de mayo de 2016 en Wayback Machine ; Otros ejemplos incluyen Octane Render, Arion y Luxrender.

Enlaces externos