BookinglyTech News
Software

Una apertura hexagonal rompería todas las superficies difusas de su raytracer

Un desarrollador descubre que la cámara y el BSDF difuso de su motor de render comparten el mismo muestreador de disco, así que cambiar la forma de la apertura arrastra todo el material lambertiano.

3 min de lecturaDev.to0 vistas

Un desarrollador que está escribiendo su propio raytracer se topó con un acoplamiento que solo vio cuando se puso a leer su propio código: el mismo muestreador de disco que genera la apertura de la cámara alimenta también las superficies difusas. Si retuerce el primero para conseguir un bokeh hexagonal, arrastra con él todos los materiales lambertianos de la escena.

El sospechoso es una primitiva, SampleUnitDisk, que rechaza puntos aleatorios dentro del cuadrado [-1, 1]² hasta que caen en el disco unidad. El test x² + y² <= 1 es lo único que hace que la figura salga redonda. La variante hexagonal cambia esa comprobación por tres desigualdades con apotema √3/2 ≈ 0,866, que describen un hexágono inscrito en la circunferencia.

Una función, dos llamadas

En el lado difuso esto es el método de Malley: se toma un punto del disco y se proyecta hacia arriba, a lo largo de la normal, sobre el hemisferio. Es la forma habitual de implementar una superficie difusa, y el autor comprueba que PBRT lo hace igual. En el lado de la cámara no hay nada de Malley: se reparte el origen del rayo dentro del disco para fijar el plano de enfoque, de modo que lo que está delante y detrás de ese plano sale desenfocado y lo que cae en él queda nítido. También es un muestreo en el disco unidad.

De ahí la broma incómoda: una sola función, dos consumidores con requisitos distintos. Tocar la apertura para hacer bokeh con forma rompe la otra mitad.

Mirar el render no sirve para detectarlo

El autor lo cazó leyendo código, porque lo había escrito él, y avisa de que eso no es un método. Cualquiera que abra ese archivo dentro de un año puede pasar por alto exactamente lo mismo. La imagen tampoco ayuda: la escena es todo cajas lambertianas, así que el cambio apenas se mueve. Sin dos fotogramas lado a lado, cuesta ver si las sombras se han desplazado, y el propio autor admite que él no lo distinguiría.

Lo más útil del análisis es la derivación. El ángulo sólido se proyecta sobre el disco con un factor coseno, así que un muestreo uniforme del disco levantado al hemisferio tiene densidad p(ω) = cos θ / π. Para una superficie lambertiana, cuyo BRDF es ρ/π, el estimador se cancela entero y cada rebote multiplica la salida por el albedo ρ, el tanto por uno de luz que la superficie devuelve.

Y en ningún punto de esa derivación aparece la exigencia de un disco. Eso explica que la ruta alternativa, la de Ray Tracing in One Weekend, funcione igual: parte de la punta de la normal, empuja con un vector unitario aleatorio y normaliza donde cae. Muestrea una bola, nunca toca un disco, y llega al mismo lóbulo coseno.

El texto se queda justo ahí, comparando los dos caminos para ver qué le hace el hexágono al levantamiento del disco sobre el hemisferio. La pregunta de fondo es la interesante para quien escriba un motor de render: si la forma del muestreador no altera la distribución difusa, ¿por qué comparte función con la cámara? Solo porque ambos necesitan un disco, no porque necesiten el mismo.

Para quien trabaje con código numérico, el episodio es un recordatorio barato de leer: una primitiva reutilizada por conveniencia acaba convirtiéndose en un contrato implícito entre dos partes que deberían ser independientes. Aquí el precio es un sesgo sutil que ninguna captura de pantalla delata. Conviene separar los dos muestreadores y dejar que la Pdf de cada uno diga la verdad por su cuenta.