Path tracing

De Wikipedia, la enciclopedia libre

El Trazado de caminos es un método de Monte Carlo de gráficos por computadoras para el renderizado de imágenes de escenas tridimensionales de tal manera que la iluminación global sea fiel a la realidad. Fundamentalmente, el algoritmo está integrando sobre toda la iluminancia que llega a un solo punto de la superficie de un objeto. Esta iluminación se reduce entonces por una función de reflectancia de la superficie (BRDF) para determinar cuánto de esta se destinará a la cámara. Este procedimiento de integración se repite para cada píxel de la imagen de salida. Cuando se combina con modelos físicamente exactos de las superficies, modelos precisos de las fuentes reales de luz (bombillas), y cámaras ópticamente correctas, el trazado de caminos puede producir imágenes fijas que son indistinguibles de las fotografías.

El trazado de caminos simula naturalmente muchos efectos que tienen que ser añadidos específicamente a otros métodos (trazado de rayos convencional o renderizado por exploración de líneas), tales como sombras suaves, profundidad de campo, desenfoque de movimiento, cáusticas, oclusión ambiental y la iluminación indirecta. Una implementación de un renderizador que incluya estos efectos es correspondientemente más simple.

Debido a su exactitud e imparcial naturaleza, el trazado de caminos se utiliza para generar imágenes de referencia cuando se prueba la calidad de otros algoritmos de renderizado. Con el fin de obtener imágenes de alta calidad con el trazado de caminos, un gran número de rayos deben ser procesados para evitar ruido visible.

Historia[editar]

La ecuación de renderizado y su uso en gráficos por computadora fue presentada por James Kajiya en 1986. El trazado de caminos se introdujo entonces como un algoritmo para encontrar una solución numérica de la integral de la ecuación de renderizado. Una década más tarde, Lafortune sugirió muchos refinamientos, incluyendo el trazado de caminos bidireccional.

El Transporte de luz de metrópolis, un método para perturbar caminos previamente encontrados con el fin de aumentar el rendimiento de escenas difíciles, fue introducido en 1997 por Eric Veach y Leonidas J. Guibas.

Más recientemente, CPUs y GPUs se han convertido en lo suficientemente potente como para renderizar imágenes más rápidamente, provocando un interés más generalizado en algoritmos de trazado de caminos. Tim Purcell presentó por primera vez un algoritmo de iluminación global que se ejecuta en una GPU en 2002. En febrero de 2009 Austin Robison, de Nvidia, mostró la primera aplicación comercial de trazador de caminos que se ejecuta en una GPU, y otras implementaciones han seguido, como la de Vladimir Koylazov en agosto de 2009. Esto se vio favorecido por la maduración de kits de herramientas de programación GPGPU como CUDA y OpenCL y SDKs de trazado de rayos para GPU como OptiX.

Descripción[editar]

La ecuación de renderizado sigue tres principios particulares de la óptica: el Principio de iluminación global, el Principio de Equivalencia (luz reflejada es equivalente a la luz emitida), y el Principio de Dirección (luz reflejada y luz dispersada tienen una dirección). En el mundo real, los objetos y las superficies son visibles debido al hecho de que ellos están reflejando la luz. Esta luz reflejada entonces ilumina otros objetos a su vez. Desde esta simple observación, los siguientes principios siguen.

I. Para una escena de interior dado, todos los objetos de la habitación debe contribuir iluminación a todos los demás objetos.

II. En segundo lugar, no hay distinción que debe hacerse 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 iluminancia uniforme que sale de la superficie. Esto obligó a todas las superficies a ser "de Lambert", o "perfectamente difusas". Mientras que la radiosidad recibió mucha atención en su inicio, las superficies perfectamente difusas no existen en el mundo real. La comprensión de que la dispersión de una superficie depende de los dos sentidos 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 objetivo de una investigación que resultó en la publicación de ideas importantes a lo largo de la década de 1990, ya que tener en cuenta la dirección siempre dio lugar a fuertes incrementos en los tiempos de cálculo de las computadoras.

III. La iluminación procedente de superficies se deben dispersar en una dirección particular, que es una función de la dirección de entrada de la iluminación que llega, 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 caminos, que aproxima una solución de la ecuación, se mantiene 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 son difíciles o simulados incorrectamente por el algoritmo.

Hay algunos fenómenos ópticos que no se incluyen en esta ecuación pero sí en el trazado de caminos. Por ejemplo:

Algoritmo[editar]

El siguiente pseudocódigo es un procedimiento para realizar el trazado de caminos ingenuo. Esta función calcula una sola muestra de un píxel, donde sólo se considera el recorrido de recogida

 Color TracePath(Ray r, depth) {
   if (depth == MaxDepth) {
     return Black;  // Suficientes rebotes.
   }
 
   r.FindNearestObject();
   if (r.hitSomething == false) {
     return Black;  // No hubo intersección.
   }
 
   Material m = r.thingHit->material;
   Color emittance = m.emittance;
 
   // Escoger dirección aleatoria y continuar.
   Ray newRay;
   newRay.origin = r.pointWhereObjWasHit;
   newRay.direction = RandomUnitVectorInHemisphereOf(r.normalWhereObjWasHit);  
   
   // Calcular la BRDF para este rayo (asumir reflección difusa)
   float cos_theta = DotProduct(newRay.direction, r.normalWhereObjWasHit);
   Color BDRF = 2 * m.reflectance * cos_theta;
   Color reflected = TracePath(newRay, depth + 1);
 
   // Aplicar la ecuación de renderizado aquí.
   return emittance + (BDRF * reflected);
 }

