Skip to main content

Malinterpretando la multidifusión

julio

27, 2020

by coberst


Tecnología

Vamos a construir nuestra GGX BRDF (función de distribución de reflectancia bidireccional) multidifusión de vanguardia para renderizados que se basan en la física.

Por supuesto, todo esto se ha construido antes por personas muy inteligentes que usaron sus conocimientos de matemáticas y física para crear soluciones sofisticadas. Si quieres leer unos de los muchos artículos sobre el tema para obtener resultados similares, aquí te propongo algunos:

Nosotros hemos decidido no leer tanto y hacer las cosas de la manera más fácil. ¿Listos?

Vamos a comenzar con el simple GGX con todas las fijaciones correlacionadas de Smith. La siguiente secuencia de imágenes se generó con el modo iluminación de entorno de explorador BRDF de Disney. Esta muestra un GGX metálico con rugosidad variable, de 0.3 a 0.9, usando la parametrización común de alfa = rugosidad al cuadrado.

Fíjate en cómo el material se ve demasiado oscuro a una alta rugosidad. Una vez más, gente inteligente ha trabajado duro para encontrar soluciones a este problema.

Comparemos la imagen de arriba con la multidifusión GGX BRDF de Kulla y Conty.

¡Arreglado!

Ahora, podemos averiguar cómo funciona esta solución. Las matemáticas ya las tenemos, así que deberías intentarlo. Es a la vez interesante y útil para comprender otros problemas relacionados. Pero recuerda que nos vamos a saltar todo eso aquí.

Empecemos por el principio. ¿Por qué preferimos el PBR (renderizado basado en la física)? No es porque nos guste la física (al menos, a mí no me gusta). Y si estuviéramos profundamente preocupados por la física, sería un error si nos enfocáramos en que estamos cometiendo peores pecados en nuestro conducto de imagen de extremo a extremo

Los gráficos hechos por computadora no son renderizados predictivos. No estamos simulando la física para el realismo; ese no es el objetivo. Estamos intentando crear una imagen bonita.

Nos dimos cuenta de que la simulación de algunas físicas para hacer imágenes bonitas permitía un flujo de trabajo más fácil: desacoplar los materiales de la iluminación, reducir el número de hacks y parámetros, permitir el uso de bibliotecas de materiales reales, y así sucesivamente.

Así que al tomar decisiones sobre cómo proceder, tenemos que considerar las preocupaciones artísticas antes que las técnicas. Si identificamos un problema artístico podemos mirar a la física para ver si hay una solución técnica. En nuestro BRDF actual, sería bueno que nuestros parámetros de material fueran ortogonales; no es ideal que las cosas se oscurezcan a medida que cambiamos la rugosidad.

Así que, ¿la física puede ayudar? ¿Este oscurecimiento es físicamente correcto o no? ¿Cómo lo probamos? ¡Entra a la fragua! Pongamos nuestro objeto metálico cubierto de GGX en un ambiente uniformemente iluminado y veamos qué pasa:

La luz golpea nuestra superficie y nuestras microfacetas. Las microfacetas reflejan algo de luz y refractan un poco, según Fresnel. Si suponemos que esta superficie es de metal, la física nos dice que la luz refractada, la que va «dentro» de la superficie, se absorbe y nunca sale (porque se convierte en calor).

Es razonable que incluso en una fragua nuestro objeto metálico tenga un color, ya que parte de la energía será absorbida. ¿Qué pasa si tomamos nuestras microfacetas y hacemos que siempre reflejen toda la luz, sin que se absorba?

Esto significa que tenemos que poner nuestro f0 en 1 (recuerda, Fresnel controla cuánta luz dispersan las microfacetas). Vamos a probar para ver qué pasa:

El objeto todavía no es blanco. ¡Algo anda mal! Ahora, un lector curioso podría preguntar: «¿Cómo sabes que está mal? ¿Quizás ciertas direcciones dispersan más luz que otras?» No siempre es fácil intuir la solución correcta.

En cambio, consideremos cómo se ve un camino de luz, empezando por la cámara. Esta golpeará una o muchas de las microfacetas, rebotará, y finalmente escapará y se conectará al entorno de la fragua, que siempre estará emitiendo energía constante.

¿Cuánta de esa energía llegará a la cámara? ¡Toda! Según nuestro entorno, toda la energía debería reflejarse sin importar cuántas microfacetas golpee. Todos los caminos de la luz llevarán eventualmente a la cámara.

Por eso la imagen de arriba debería ser completamente blanca, pero, como no lo es, tenemos un problema con nuestras matemáticas.

Si estudiaste los BRDF, sabes que en el modelo de microfacetas hay una función de visibilidad de enmascaramiento que modela las microfacetas que son ocluidas por otras. Sin embargo, lo que no solemos modelar es el hecho de que estas oclusiones son en sí mismas microfacetas, por lo que la luz debería rebotar y eventualmente salir, no ser descartada.

Esto es lo que los modelos de multidispersión modelan y arreglan, y si ponemos el GGX de Kulla y Conty en una fragua, se generaría una imagen blanca bastante aburrida pero totalmente correcta para un material reflectante que no depende de la rugosidad.

El modelo de Kulla no es sencillo y, en la mayoría de los casos, no vale la pena usarlo para un problema tan pequeño. ¿Podemos ser aún más simplistas en nuestra solución? ¿Qué pasaría si supiéramos cuánta luz emite nuestro BRDF en una fragua para una determinada rugosidad y ángulo de visión (fijando otra vez f0=1)? ¿Podríamos tomar ese valor y normalizar el BRDF con él?

Alerta spoiler: Sí, lo podemos hacer muy sencillamente. Ya tenemos este valor de «fragua» en la mayoría de los motores modernos en las tablas de consulta utilizadas para la popular aproximación de la iluminación basada en imágenes divididas.

