6.11.11  Radiosidad

Nota importante: Los aspectos de radiosidad en POV-Ray son experimentales. Existe una alta probabilidad de que el diseño y la implementación de estas cualidades cambien en versiones futuras. No podemos garantizar que las escenas que usen estas características en esta versión se puedan renderizar de manera idéntica en versiones futuras, o que se pueda mantener una compatibilidad retroactiva completa de la sintaxis del lenguaje.

La radiosidad es un cálculo extra que computa de manera más realista la inter-reflexión difusa de la luz. Esta inter-reflexión difusa puede verse si se coloca una silla blanca en un cuarto de alfombras, paredes y cortinas azules. La silla capturará un tinte azulado de la luz que se refleja de las otras partes del cuarto. También verá que las áreas sombreadas de sus alrededores no son totalmente oscuras, aún si no hay ninguna luz que brille directamente sobre la superficie. La luz difusa que parte de los otros objetos llena las sombras. Típicamente, el trazado de rayos utiliza un truco llamado luz de ambiente (ambient) para simular tales efectos, pero no es muy exacto.

Los cálculos de radiosidad se hacen solamente cuando el bloque radiosity{} se utiliza dentro del bloque global_settings{}.

Las secciones siguientes describen cómo funciona la radiosidad, cómo controlarla con varios ajustes globales y algunos tips en el intercambio de calidad vs. velocidad.

6.11.11.1  Cómo funciona la Radiosidad

El problema del trazado de rayos es el de imaginarse el nivel de la luz en cada punto que se ve en la escena. Tradicionalmente, en el trazado de rayos, esto se descompone en la suma de estos componentes:

Diffuse
el efecto que hace que el lado de los objetos que está de cara a la luz sea más brillante;
Specular
el efecto que hace que los objetos brillantes tengan reflejos o chispas en ellos;
Reflection
el efecto que dan los espejos; y
Ambient
el nivel de luz generalizada que tiene cualquier escena, que impide a los objetos en sombra ser completamente negros.

El sistema de radiosidad de POV-Ray, basado en un método de Greg Ward, provee de una manera para reemplazar el último término - el valor constante de la luz del ambiente- con un nivel de luz que se basa en las superficies cercanas y en cuán brillantes son.

La primera cosa que debe tenerse en cuenta en esta definición es que es circular: el brillo y el color de cualquier cosa es dependiente de todo lo demás y viceversa. Esto es cierto en la vida real, pero en el trazado de rayos sólo podemos hacer una aproximación. La aproximación que se utiliza es la siguiente: el valor de ambient de los objetos se calcula revisando los objetos cercanos. Cuando estos objetos se revisan durante este proceso, se usan sin embargo sus términos diffuse para el cálculo. El brillo de la radiosidad en POV-Ray se basa en dos cosas:

  1. la cantidad de luz "acumulada"
  2. la propiedad 'diffuse' del acabado de la superficie.
Un objeto puede tener radiosidad y un término ambiente. Sin embargo se sugiere que si usted utiliza radiosity en una escena, debería predeterminar ambient_light a 0 en global_settings, o utilizar ambient 0 en el acabado de cada objeto. Este modelo de iluminación es mucho más realista, y POV-Ray no tratará de ajustar el brillo general de la radiosidad para igualarlo con el nivel del ambiente especificado por el usuario.

¿Cómo calcula POV-Ray el término ambiente para cada punto? Enviando más rayos, en muchas direcciones diferentes, y promediando los resultados. Un punto típico puede usar 200 o más rayos para calcular su nivel de luz de ambiente correctamente.

Esto hace pensar que el trazador de rayos se hará 200 veces más lento. Esto es cierto, excepto que el software toma ventaja del hecho de que los niveles de luz de ambiente cambian muy lentamente (recuerde, las sombras se calculan separadamente, así que las sombras de bordes agudos no son ningún problema). Por eso, estos rayos extra se envían solamente de vez en cuando (cerca de 1 vez en 50), guardando los valores calculados y reusándolos en píxeles cercanos de la imagen cuando sea posible.

Este proceso de guardar y reusar valores es lo que origina la necesidad de una variedad de parámetros de afinamiento, para que pueda lograr la escena exactamente de la manera que lo desea .

6.11.11.2  Ajustando Radiosidad