Todas estas muestras deben ser promediadas para obtener el color de salida. Tenga en cuenta que este método de muestrear siempre un rayo al azar en el hemisferio de la normal sólo funciona bien para las superficies perfectamente difusas. Para otros materiales, generalmente se tiene que usar muestreo por importancia, es decir, probabilísticamente seleccionar un nuevo rayo de acuerdo con la distribución de la 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 resplandor - es cero. En estas situaciones, se debe dividir la reflectancia por la función de densidad de probabilidad del esquema de muestreo, como por integración Monte-Carlo (en el caso ingenuo anterior, no existe un esquema de muestreo particular, por lo que la función de densidad de probabilidad resulta ser 1). Hay otras consideraciones a tener en cuenta para garantizar la conservación de la energía. En particular, en el caso ingenua, la reflectancia de un BRDF difusa no debe superar o el objeto va a reflejar más luz de la que recibe (esto sin embargo depende del esquema de muestreo utilizado, y puede ser difícil obtenerlo bien).

Hay otras consideraciones a tener en cuenta para garantizar la conservación de la energía. En particular, en el caso ingenuo, la reflectancia de una BRDF difusa no debe superar o el objeto va a reflejar más luz de la que recibe (esto sin embargo depende del esquema de muestreo utilizado, y puede ser difícil obtenerlo bien).

Trazado de caminos bidireccional[editar]

El muestreo de la integral de un punto se puede hacer mediante el uso de cualquiera de los dos siguientes enfoques:

  • Disparando rayos de las fuentes de luz y crear caminos en la escena. Disparos rayos de las fuentes de luz y crear caminos en la escena. El camino se corta en un número aleatorio de rebotes y la luz resultante se envía a través del pixel proyectado en la imagen de salida. Durante el renderizado, se crean miles de millones de caminos, y la imagen de salida es la media de todos los píxeles que recibió alguna contribución.
  • Recopilando rayos desde un punto en una superficie. Un rayo se proyecta desde la superficie a la escena en una trayectoria de rebote que termina cuando se interseca una fuente de luz. luz es enviada hacia atrás a través del camino y al píxel de salida. La creación de un único camino es llamado una "muestra". Para un solo punto en una superficie, se toman aproximadamente 800 muestras (hasta un máximo de 3.000 muestras). La salida final del píxel es la media aritmética de todas las muestras, no la suma.

Rastreo trayecto bidireccional combina disparo y la recolección en el mismo algoritmo para obtener una convergencia más rápida de la integral. Un camino de disparo y un camino de recogida se tracean de forma independiente, y luego la cabeza de la trayectoria de disparo se conectado a la cola del recorrido de recogida. La luz se atenúa luego en cada rebote y de vuelta el píxel. Esta técnica al principio parece paradójicamente más lenta, ya que por cada muestra de recolección, además, traceamos un camino de disparo. En la práctica sin embargo, la velocidad extra de la convergencia es mucho mayor que cualquier pérdida de rendimiento del rayo adicional.

Rendimiento[editar]

El trazado de caminos continuamente muestras píxeles de una imagen. La imagen comienza a ser reconocible después de sólo unas pocas muestras por píxel, quizás 100. Sin embargo, para que la imagen "converja" y reducir el ruido a niveles aceptables por lo general toma alrededor de 5.000 muestras para la mayoría de las imágenes, y mucho más para los casos patológicos. El ruido es un problema especialmente para las animaciones, dándoles una calidad normalmente no deseado de motas al azar.

El cuello de botella central en el rendimiento del trazado de caminos es el complejo cálculo geométrico de lanzar un rayoEl muestreo por importancia es una técnica motivada a emitir menos rayos a través de la escena, mientras que todavía convergen correctamente a la luminancia de salida en el punto de la superficie. Esto se hace lanzando 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 mucho menos rayos fueron lanzados. Muestreo por importancia se utiliza para hacer coincidir la densidad de rayos a la ley del coseno de Lambert, y también se utiliza para que coincida con lasBRDFs. .

Transporte de luz de Metropolis puede dar una imagen de menor ruido con menos muestras. Este algoritmo fue creado con el fin de conseguir una convergencia más rápida en las escenas en las que la luz debe pasar a través de pasillos o agujeros pequeños con el fin de llegar a la parte de la escena que la cámara está observando. También se ha mostrado prometedor en el correcto renderizado de situaciones patológicas con cáusticas. En lugar de generar trayectorias aleatorias, nuevos caminos de muestreo se crean como leves mutaciones de los ya existentes. En este sentido, el algoritmo "recuerda" los caminos de éxito de las fuentes de luz a la cámara.

Funciones de distribución de dispersión[editar]

Funciones de distribución de dispersión

Las propiedades reflectivas (cantidad, dirección y color) de las superficies se modelan mediante BRDFs. El equivalente para luz transmitida (la luz que pasa a través del objeto) son BSDFs. Un trazado de caminos puede aprovechar al máximo las complejas funciones de distribución, cuidadosamente modeladas o medidas, que controlan la apariencia ("material", "textura" o "sombreado" en términos de gráficos por ordenador) de un objeto.

Referencias[editar]

Enlaces externos[editar]