La tabla de suma dividida reduce el «BRDF a una fragua» (también conocido como albedo direccional o reflectancia direccional-hemisférica) a una escala y un factor de sesgo (suma) que se aplica al valor f0 de Fresnel.

En nuestro caso, queremos normalizar f0=1, así que todo lo que hacemos es escalar nuestro lóbulo BRDF por uno sobre el sesgo (rugosidad,ndotv) + escala (rugosidad,ndotv). Y este es el resultado:

Estamos recuperando algo de energía a una alta rugosidad, y si probáramos esto en una fragua saldría blanco, correctamente, con f0=1. Sin embargo, difiere del de Kulla. Sobre todo el color, que no es tan saturado en los materiales rugosos. ¿Por qué? Si estudiaste este problema (¡tramposo!), entonces y sabes la respuesta.

La multidispersión adecuada añade saturación porque a medida que la luz golpea más microfacetas antes de escapar de la superficie, agregamos más color (elevar un color por una potencia resulta en un color más saturado). Entonces, ¿cómo puede ser físicamente incorrecto, pero aún así resulta correcto en nuestra prueba?

Al no simular esta saturación adicional seguimos conservando la energía, pero cambiamos el significado de nuestros parámetros BRDF. El «significado» de f0 en nuestra multidispersión BRDF «ignorante» no es el mismo que el de Kulla. Da como resultado un albedo diferente, pero el propio BRDF sigue conservando energía. Solo se trata de una parametrización diferente.

Y aún más importante, una mejor parametrización. Recuerda nuestros objetivos. No hacemos física por la física; lo hacemos para ayudar con nuestra producción.

Preferimos hacer nuestros parámetros más ortogonales para que los artistas no tengan que «iluminar» artificialmente nuestro BRDF a una alta rugosidad. Si vamos con la solución «más correcta» (sobre eso, esta reciente publicación de Narkowicz es una gran lectura), añadiríamos una dependencia diferente, de modo que la rugosidad, en lugar de oscurecer nuestros materiales, los hace más saturados (lo que en cierto modo frustraría el propósito). Puedes imaginarte algunos casos en los que esto podría ser deseable, pero yo diría que casi siempre es incorrecto para nuestros casos de uso.

Si quisiéramos simular la saturación añadida, hay algunas maneras fáciles de hacerlo. De nuevo, si vamos por lo más «ignorante» (simple) podemos simplemente escalar el BRDF en 1+f0*(1/(sesgo (rugosidad,ndotv) + escala (rugosidad,ndotv)) – 1), resultando en lo siguiente:

Ahora, nos estamos acercando a la soluciónd de Kulla. Si te estás preguntando por qué la aproximación de Kulla es mejor, como podría no ser evidente en las imágenes, es porque la nuestra no respeta la reciprocidad.

Eso puede ser importante para Sony Imageworks (como lo requieren ciertos algoritmos de transporte de luz de rastreo fuera de línea), pero no para nosotros.

Así que ahora estamos contentos con la aproximación que hemos encontrado, podemos (y debemos) ir un paso más allá y ver lo que realmente estamos haciendo. Sí, tenemos una fórmula, pero depende de algunas tablas de búsqueda.

Esto no es un gran problema (de todas formas necesitamos estas tablas para la iluminación basada en imágenes), pero sería una búsqueda adicional de texturas y tenemos que comprobar nuestras matemáticas. Así que visualicemos la función 1/[sesgo (rugosidad,ndotv) + escala (rugosidad,ndotv)] que estamos usando:

¡Es extremadamente sencillo! De hecho, es tan simple que no necesitas una herramienta sofisticada para encontrarlo, así que lo voy a mostrar aquí: 1 + 2*alfa*alfa* ndotv. Muy bien hecho.

Aproximación comparada con el factor de normalización correcto (superficie gris)

Se puede ver que hay un pequeño error en la prueba de la fragua. Podríamos mejorarlo haciendo un ajuste polinómico adecuado (resulta que «2» y «1» en la fórmula anterior no son las mejores constantes), pero es difícil definir lo que es «mejor» porque hacer una simple minimización del cuadrado medio en la función de normalización no tiene mucho sentido (deberíamos preocuparnos por las visuales finales; las medidas perceptivas, qué ángulos importan más y así sucesivamente). Ya le invertimos demasiado tiempo en este tan pequeño ajuste. Además, las imágenes reales renderizadas son muy difíciles de distinguir de la solución que se basa en la tabla.

Ahora veamos qué podríamos lograr si quisiéramos hacer las cosas más simples dejando la dependencia de ndotv. Resulta que, en este caso, 1+alfa*alfa funciona bastante bien.

Aplicamos un factor multiplicador a nuestro BRDF para iluminarlo a una alta rugosidad.

Por supuesto, esto puede causar más errores, y comienza a mostrarse a medida que la forma del BRDF cambia. Obtenemos más energía en los ángulos de pastoreo en superficies ásperas; esto podría ser suficiente dependiendo de tus necesidades:

Subexpuesto para destacar que con la aproximación más simple a veces perdemos la luz, a veces la añadimos.

Espero que hayas aprendido la gran lección. Claro, puedes dedicarte a conseguir gráficos que simulen perfectamente la física del mundo real. Pero también puedes hacer trampa. Y ya sea por rendimiento, simplicidad o pura pereza, a veces hacer trampa es la respuesta correcta.


Ni la Corporación Roblox ni este blog respaldan o apoyan a ninguna empresa o servicio. Además, no se ofrecen garantías ni promesas sobre la exactitud, fiabilidad o integridad de la información contenida en este blog.

Este blog se publicó originalmente en Roblox Tech Blog.