Como se describió anteriormente, la radiosidad se activa utilizando el bloque radiosity{} en global_setting. La radiosidad tiene muchos parámetros, que se especifican a continuación:

    global_settings { radiosity { [RADIOSITY_ITEMS...] } }
RADIOSITY_ITEMS:
    adc_bailout Float | always_sample Bool | brightness Float | 
    count Integer | error_bound Float | gray_threshold Float |
    load_file Filename | low_error_factor Float | max_sample Float |
    media Bool | minimum_reuse Float | nearest_count Integer |
    normal Bool | pretrace_end Float | pretrace_start Float |
    recursion_limit Integer | save_file Filename

Cada ítem es opcional y puede aparecer en cualquier orden. Si un ítem se especifica más de una vez, el último predomina sobre los valores previos. Detalles de cada ítem se proporcionan en las secciones siguientes.

Note: Se han hecho cambios considerables en el funcionamiento de la radiosidad en POV-Ray 3.5, comparado con POV-Ray 3.1. Las escenas anteriores no tendrán el mismo resultado, si es que consigue pasar la fase de análisis. No es posible utilizar la directiva #version para obtener compatibilidad retroactiva con la radiosidad.

6.11.11.2.1  Radiosidad adc_bailout

Puede especificar un adc_bailout para los rayos extra de la radiosidad. Use adc_bailout = 0.01 / brightest_ambient_object para obtener buenos resultados. El valor por defecto es 0.01.

6.11.11.2.2  always_sample (muestreo permanente)

Puede forzar que POV-Ray use solamente los datos del paso inicial del pre-trazado, y que no acumule ninguna nueva muestra durante el pase final de radiosidad. Esto puede reducir los artefactos indeseables. Para hacer esto, utilice always_sample off, que por definición está activo. Puede ser útil también al reusar datos de radiosidad previamente guardados.

6.11.11.2.3  Brillo

El identificador brightness especifica un valor de coma flotante que es el grado en el cual se incrementa el brillo de los objetos antes de volver al resto del sistema. El valor por definición es 1.0. En los mismos casos en que normalmente usaría global_settings{ambient_light value} para incrementar el brillo general en una escena sin radiosidad, use brightness en la escena con radiosidad.

6.11.11.2.4  count (Conteo)

El número entero de rayos que son enviados cuando un nuevo valor de radiosidad debe calcularse viene dado por el identificador count. El valor de 35 es el valor por definición, el máximo es 1600. Cuando este valor es demasiado bajo, el nivel de luz tenderá a aparecer a manchas, como si las superficies que observa estuviesen ligeramente combadas. Si esto no es importante en su escena (como sería el caso si tuviera un bump_map o una textura fuerte) entonces definitivamente utilice un número más bajo.

6.11.11.2.5  error_bound (Límite de error)

El valor de coma flotante error_bound es uno de los dos principales valores de afinamiento velocidad/calidad (el otro es, por supuesto, el número de rayos emitidos). En un mundo ideal, éste sería el único valor que se necesitaría. Su intención es la de significar la fracción de error tolerable. Por ejemplo, si fuese ajustado a 1, el algoritmo no calcularía un nuevo valor hasta que el error del último no fuese estimado en un 100%. Ignorando el error introducido por la rotación para ese momento, en superficies planas se iguala a la fracción de la distancia de reuso, la cual a su vez es la distancia hasta el ítem más cercano. Si existe una muestra anterior sobre el piso, a diez pulgadas de la pared, un límite de error de 0.5 le haría obtener una nueva muestra a una distancia de cerca de cinco pulgadas de la pared.

El valor por definición es de 1.8, apropiado para un efecto general suave de iluminación. Usar valores más bajos es más exacto, pero incrementaría muchísimo el peligro de generar artefactos y por ende, requerirá un valor count mayor. Puede utilizar valores aún menores que 0.1, pero el tiempo de renderizado y el uso de la memoria también serán extremadamente altos.

6.11.11.2.6  gray_threshold (Umbral de grises)

