El trazado de ruta es un método de Monte Carlo de gráficos por computadora para representar imágenes de escenas tridimensionales de manera que la iluminación global sea fiel a la realidad. Básicamente, el algoritmo está integrando toda la iluminancia que llega a un único punto de la superficie de un objeto. Esta iluminancia se reduce luego mediante una función de reflectancia de superficie ( BRDF) para determinar cuánto se destinará a la cámara del mirador. Este procedimiento de integración se repite para cada píxel de la imagen de salida. Cuando se combina con modelos de superficies físicamente precisos, modelos precisos de fuentes de luz reales (bombillas) y cámaras ópticamente correctas, el trazado de la trayectoria puede producir imágenes fijas que son indistinguibles de las fotografías.
El trazado de ruta simula de forma natural muchos efectos que deben agregarse específicamente a otros métodos ( trazado de rayos convencional o renderizado de línea de exploración ), como sombras suaves , profundidad de campo , desenfoque de movimiento , cáusticos , oclusión ambiental e iluminación indirecta. La implementación de un renderizador que incluya estos efectos es correspondientemente más simple. Se realiza una versión ampliada del algoritmo mediante el seguimiento de la trayectoria volumétrica , que considera la dispersión de la luz de una escena.
Debido a su precisión y naturaleza imparcial , el trazado de ruta se utiliza para generar imágenes de referencia cuando se prueba la calidad de otros algoritmos de renderizado . Para obtener imágenes de alta calidad a partir del trazado de trayectorias, se debe trazar una gran cantidad de rayos para evitar artefactos ruidosos visibles .
Historia
La ecuación de renderizado y su uso en gráficos por computadora fue presentada por James Kajiya en 1986. [1] El trazado de ruta se introdujo entonces como un algoritmo para encontrar una solución numérica a la integral de la ecuación de renderizado. Una década más tarde, Lafortune sugirió muchos refinamientos, incluido el trazado de rutas bidireccionales. [2]
El transporte ligero de Metropolis , un método para perturbar caminos previamente encontrados con el fin de aumentar el rendimiento en escenas difíciles, fue introducido en 1997 por Eric Veach y Leonidas J. Guibas .
Más recientemente, las CPU y GPU se han vuelto lo suficientemente potentes como para renderizar imágenes más rápidamente, lo que genera un interés más generalizado en los algoritmos de rastreo de rutas. Tim Purcell presentó por primera vez un algoritmo de iluminación global que se ejecuta en una GPU en 2002. [3] En febrero de 2009 Austin Robison de Nvidia demostró la primera implementación comercial de un trazador de ruta que se ejecuta en una GPU [4] , y otras implementaciones han seguido, como el de Vladimir Koylazov en agosto de 2009. [5] Esto fue ayudado por la maduración de los kits de herramientas de programación GPGPU como CUDA y OpenCL y SDK de trazado de rayos GPU como OptiX .
El trazado de rutas ha jugado un papel importante en la industria cinematográfica. Las películas anteriores se habían basado en renderizadores de línea de escaneo para producir animación y efectos visuales generados por computadora . En 1998, Blue Sky Studios realizó el cortometraje Bunny, ganador del Premio de la Academia, con su renderizador de trazado de ruta CGI Studio, que presenta sombras suaves y efectos de iluminación indirecta. Sony Pictures Imageworks ' Monster House era, en 2006, el primer largometraje de animación que se rinde totalmente en un trazador de ruta, usando el comercial de Arnold procesador. Además, Walt Disney Animation Studios ha estado usando su propio trazador de ruta optimizado conocido como Hyperion desde la producción de Big Hero 6 en 2014. [6] Pixar Animation Studios también ha adoptado el trazado de ruta para su renderizador comercial RenderMan .
Descripción
La ecuación de representación de Kajiya se adhiere a tres principios particulares de la óptica; el Principio de iluminación global, el Principio de Equivalencia (la luz reflejada es equivalente a la luz emitida) y el Principio de Dirección (la luz reflejada y la luz dispersa tienen una dirección).
En el mundo real, los objetos y las superficies son visibles debido al hecho de que reflejan la luz. Esta luz reflejada luego ilumina otros objetos a su vez. De esa simple observación se siguen dos principios.
I. Para una escena interior determinada, cada objeto de la habitación debe aportar iluminación a todos los demás objetos.
II. En segundo lugar, no se puede hacer ninguna distinción entre la iluminación emitida por una fuente de luz y la iluminación reflejada por una superficie.
Inventado en 1984, un método bastante diferente llamado radiosidad era fiel a ambos principios. Sin embargo, la radiosidad relaciona la iluminancia total que cae sobre una superficie con una luminancia uniforme que sale de la superficie. Esto obligó a todas las superficies a ser lambertianas o "perfectamente difusas". Si bien la radiosidad recibió mucha atención en su invocación, las superficies perfectamente difusas no existen en el mundo real. La comprensión de que la dispersión de una superficie depende de las direcciones de entrada y salida es el principio clave detrás de la función de distribución de reflectancia bidireccional (BRDF). Esta dependencia de la dirección fue un foco de investigación que dio como resultado la publicación de ideas importantes a lo largo de la década de 1990, ya que la contabilidad de la dirección siempre tuvo un precio de fuertes aumentos en los tiempos de cálculo en las computadoras de escritorio. Sigue el Principio III.
III. La iluminación que proviene de las superficies debe dispersarse en una dirección particular que es alguna función de la dirección de entrada de la iluminación de llegada y la dirección de salida que se muestrea.
La ecuación de Kajiya es un resumen completo de estos tres principios, y el trazado de la ruta, que aproxima una solución a la ecuación, permanece fiel a ellos en su implementación. Hay otros principios de la óptica que no son el foco de la ecuación de Kajiya y, por lo tanto, a menudo el algoritmo los simula de forma incorrecta o difícil. El Path Tracing se confunde con fenómenos ópticos que no están contenidos en los tres principios. Por ejemplo,
- Y nítidas brillantes cáusticos ; el resplandor se escala por la densidad de la iluminancia en el espacio.
- Dispersión del subsuelo ; una violación del principio III anterior.
- Aberración cromática , fluorescencia , iridiscencia ; la luz es un espectro de frecuencias.
Algoritmo
El siguiente pseudocódigo es un procedimiento para realizar un rastreo de ruta ingenuo. La función TracePath calcula una sola muestra de un píxel, donde solo se considera la ruta de recopilación.
Color tracepath ( Ray ray , recuento de profundidad ) { if ( profundidad > = MaxDepth ) { volver negro ; // Rebotó suficientes veces. } rayo . FindNearestObject (); if ( ray . hitSomething == false ) { volver negro ; // No se golpeó nada. } Material material = rayo . thingHit -> material ; Emitancia de color = material . emitancia ; // Elige una dirección aleatoria desde aquí y continúa. Ray newRay ; newRay . origen = rayo . pointWhereObjWasHit ; // ¡Esta NO es una distribución ponderada por coseno! newRay . dirección = RandomUnitVectorInHemisphereOf ( ray . normalWhereObjWasHit ); // Probabilidad del newRay const float p = 1 / ( 2 * M_PI ); // Calcula el BRDF para este rayo (asumiendo una reflexión lambertiana) flotador cos_theta = dotProduct ( NewRay . dirección , ray . normalWhereObjWasHit ); Color BRDF = material . reflectancia / M_PI ; // Trace recursivamente las fuentes de luz reflejada. Color entrante = TracePath ( newRay , profundidad + 1 ); // Aplique la ecuación de renderizado aquí. devolver emitancia + ( BRDF * entrante * cos_theta / p ); } void Render ( Image finalImage , count numSamples ) { foreach ( píxel en imagen final ) { foreach ( i en numSamples ) { Rayo r = cámara . generateRay ( píxel ); píxel . color + = TracePath ( r , 0 ); } píxel . color / = numSamples ; // Muestras promedio. } }
Luego, todas las muestras se promedian para obtener el color de salida. Tenga en cuenta que este método de muestrear siempre un rayo aleatorio en el hemisferio normal solo funciona bien para superficies perfectamente difusas. Para otros materiales, generalmente se tiene que usar muestreo por importancia, es decir, seleccionar probabilísticamente un nuevo rayo de acuerdo con la distribución del BRDF. Por ejemplo, un material perfectamente especular (espejo) no funcionaría con el método anterior, ya que la probabilidad de que el nuevo rayo sea el rayo reflejado correcto, que es el único rayo a través del cual se reflejará cualquier radiación, es cero. En estas situaciones, se debe dividir la reflectancia por la función de densidad de probabilidad del esquema de muestreo, según la integración de Monte-Carlo (en el caso ingenuo anterior, no hay un esquema de muestreo en particular, por lo que la PDF resulta ser 1).
Hay otras consideraciones a tener en cuenta para asegurar la conservación de la energía. En particular, en el caso ingenuo, la reflectancia de un BRDF difuso no debe exceder o el objeto reflejará más luz de la que recibe (sin embargo, esto depende del esquema de muestreo utilizado y puede ser difícil de acertar).
Seguimiento de ruta bidireccional
El muestreo de la integral se puede realizar mediante cualquiera de los siguientes dos enfoques distintos:
- Trazado de ruta hacia atrás , donde las rutas se generan comenzando desde la cámara y rebotando alrededor de la escena hasta que encuentran una fuente de luz. Esto se conoce como "hacia atrás" porque las trayectorias de inicio desde la cámara y el movimiento hacia la fuente de luz es opuesta a la dirección en la que la luz realmente viaja. Todavía produce el mismo resultado porque todos los sistemas ópticos son reversibles.
- Rastreo de luz (o rastreo de ruta hacia adelante ), donde las rutas se generan a partir de las fuentes de luz y rebotan alrededor de la escena hasta que encuentran la cámara.
En ambos casos, se puede utilizar una técnica llamada Estimación del próximo evento para reducir la varianza. Esto funciona probando directamente una característica importante (la cámara en el caso de Light Tracing , o una fuente de luz en el caso de Backwards Path Tracing ) en lugar de esperar a que una ruta la golpee por casualidad. Esta técnica suele ser eficaz, pero se vuelve menos útil cuando hay BRDF especulares o casi especulares. Para el rastreo de ruta hacia atrás , esto crea una gran variación para las rutas cáusticas que interactúan con una superficie difusa y luego rebotan en una superficie especular antes de golpear una fuente de luz. La estimación del próximo evento no se puede utilizar para muestrear estos caminos directamente desde la superficie difusa, porque la interacción especular está en el medio. Del mismo modo, no se puede utilizar para muestrear trayectorias desde la superficie especular porque solo hay una dirección en la que la luz puede rebotar. Light Tracing tiene un problema similar cuando los caminos interactúan con una superficie especular antes de golpear la cámara. Debido a que esta situación es significativamente más común y los objetos de vidrio ruidosos (o completamente negros) son muy perjudiciales visualmente, el rastreo de ruta hacia atrás es el único método que se utiliza para el rastreo de ruta unidireccional en la práctica.
El rastreo de ruta bidireccional proporciona un algoritmo que combina los dos enfoques y puede producir una varianza más baja que cualquiera de los métodos por separado. Para cada muestra, se trazan dos caminos de forma independiente: uno utilizando la fuente de luz y otro desde la cámara. Esto produce un conjunto de posibles estrategias de muestreo, donde cada vértice de un camino se puede conectar directamente a cada vértice del otro. Los algoritmos originales Light Tracing y Backwards Path Tracing son casos especiales de estas estrategias. Para Light Tracing , conecta los vértices de la trayectoria de la cámara directamente al primer vértice de la trayectoria de la luz. Para el rastreo de ruta hacia atrás , conecta los vértices de la ruta de luz con el primer vértice de la ruta de la cámara. Además, hay varias estrategias de muestreo completamente nuevas, donde los vértices intermedios están conectados. La ponderación de todas estas estrategias de muestreo mediante Muestreo de importancia múltiple crea un nuevo muestreador que puede converger más rápido que el Trazado de ruta unidireccional, aunque se requiere más trabajo para cada muestra. Esto funciona particularmente bien para cáusticos o escenas que se iluminan principalmente mediante iluminación indirecta.
Actuación
Un trazador de ruta muestrea continuamente los píxeles de una imagen . La imagen comienza a ser reconocible después de solo unas pocas muestras por píxel, quizás 100. Sin embargo, para que la imagen "converja" y reduzca el ruido a niveles aceptables, generalmente se necesitan alrededor de 5000 muestras para la mayoría de las imágenes y muchas más para los casos patológicos . El ruido es particularmente un problema para las animaciones, dándoles una calidad de "grano de película" normalmente no deseada de moteado aleatorio.
El cuello de botella central en el rendimiento de Path Tracing es el complejo cálculo geométrico de proyectar un rayo. El muestreo de importancia es una técnica que está motivada para proyectar menos rayos a través de la escena mientras sigue convergiendo correctamente a la luminancia saliente en el punto de la superficie. Esto se hace proyectando más rayos en direcciones en las que la luminancia habría sido mayor de todos modos. Si la densidad de los rayos emitidos en ciertas direcciones coincide con la fuerza de las contribuciones en esas direcciones, el resultado es idéntico, pero en realidad se emitieron muchos menos rayos. El muestreo de importancia se utiliza para hacer coincidir la densidad de rayos con la ley del coseno de Lambert , y también se utiliza para hacer coincidir los BRDF.
El transporte ligero de Metropolis puede dar como resultado una imagen con menos ruido y menos muestras. Este algoritmo fue creado para lograr una convergencia más rápida en escenas en las que la luz debe atravesar pasillos extraños o pequeños agujeros para llegar a la parte de la escena que está viendo la cámara. También se ha mostrado prometedor para representar correctamente situaciones patológicas con cáusticos. En lugar de generar rutas aleatorias, se crean nuevas rutas de muestreo como ligeras mutaciones de las existentes. En este sentido, el algoritmo "recuerda" las trayectorias exitosas desde las fuentes de luz hasta la cámara.
Funciones de distribución de dispersión
Las propiedades reflectantes (cantidad, dirección y color) de las superficies se modelan utilizando BRDF . El equivalente de luz transmitida (luz que atraviesa el objeto) son BSDF . Un trazador de ruta puede aprovechar al máximo las funciones de distribución complejas, cuidadosamente modeladas o medidas, que controlan la apariencia ("material", "textura" o "sombreado" en términos de gráficos por computadora) de un objeto.
Ver también
- Arnold (software)
- Blender (software) : modelador 3D que integra Cycles , un motor de renderizado acelerado por GPU de trazado de rutas
- Render de octano
- Pixar RenderMan
- LuxCoreRenderer
Notas
- ^ Kajiya, JT (1986). "La ecuación de renderizado". Actas de la decimotercera conferencia anual sobre gráficos por computadora y técnicas interactivas . ACM. CiteSeerX 10.1.1.63.1402 .
- ^ Lafortune, E,Modelos matemáticos y algoritmos de Monte Carlo para la representación basada en la física, (tesis doctoral), 1996.
- ^ Purcell, TJ; Buck, yo; Mark, W; y Hanrahan, P, "Ray Tracing on Programmable Graphics Hardware",Proc. SIGGRAPH 2002, 703 - 712. Véase también Purcell, T,Trazado de rayos en un procesador de flujo(tesis doctoral), 2004.
- ^ Robison, Austin,"Trazado de rayos interactivo en la descripción general de GPU y NVIRT", diapositiva 37, I3D 2009.
- ^ Demostración de Vray; Otros ejemplos incluyen Octane Render, Arion y Luxrender.
- ^Seymour, Mike. "El nuevo renderizador de producción de Disney 'Hyperion' - ¡Sí, Disney!" . fxguide . Consultado el 16 de septiembre de 2017 .
- ^ Veach, E. y Guibas,transporte ligeroLJMetropolis. En SIGGRAPH'97 (agosto de 1997), págs. 65–76.
- SmallPt es un trazador de caminos educativos de Kevin Beason. Utiliza 99 líneas de C ++ (incluida la descripción de la escena). Esta página tiene un buen conjunto de ejemplos de ruido resultante de esta técnica.