Introducción a la tecnología de ray tracing espectral
(larswander.com)- El ray tracing espectral es un método que, en lugar de usar rayos que solo transportan valores RGB, también maneja la longitud de onda y la fase para generar una distribución espectral de potencia (SPD) por píxel.
- El ray tracing convencional, por rendimiento, hace el trazado inverso desde la cámara hacia la fuente de luz y simplifica los rayos como si fueran partículas con un vector RGB.
- El ojo humano construye el color a partir de las respuestas de tres tipos de conos sensibles a longitudes de onda cortas, medias y largas; un mismo color puede provenir de SPD distintas.
- En escenas donde la longitud de onda afecta el recorrido y el color de la luz, como la dispersión o la interferencia de películas delgadas, una aproximación solo con RGB puede no ser suficiente.
- Un ray tracer espectral sin dependencias, hecho en JavaScript y GLSL, se usa como herramienta para crear colores y movimientos irreales en arte computacional donde las leyes de la luz se modifican deliberadamente.
Cámaras creadas con código y ray tracing
- En el arte computacional, tanto la escena como la cámara se crean con código, y el resultado del renderizado se convierte en un arreglo de valores RGB.
- El ray tracing hace rebotar rayos entre objetos virtuales y modela las trayectorias de la luz que pasan entre una cámara simulada y las fuentes de luz.
- Por rendimiento, no se rastrea tal cual el movimiento real de la luz, sino que se usan varias simplificaciones.
- Como la mayoría de los rayos de una fuente de luz no llegan a la cámara, no se parte de la fuente de luz, sino que se traza en sentido inverso desde el punto de vista de la cámara.
- Este trazado inverso es físicamente válido bajo el supuesto de simetría T, según el cual las leyes de propagación de la luz son simétricas respecto de la dirección del tiempo.
- Una simplificación aún mayor es tratar los rayos no como ondas, sino como partículas con un vector de color RGB.
- Aunque ignora la naturaleza ondulatoria de la luz, en muchas escenas produce resultados físicamente plausibles.
- Esta aproximación es posible gracias a que el ojo humano tiene tres tipos de células sensibles al color, sensibles a longitudes de onda cortas, medias y largas.
El ojo no responde a RGB, sino al espectro
- La luz real normalmente no está compuesta por una sola longitud de onda, sino por una distribución espectral de potencia (SPD) que mezcla varias longitudes de onda.
- Un único color percibido por una persona puede corresponder a muchas SPD; este fenómeno se llama metamerismo.
- Por ejemplo, el amarillo puede verse como una sola longitud de onda cerca de los 580 nm.
- En dispositivos que solo usan RGB, como los monitores de computadora, el amarillo también se reproduce combinando luz roja y verde.
- También existen colores no espectrales, como el magenta, que no pueden producirse con una sola longitud de onda.
- El magenta no está en una única posición del espectro.
- Requiere una combinación de luz de longitudes de onda bajas y altas, es decir, azul y roja.
- El proceso de convertir una SPD en color puede tratarse matemáticamente.
- Existe una conexión cuantitativa entre la física, la fisiología y la experiencia subjetiva del color.
- Esa conexión está contenida en los espacios de color CIE 1931, creados en 1931.
- Para implementarlo directamente, se puede consultar el capítulo sobre color de Physically Based Rendering.
Escenas donde la longitud de onda cambia el resultado
- En ray tracing no siempre es necesario considerar el espectro completo ni la longitud de onda de cada rayo.
- Sin embargo, en algunas escenas las propiedades ondulatorias de la luz afectan directamente su trayectoria y, como resultado, también cambian el color visible.
- Un ejemplo representativo es la dispersión.
- La trayectoria de la luz se curva de manera distinta según la longitud de onda.
- Esto corresponde al fenómeno por el cual un prisma separa la luz blanca en sus frecuencias constituyentes.
- Otro ejemplo es la interferencia de películas delgadas (thin film interference).
- Explica los patrones tipo arcoíris que se ven en las burbujas de jabón.
- La luz reflejada en las capas superior e inferior del borde de la película de jabón produce interferencia constructiva y destructiva.
- Este proceso, más que separar el espectro en longitudes de onda individuales, aumenta o reduce la contribución de ciertas partes del espectro.
- Como resultado, suelen producirse colores no espectrales como cian verdoso, teal, magenta y marrón.
Qué maneja el ray tracing espectral
- El ray tracing espectral es ray tracing que toma en cuenta las propiedades ondulatorias de la luz.
- En lugar de calcular el mundo solo con colores RGB, genera una distribución espectral de potencia para cada píxel de la escena.
- Usa tanto la longitud de onda como la fase de los rayos para estimar mejor el color en situaciones donde esa información es importante.
- Es especialmente útil cuando la longitud de onda y la fase cambian el color resultante, como en la dispersión o la interferencia de películas delgadas.
Uso en arte computacional
- En trabajos recientes se usa un enfoque que rompe deliberadamente las leyes de cómo se mueve la luz y crea con código cámaras de un universo ligeramente distinto al real.
- Permite manejar la riqueza del espectro completo de la luz y, al mismo tiempo, modificar las reglas de propagación de la luz de maneras irreales.
- Las obras publicadas se generaron con un ray tracer espectral en JavaScript y GLSL, escrito a mano y sin dependencias.
- Entre los trabajos de ejemplo se incluyen los siguientes:
- Light Doesn't Bend That Way #1, 2023
- Generado haciendo que el ángulo de reflexión sea una función de la longitud de onda.
- Este proceso parece generar solo colores espectrales.
- Untitled, 2023
- Obra en proceso para la serie FULL_SPECTRUM, presentada en Tokio en 2023.
- Untitled, 2023
- Disponible como Video 3.
- En este sistema, se trata como especialmente importante el proceso de hacer que la obra se mueva.
- Untitled, 2024
- Light Doesn't Bend That Way #1, 2023
1 comentarios
Opiniones de Hacker News
Si quieren intentar hacerlo ustedes mismos, el e-book gratuito Ray Tracing Gems II 1 trata sobre ray tracing en GPU en tiempo real basado en APIs modernas y aceleración por hardware, y también tiene un capítulo sobre renderizado espectral.
En particular, corresponde el capítulo 42, “Efficient spectral rendering on the GPU for predictive rendering”.
1 https://www.realtimerendering.com/raytracinggems/rtg2/
Como introducción muy rápida, también recomiendo Ray Tracing in One Weekend 1, y si después quieren profundizar, Physically Based Rendering [2] es una buena opción.
1 https://raytracing.github.io/
[2] https://pbrt.org/
No tengo tiempo para meter mano directamente en ray tracing, pero al hojear la primera parte del libro, el muestreo por alias (alias sampling) me pareció una técnica muy elegante y buena.
Es útil en un contexto mucho más amplio que los gráficos, así que me quedé pensando que ojalá la hubiera conocido antes.
Hay varios ejemplos de trazadores de rayos espectrales.
Mitsuba es un renderizador open source de investigación con muchas funciones interesantes, como renderizado diferenciable: https://www.mitsuba-renderer.org/
Maxwell tiene dos modos espectrales con distintos niveles de precisión, y el enfoque más complejo se usa a menudo en óptica: https://maxwellrender.com/
Manuka de Wētā FX es un renderizador espectral y se usó en varias películas de largometraje: https://dl.acm.org/doi/10.1145/3182161 y https://www.wetafx.co.nz/research-and-tech/technology/manuka
Si quieren ver su estructura interna, pero los de producción a gran escala les resultan demasiado complejos, recomiendo mirar esta implementación.
Es un excelente ejemplo de algo cercano a la configuración mínima de un trazador de caminos espectral: https://github.com/TomCrypto/Lambda
También están Indigo Renderer y el open source LuxRender.
https://indigorenderer.com
https://luxcorerender.org
En mi opinión, el renderizado espectral es un buen ejemplo de que el ray tracing en sí no es el destino final del renderizado, sino más bien el punto de partida.
A veces veo un clima de que el ray tracing en tiempo real ya resolvió el problema del renderizado, pero creo que eso está lejos de la realidad.
Según tengo entendido, la mayoría de los sistemas de renderizado espectral no manejan la interferencia en películas delgadas ni otros efectos basados en ondas, así que esa también es otra frontera.
La realidad tiene una cantidad sorprendente de detalles.
A medida que el renderizado se acerque más a los principios físicos subyacentes, los motores de juegos se irán convirtiendo cada vez más en motores de simulación de mundos.
A medida que varios componentes de motor que hoy suelen estar separados converjan hacia un punto común, por ejemplo, podría reducirse la distinción entre la capa de física y la capa de renderizado.
Me pregunto si esta tendencia ya se observa en cierta medida.
Cuando la capacidad de cómputo aumente varios órdenes de magnitud más, las abstracciones actuales también se verán como formas determinadas por limitaciones técnicas del pasado, tal como hoy vemos la tecnología de punta de hace 30 años.
Es como un fractal: cuanto más de cerca miramos, aparecen más detalles que influyen en lo que vemos.
Nos estamos acercando poco a poco al renderizado 100% físicamente preciso, pero probablemente nunca lleguemos al 100% y sigamos sumando pequeños porcentajes.
Además de decir que la realidad tiene una cantidad sorprendente de detalles, también está la polarización de la luz1, que pocos implementan pero que puede producir efectos bastante notorios en ciertas escenas.
Un excelente motor de ray tracing espectral es LuxRender: https://luxcorerender.org/
Eso sí, me refiero a versiones anteriores; el renderizador LuxCore actual no tiene soporte espectral completo.
Además de los efectos mencionados aquí, el renderizado espectral tiene más ventajas.
Si se implementa con un enfoque de trazado de luz, más adelante se pueden cambiar el color, el espectro y la intensidad de las fuentes de luz, y en muchas escenas la iluminación indirecta también se vuelve mucho más precisa.
Si quieres jugar con una implementación de ray tracing, escribir una por tu cuenta es sorprendentemente fácil.
Hay un muy buen libro gratuito (https://raytracing.github.io/books/RayTracingInOneWeekend.ht...) y, si sabes un poco de Unity, también es bueno este tutorial basado en GPU (https://medium.com/@jcowles/gpu-ray-tracing-in-one-weekend-3...).
La versión de Unity tiene una GUI que facilita la vista previa de la escena y el movimiento de la cámara, así que es más cómoda de tocar.
Si no quieres escribirlo desde cero, hay muchas implementaciones basadas en estos materiales, pero definitivamente vale la pena intentarlo por tu cuenta.
Mientras jugaba con una implementación básica, probé hacer que los rayos se movieran como partículas, curvando su trayectoria hacia los objetos o en sentido contrario, o recordar el último ángulo de reflexión para usarlo en el siguiente choque con un material.
La mayoría de los resultados no fueron gran cosa, pero me dio intuición sobre lo que estaba viendo, y mover un poco la cámara también ayuda muchísimo.
Es un proyecto de programación pequeño, de hobby, realmente divertido.
Eso sí: cuando se intersecta con un objeto, se reduce mucho la longitud máxima del rayo, desde ese punto se disparan varios rayos alrededor y a cada choque se le aplica algo parecido a una ecuación de gravedad.
Por supuesto es lento y solo aproximado, pero es fácil, y hasta permite implementar cosas como un objeto agujero negro que curva la luz dentro de la escena.
Cuando escribí mi primer ray tracer, no me tomó todo el fin de semana; fueron unas cuatro páginas de código C escritas en una noche.
http://canonical.org/~kragen/sw/aspmisc/my-very-first-raytra...
Después hice ray tracers en Clojure y Lua, y un ray marcher en JavaScript; pueden ser muy pequeños y simples.
Anoche vi Spongy de mentor/TBC https://www.pouet.net/prod.php?which=53871, y es un ray tracer de animación fractal con niebla hecho con 65 instrucciones en código máquina; el ejecutable para MS-DOS mide 128 bytes.
Como las imágenes de ray tracing son tan impresionantes, es fácil sentirse intimidado y pensar que los algoritmos y las estructuras de datos para crearlas también deben ser muy difíciles, pero si ya sabes vectores 3D, en realidad son bastante simples.
Siento que el ray marching con SDF es más simple que un ray tracer tradicional al estilo Whitted, porque reemplaza gran parte de la matemática complicada para resolver intersecciones exactas con la geometría de la escena por un algoritmo de aproximación secuencial muy simple.
Los ray tracers extremadamente pequeños, como Spongy o el bootsector raytracer de Oscar Toledo G. https://github.com/nanochess/RayTracer, muchas veces son más difíciles de entender que implementaciones un poco más grandes.
Para hacerlos tan pequeños se necesitan muchos trucos, y esos trucos son más difíciles de entender que código sencillo.
Para llegar hasta el final, habría que rastrear no solo la longitud de onda de cada rayo, sino también la polarización y la fase.
Esas propiedades rara vez afectan la percepción humana real, salvo en casos como películas delgadas o redes de difracción, pero sin duda existen.
Se ve la belleza de que las matemáticas y la física realmente funcionen.
Me pregunto si algunos de los ajustes introducidos por estética podrían ser útiles también en otros métodos de visualización.
También me recuerda cuando copiaba a mano código de un libro para hacer música polifónica en una Apple II.
Al ejecutarlo, claramente algo estaba mal, pero en vez de ruido áspero salieron patrones de tonos extrañamente bellos, y ese error accidental fue bastante fascinante.
Me pregunto si no se podrían crear imágenes con muchos más de 3 canales, como las imágenes hiperespectrales.
Alguna vez lo investigué para resaltar el espectro y enseñarles mejor los colores a los niños.
Por ejemplo, pasando el mouse sobre un píxel en una imagen1, se mostraría el espectro para reforzar la relación entre color y espectro.
Pero las imágenes hiperespectrales son raras y, tradicionalmente, las cámaras[2] eran caras.
Entonces, ¿qué tal imágenes hiperespectrales sintéticas?
Un renderizador de navegador de muy baja resolución quizá podría ser lo bastante rápido como para jugar interactivamente con la iluminación y los materiales.
También se podrían implementar perspectivas como las de personas con anomalías en la visión del color, humanos que “pueden ver UV después de la extracción del cristalino por cataratas”, mamíferos no primates dicromáticos (ratones/perros) o peces cebra tetracromáticos.
1 http://www.ok.sc.e.titech.ac.jp/res/MSI/MSIdata31.html
[2] Cámara multiespectral barata que usa iluminación de banda estrecha multiplexada en el tiempo: https://ubicomplab.cs.washington.edu/publications/hypercam/
El valor final de la imagen es la transformación de los aportes de cada fuente de luz y, como conocemos el espectro de las fuentes, también podemos obtener el espectro del píxel.
Sin embargo, si aparece dispersión significativa o efectos de películas delgadas, habría que muestrear la longitud de onda para cada trayectoria, así que se vuelve un enfoque más aproximado.
Estaba pensando en implementar refracción en mi ray tracer distribuido
Es un enfoque probabilístico, no paralelo: https://en.m.wikipedia.org/wiki/Distributed_ray_tracing
Creo que bastaría con muestrear frecuencias al azar, calcular ese color y luego usarlo para ajustar el color del rayo
Para corregir que el color de la refracción pura quede en 1/3 del brillo, hay que multiplicar el resultado por 3
Según recuerdo, el término viene de uno de los papers de Rob Cook en SIGGRAPH
Como concepto más general e integrado, conviene pasarse al path tracing, y también es más fácil encontrar tips y técnicas al buscar o investigar
Al combinar renderizado espectral y refracción, sí, hay que muestrear una distribución para elegir frecuencias
En general puede ser complicado, así que conviene construirlo paso a paso
Lo mismo aplica a la reflexión, pero en ambos casos depende de si quieres usar materiales dependientes de la frecuencia
Incluso usando materiales simplificados, todavía hay razones para usar un enfoque espectral