La luz inter-reflejada difusamente es una función de los objetos alrededor de un punto dado. Puesto que esta función se define recursivamente con millones de niveles de recursión, en cualquier escena de la vida real cada punto es iluminado, al menos en parte, por cada otra parte de la escena. Como no se puede abordar tal cálculo, si usamos sólo un rebote la luz de ambiente calculada se ve fuertemente afectada por los colores de los objetos cercanos. Este efecto se conoce con el nombre de sangría de color y sucede realmente, aunque no tanto como este método de cálculo le haría creer. El valor de coma flotante gray_threshold lo hace un poco gris, para hacer que su escena luzca más creíble. Un valor de .6 se traduce en el cálculo de la luz del ambiente como un 60% del valor gris equivalente calculado, más el 40% del valor real calculado. A 0%, esta opción no hace nada. A 100%, siempre obtendrá una luz de ambiente blanca/gris, sin tinte.

Note: esto no cambia la luz/oscuridad, sólo la fuerza tinte/gris. En términos de HLS (Tinte, Luz, Saturación), solamente cambia la Saturación. El valor por definición es 0.0

6.11.11.2.7  low_error_factor (Factor bajo de error)

Si calcula sólo las muestras suficientes, pero no más, obtendrá una imagen con luz ligeramente manchada. Lo que se desea es unas pocas muestras extra intercaladas, de manera que la mezcla sea suave y eficaz. La solución es la imagen previa de mosaico, que se controla con la sentencia pretrace: ésta va sobre la imagen una o más veces de manera previa, calculando los valores de radiosidad. Para asegurarse de que se obtienen esas pocas muestras extra, el algoritmo de radiosidad aminora el límite de error durante los pases anteriores al final, luego lo restaura justo antes de la pasada final. El indicador low_error_factor es un valor de coma flotante de ajuste, que dispone la cantidad de límite de error que decaerá durante las pasadas preliminares de la imagen. Si su factor bajo de error es 0.8 y su límite de error se ha ajustado a 0.4, estará usando realmente un límite de error de 0.32 durante las primeras pasadas, y luego 0.4 en el pase final. El valor por definición es 0.5.

6.11.11.2.8  max_sample (Máximo de muestras)

Algunas veces pueden presentarse problemas con manchas causadas por objetos que son muy brillantes. A veces se puede evitar este problema usando el identificador max_sample, que toma un parámetro flotante para especificar la brillantez permitida de cualquier muestra recogida. Cualquier muestra más brillante que ésta verá su brillo disminuido (sin afectar el color). Especificar un valor negativo para max_sample permitirá cualquier brillo en las muestras (lo que es el valor por defecto).

6.11.11.2.9  Media y Radiosidad

Las estimaciones de radiosidad pueden verse afectadas por el medio, si así lo desea. Para habilitar esta opción, añada media on al bloque radiosity{}. El valor por defecto es off

6.11.11.2.10  minimum_reuse (Reuso mínimo)

El ratio de radio mínimo efectivo se especifica con el valor de coma flotante minimum_reuse. Ésta es la fracción del ancho de pantalla que determina el mínimo radio de reuso para cada punto de la muestra (en realidad, es la fracción de la distancia desde el ojo, pero las dos son más o menos iguales). Por ejemplo, si el valor es 0.02, el radio de reuso máximo para cada muestra se ajusta para cualquier distancia del suelo que corresponda a un 2% del ancho de la pantalla. Imagine que envía un rayo hacia el horizonte y que éste golpea la tierra a una distancia de 100 millas de su punto de vista. La distancia de reuso para esa muestra se ajustará a 2 millas. A una resolución de 300*400 esto corresponderá (muy aproximadamente) a 8 píxeles. La teoría es que no se desea calcular valores para cada píxel en cada cavidad en cualquier lugar de la escena, porque tomaría mucho tiempo. Esto determina un límite mínimo para el reuso. Si este valor es muy bajo, (lo que debería ser en teoría) el renderizado se hace lento, y puede tornarse granulado en las esquinas y recovecos. Si se especifica muy alto, no obtendrá el oscurecimiento natural de la iluminación cerca de los interiores de las esquinas, puesto que las reusa. A valores más altos que el 2% comenzará a obtener más errores, como el reusar el espacio abierto de la mesa debajo de una manzana. Recuerde que esto es una unidad menos que el ratio. El valor por defecto es 0.015.

6.11.11.2.11  nearest_count (Conteo más cercano)

El valor entero nearest_count es el número mínimo de valores de ambiente previos que son mezclados para crear un nuevo valor interpolado. El número total de esta unión variará dependiendo de error_bound. Todos los valores previos que encajen dentro del límite de error especificado se usarán en el promedio.

Siempre serán los n puntos reusables geométricamente más cercanos los que serán utilizados. Si lo especifica por debajo de 4, se complicarán las cosas. Esto podría ser beneficioso para el control de errores, sin embargo. No deben haber más de 20, puesto que éste es el tamaño de la matriz localizada. El valor por defecto es 5.

6.11.11.2.12  Normal y Radiosidad

La estimación de la radiosidad puede verse afectada por las normales. Para habilitar esta opción, añada normal on al bloque radiosity{}. El valor por defecto es off

6.11.11.2.13  Pre-trazado

Para controlar el paso del pre-trazado de recoleccion de la radiosidad, utilice los identificadores pretrace_start y pretrace_end dentro del bloque radiosity{}. Cada uno de ellos va seguido por un valor decimal entre 0.0 y 1.0 que especifica el tamaño de los bloques en la vista previa de mosaico, como un porcentaje del tamaño de la imagen. Los valores por defecto son 0.08 para pretrace_start y 0.04 para pretrace_end

6.11.11.2.14  recursion_limit (Límite de recursión)

El identificador recursion_limit es un valor entero que determina cuántos niveles de recursión se utilizan en el cálculo de la inter-reflexión difusa. El valor por definición es 3, el límite superior es 20.

6.11.11.2.15  Guardar y cargar datos de radiosidad

Puede guardar los datos de radiosidad utilizando save_file "file_name", y cargarlos más tarde utilizando load_file "file_name". En general, no es una buena idea guardar y cargar los datos de radiosidad si los objetos de la escena están en movimiento. Aunque se carguen los datos de radiosidad, se tomarán más muestras durante el renderizado (lo que produce una mejor aproximación). Se puede inhabilitar la toma de las muestras durante la fase final del renderizado especificando always_sample off.

6.11.11.3  Tips de Radiosidad

Dele un vistazo a la sección "Tutorial de Radiosidad" para hacerse una idea del resultado visual del cambio de los parámetros de la radiosidad.

Si desea ver dónde se calculan sus valores, baje count hasta cerca de 20, ajuste nearest_count a 1 y gray_threshold a 0. Esto hará que toda la imagen aparezca llena de grandes parches, así podrá observar los bordes entre cada uno de ellos. Habrá un cálculo de radiosidad en el centro de la mayoría de los parches. La ventaja es que es muy rápido de ejecutar. Luego puede cambiar error_bound hacia arriba y hacia abajo para ver cómo cambian las cosas. De igual manera puede hacerse con minimum_reuse.

Una forma de obtener resultados extra suaves: eleve el conteo de muestras (puede especificar hasta 1300) y haga caer low_error_factor hasta algo tan pequeño como 0.6. Suba nearest_count hasta 7 u 8. Así obtendrá mejores y más abundantes valores, que luego se interpolarán entre ellos en la pasada final. Estos ajustes no son para personas con poca paciencia, puesto que es como una función al cuadrado. Si tiene manchas en su imagen solamente en ciertas esquinas o cerca de ciertos objetos, pruebe entonces ajustando el límite de error error_bound. Nunca lo haga caer más de un poco cada vez, porque el tiempo de ejecución se extenderá demasiado.

Algunas veces se toman muestras adicionales durante la pasada final de renderizado. Estas nuevas muestras pueden causar discontinuidades en la radiosidad de algunas escenas. Para disminuir estos artefactos, use un pre-trazado final de 0.04 (incluso 0.02 si es verdaderamente paciente y exigente). Esto hará que la mayoría de las muestras sean tomadas en los pasos previos, y disminuirá los artefactos creados durante el paso final del renderizado. Puede forzar a que POV-Ray utilice solamente los datos del paso del pre-trazado y que no recoja ninguna nueva muestra durante el pase final de radiosidad. Para hacer esto, use always_sample off dentro del bloque de radiosidad, en los ajustes globales (global_settings).

Si su escena utiliza objetos con luz de ambiente (especialmente si son pequeños) como fuentes luminosas, probablemente deberá usar un conteo mayor (100-150 y más). Para tales escenas, un límite de error -error_bound- de 1.0 es a menudo adecuado. Ajustarlo más alto ocasiona demasiados errores, mientras que muy bajo genera renderizados demasiado lentos.