6.7.3  Acabado (finish)

Las propiedades de acabado de una superficie afectan en gran manera a su apariencia. ¿Cómo refleja la luz? ¿Qué ocurre en penumbra? ¿Qué tipo de reflejos son visibles? Para responder a estas preguntas, necesitamos un acabado (finish).

La sintaxis de finish es la siguiente:

FINISH:
    finish { [IDENTIFICADOR_DE_ACABADO] [ELEMENTOS_DE_ACABADO...] }
ELEMENTOS_DE_ACABADO:
    ambient COLOR | diffuse Cantidad | brilliance Cantidad |
    phong Cantidad | phong_size Cantidad | specular Cantidad |
    roughness Cantidad | metallic [Cantidad] | reflection COLOR |
    crand Cantidad | conserve_energy BOOL_ON_OFF |
    reflection { Color_Reflection_Min [ELEMENTOS_DE_REFLEXION...] }|
    irid { Irid_Amount [ELEMENTOS_IRID...] }
ELEMENTOS_DE_REFLEXION:
    COLOR_REFLECTION_MAX | fresnel BOOL_ON_OFF |
    falloff FLOAT_FALLOFF | exponent FLOAT_EXPONENT |
    metallic FLOAT_METALLIC
ELEMENTOS_IRID:
    thickness Cantidad | turbulence Cantidad

El IDENTIFICADOR_DE_ACABADO es opcional, pero debe ser colocado después de todos los demás elementos, ya que cualquier elemento que siga al IDENTIFICADOR_DE_ACABADO modifica o sobrescribe los ajustes dados en el IDENTIFICADOR_DE_ACABADO. Si no se especifica ningún identificador, entonces los elementos modifican los valores de acabado en la textura por defecto actual.

Aviso: No se permiten transformaciones dentro de un acabado (finish), debido a que los elementos de acabado cubren de modo uniforme toda la superficie. Cada uno de los ELEMENTOS_DE_ACABADO listados antes está descrito en las subsecciones siguientes.

En las primeras versiones de POV-Ray, las palabras clave refraction, ior y caustics eran parte de la declaración de finish, pero ahora son parte de la declaración de interior. Aunque aún se toleran en finish, por motivos de compatibilidad, los resultados pueden no ser 100% idénticos a versiones previas. Consultar "¿Por qué son Interior y Media necesarios?" para más detalles.

Una declaración de acabado (finish) es parte de una especificación de textura. Sin embargo, puede resultar tedioso gastar una declaración de textura para añadir sólo un reflejo u otras propiedades de iluminación a un objeto. Por lo tanto, podemos unir directamente un acabado a un objeto sin especificar que forma parte de una textura. Un ejemplo de ello puede ser:

  object { Mi_Objeto texture { finish { phong 0.5 } } }

se puede abreviar así:

  object { Mi_Objeto finish { phong 0.5 } }

Trabajando así crearíamos una estructura completa de textura con las declaraciones de pigment y normal por defecto, exactamente igual que si hubiéramos tecleado la textura (...) completa a su alrededor.

Los identificadores de acabado pueden ser declarados para hacer los ficheros escénicos más legibles y para parametrizar escenas en las que cambiar una sola declaración afecte a muchos valores. Un identificador se declara de esta manera:

DECLARACIÓN_DE_ACABADO:

    #declare IDENTIFIER = FINISH |
    #local IDENTIFIER = FINISH

Donde IDENTIFIER es el nombre del identificador de hasta 40 caracteres de largo y FINISH cualquier declaración válida de acabado. Ver "#declare vs. #local" para más información sobre el alcance de los identificadores.

6.7.3.1  Ambiente (Ambient)

La luz que, en el mundo real, vemos en las áreas sombreadas, proviene de la reflexión difusa de otros objetos. Esta luz no puede simularse directamente mediante el trazado de rayos. Sin embargo, podemos usar un truco llamado iluminación ambiente para imitar la luz interior de un área sombreada.

Luz ambiente es la luz que se esparce por todas partes en una habitación. Rebota en cualquier sitio y se encarga de iluminar un poco allí donde no llega la iluminación directa. Computar luz ambiente realista llevaría mucho tiempo, así que imitaremos la luz ambiente añadiendo un poco de luz blanca (o de otro color, como se verá más abajo) a cada textura tanto si ya está iluminada como si no.

Esto significa que partes del objeto que están completamente en la sombra aún tendrán un poco del color de su superficie. Es casi como si la textura brillara, pensemos que la luz ambiente en una textura sólo afecta al objeto sobre la que se proyecta.

La palabra clave ambient controla la cantidad de luz ambiente. Normalmente se especifica un valor en coma flotante aunque estemos utilizando la sintaxis para invocar un color. Por ejemplo, un valor flotante de 0.3 se promociona al vector de color completo <0.3,0.3,0.3,0.3,0.3>, lo cual es aceptable ya que sólo se utilizan las partes roja, verde y azul.

El valor por defecto es 0.1, lo cual proporciona una luz ambiente muy débil. Se admiten valores entre 0.0 y 1.0. La luz ambiente afecta por igual a las áreas sombreadas y no sombreadas, así que si subimos el valor de ambient deberemos bajar los valores de diffuse y reflection.

Aviso: este método no tiene en cuenta el color de los objetos cercanos. Si estuvieramos en una habitación con paredes, techo y suelo de color rojo con nuestro traje de la primera comunión, podría parecer que vestimos como la pantera rosa debido a la luz reflejada. La luz ambiente abreviada de POV-Ray no tiene en cuenta este detalle y además, tampoco hay modo de modelar la iluminación especular indirecta, como un puntero láser brillando sobre un espejo.

Podemos colorear la luz ambiente de dos maneras. Una consiste en especificar un color en vez de un valor en coma flotante después de ambient en cada declaración de acabado. Por ejemplo:

   finish { ambient rgb <0.3,0.1,0.1> } // un ambiente rosado

O también podemos ajustar la luz ambiente utilizada al calcular la iluminación ambiente de un objeto mediante el ajuste global ambient_ligth. La fórmula es conseguida con Ambiente = Acabado Ambiente * Fuente de luz Ambiente Global. Ver sección "Luz Ambiente" para más detalles.

6.7.3.2  Elementos de Reflexión Difusa

Cuando la luz rebota en una superficie, las leyes de la física dicen que debería abandonar la superficie en el mismo ángulo en el que llegó. De un modo parecido al que las bolas de billar rebotan en los bordes de una mesa de billar. Esta reflexión perfecta se llama reflexión especular. Sin embargo, sólo las superficies muy pulidas reflejan la luz de esta manera, ya que la mayor parte de las veces la luz se refleja y es dispersada en todas direcciones por la rugosidad de la superficie. Esta dispersión es llamada reflexión difusa debido a que la luz se desparrama o difunde por gran variedad de direcciones. Esto es cierto para la mayoría de las luces que podemos ver en el mundo real.

6.7.3.2.1  Diffuse (Difusión)

La palabra clave diffuse se utiliza en una declaración de acabado para controlar que cantidad de luz, que proceda directamente de cualquier fuente de luz, será reflejada por el método de reflexión difusa. Por ejemplo:

  finish { diffuse 0.7 }

significa que el 70% de la luz que refleja el objeto viene directamente del punto de luz. El valor por defecto es diffuse 0.6.

6.7.3.2.2  Brilliance (Luminosidad)

La cantidad de luz directa que se difunde desde un objeto depende del ángulo en el que llega a su superficie. Cuando la luz llega en un ángulo muy cerrado, ilumina menos. Cuando la luz es perpendicular a la superficie, ésta estará más iluminada. Puede utilizarse la palabra clave brilliance  en una declaración de acabado para variar el modo en que disminuye la luz dependiendo del ángulo de incidencia. Así controlamos la tirantez de la iluminación difusa básica en los objetos y, en menor modo, el aspecto del brillo superficial. Los objetos pueden aparentar ser más metálicos incrementando su luminosidad. El valor por defecto es 1.0. Mayores valores, entre 5 y 10, provocan que la luz se refleje en ángulos mucho menores. No hay límites para los valores de luminosidad. Un consejo: experimentar con diversos valores es la mejor manera de comprobar lo que conviene para cada situación particular. Se obtienen mejores resultados si se combina con destellos (highlights).

6.7.3.2.3  Crand Graininess (Granulosidad)

Las superficies muy rugosas, como cemento o arena, exhiben un granulado oscuro en su color aparente. Esto es debido a las sombras que causan los pequeños agujeros en su superficie. Puede añadirse la palabra clave crand  a un acabado finish para causar un oscurecimiento aleatorio menor en la reflexión difusa de la iluminación directa. Los valores típicos oscilan entre crand 0.01 y crand 0.5 o más. El valor por defecto es 0. Ejemplo:

  finish { crand 0.05 }

Esta característica viene incluida desde las versiones primarias de POV-Ray y se considera obsoleta. Esto es debido a que el grano o ruido causado se aplica píxel a píxel y, debido a esta forma de calcular el ruido, se obtienen los mismos resultados en objetos lejanos o cercanos. Además, el efecto es diferente dependiendo de la resolución que se utilice para generar la imagen.

Aviso: No se debería usar la granulosidad cuando se generen animaciones. Ésta es una de las pocas características realmente aleatorias utilizadas en POV-Ray y produciría un mareante "zumbido" de píxeles voladores en cualquier textura animada con un valor crand. Por estas razones, éste no es un modo demasiado preciso para modelar efecto rugoso en una superficie.

6.7.3.3  Highlights (Destellos)

Los destellos son las manchas brillantes que aparecen cuando una fuente de luz se refleja en un objeto pulido. Son una mezcla entre reflexión especular y reflexión difusa. Son especulares porque dependen del ángulo de visión y del ángulo de iluminación. Sin embargo, también son difusos porque provocan algo de dispersión. A la hora de modelar exactamente un destello debemos calcular reflexión especular de miles de microscópicos bultos llamados microfacetas. Cuantas más microfacetas estén orientadas hacia el espectador mayor será la apariencia brillante del objeto y más intensos los destellos. POV-Ray utiliza dos modelos diferentes para simular destellos sin tener que calcular microfacetas. Son los modelos Phong y especular.

Aviso: los destellos especulares y Phong no son mutuamente excluyentes. Es posible especificar ambos y ambos tendrán efecto sobre el objeto. Sin embargo, lo normal es especificar sólo uno de los dos tipos de destello.

6.7.3.3.1  Destellos Phong

La palabra clave phong en la declaración de acabado controla la cantidad de destellos Phong en el objeto. Provoca una mancha luminosa brillante en el objeto del color de la fuente de luz reflejada.

El método Phong mide la media de las facetas orientadas en la dirección en que se refleja el foco de luz sobre el objeto y el espectador.

Los típicos valores de Phong alcanzan de 0.0 a 1.0, donde 1.0 provoca una saturación completa del color de la fuente de luz en el área más brillante (centro) del destello. El valor por defecto phong 0.0 no causa reflejos.

El tamaño del destello se define por el valor phong_size. Cuanto mayor sea el valor de phong, más "duro" será el reflejo, y más pequeño y brillante la apariencia del reflejo. Por el contrario, cuanto más pequeño sea el valor de phong, mayor será el tamaño del reflejo y menos brillante su apariencia.

Los valores típicos oscilan entre 1.0 (acabado mate) a 250 (muy pulido) aunque se puede utilizar cualquier valor. Si no se especifica phong_size el valor por defecto del tamaño del destello es 40 (plástico). Por ejemplo:

  finish { phong 0.9 phong_size 60 }

Si no se especifica phong, phong_size no tiene ningún efecto.

6.7.3.3.2  Destello Especular

La palabra specular en una declaración de acabado (finish) provoca un reflejo muy similar a los destellos Phong, pero usa un modelo ligeramente diferente. El modelo especular, examinado más de cerca, se ajusta más a la reflexión especular real y proporciona una distribución de los reflejos más creíble de los destellos que ocurren cerca de los bordes del objeto.

El valor típico especular va de 0.0 a 1.0, donde 1.0 causa una saturación completa del color del punto de luz en la zona más brillante (centro) del destello. El valor por defecto specular 0.0 no causa reflejos.

El tamaño del reflejo se define mediante la palabra clave roughness (rugosidad). Los valores típicos van de 1.0 (muy áspero - reflejo grande) a 0.0005 (muy suave - reflejo pequeño). El valor por defecto, si no se especifica otra rugosidad, es 0.05 (plástico).

Es posible que se especifiquen valores erróneos para la rugosidad que generen un error mientras se trate de procesar un fichero. No se debe utilizar 0 y, si se obtienen mensajes de error, hay que comprobar que no se está utilizando un valor excesivamente pequeño que pueda estar causando el error. Por ejemplo:

  finish { specular 0.9 roughness 0.02 }

Si no se especifica specular, roughness no surte ningún efecto.

Aviso: Nótese que cuando la luz es reflejada por una superficie, como un espejo, se le llama reflexión especular, aunque dicha reflexión no se genere con la palabra clave specular. La reflexión especular del tipo espejo es determinada por la palabra clave reflection.

6.7.3.3.3  Modificador de Destellos Metálico

La palabra clave metallic (metálico) puede ser utilizada con los destellos phong o specular. Esta palabra clave indica que el color de los destellos se calculará mediante una función empírica que modela la reflexión de superficies metálicas.

Normalmente los destellos son del color de la fuente de luz. Añadiendo esta palabra clave, filtramos el destello y conseguimos que la luz blanca reflejada sobre una superficie metálica tome el color especificado por el pigmento.

La palabra clave metallic puede estar seguida, opcionalmente, por un valor numérico para especificar la influencia del efecto. Si no se especifica, el valor por defecto es 0. Si se especifica metallic sin ningún valor detrás, se toma el valor 1 por defecto. Por ejemplo:

  finish {
    phong 0.9
    phong_size 60
    metallic
  }

Si no se especifica algún destello, ya sea phong o specular, metallic no tiene efecto.

6.7.3.4  Reflexión Especular

Cuando la luz no se desparrama al llegar a un objeto, sino que rebota en el mismo ángulo en el que impactó, hablamos de reflexión especular. Esta reflexión de espejo está controlada por el bloque reflection (...) en una declaración de finish.

Sintaxis:

  
finish {
    reflection {
      [COLOR_REFLECTION_MIN,] COLOR_REFLECTION_MAX
      [fresnel BOOL_ON_OFF]
      [falloff FLOAT_FALLOFF]
      [exponent FLOAT_EXPONENT]
      [metallic FLOAT_METALLIC]
    }
  }
[interior { ior IOR }]

Su uso más simple sería un espejo perfecto:

  finish { reflection {1.0} ambient 0 diffuse 0 }

Esto proporciona al objeto un acabado de espejo en el que se reflejarán todos los demás objetos en la escena. Normalmente se especifica un valor en coma flotante después de la palabra clave, aunque la sintaxis invoque a un color. Por ejemplo un valor en coma flotante de 0.3 se promociona al vector de color entero <0.3,0.3,0.3,0.3,0.3>, lo cual es aceptable ya que sólo se utilizan las partes roja, verde y azul.

Los valores oscilarán entre 0.0 a 1.0. Por defecto no hay reflexión.

Avisos:
- Añadir reflexión a una textura incrementa el tiempo de generación debido a los rayos adicionales que han de trazarse.
- La luz reflejada puede tintarse especificando un color en lugar de un valor en coma flotante. Por ejemplo.
finish { reflection rgb <1,0,0> } da un espejo rojo que sólo refleja luz roja.
- Aunque a este tipo de reflexión se le llame reflexión especular, no está controlada por la palabra clave specular. Esa palabra clave determina un destello especular.
- La sintaxis antigua para reflexión simple "reflection COLOR" y "reflection_exponent Float" sin llaves, aún se soportan por motivos de compatibilidad con versiones anteriores.

falloff ajusta la disminución del exponente en la reflexión variable. Éste es el exponente que determinará lo rápido que disminuirá la reflexión, por ejemplo, lineal, cuadrática, cúbica, etc.

La palabra clave metallic es similar en funcionamiento a la palabra clave "metallic" usada para los destellos de los acabados: imita las propiedades reflexivas de las superficies metálicas, donde la luz reflejada toma el color de la superficie. Cuando se usa metallic, el color "reflejado" se multiplica por el pigmento de color en cada punto. Opcionalmente, se puede especificar un valor decimal, que será la influencia que metallic tendrá en el color reflejado. metallic utiliza un tipo de ecuación llamado Fresnel que hace que el color de la luz sea reflejado en ángulos oblicuos y el color del metal sea reflejado en ángulos cercanos a la normal de la superficie.

Exponente (exponent)
POV-Ray utiliza un modelo de luz limitado que no puede distinguir entre objetos de color claro y objetos brillantes. Una hoja de papel blanco, una bombilla, el sol y una supernova serían modelados como rgb<1,1,1> y objetos levemente menos blancos sólo serían ligeramente más oscuros. Es especialmente difícil modelar superficies parcialmente reflexivas de un modo realista. Objetos mediana o escasamente brillantes tienden a parecer demasiado brillantes cuando se vuelven reflexivos. Si se reduce el valor de reflexión también tienden a oscurecerse demasiado los objetos brillantes. Por ellos se ha añadido la palabra clave exponent. Esto provoca intensidades no-lineales de reflexión. El valor por defecto de 1.0 produce una curva lineal. Valores más bajos oscurecen las intensidades medio-bajas y mantienen brillantes las reflexiones de alta intensidad. Ésta es una característica experimental diseñada para su uso artístico y no se corresponde directamente con ninguna propiedad reflectante del mundo real.

Reflexión Variable
Muchos materiales, como el agua, la cerámica o el linóleo son más reflexivos cuando se observan desde ángulos pequeños. Esto puede simularse añadiendo una reflexión mínima en la declaración reflection (...).
Por ejemplo:

    finish { reflection { 0.03, 1 }}

usa la misma función que la reflexión estándar, pero el primer parámetro ajusta la reflexión mínima. Puede ser un vector de color o un valor decimal (que será automáticamente promocionado a un vector gris). Éste valor mínimo indica lo reflexiva que será la superficie cuando sea observada desde una dirección paralela a su normal.
El segundo parámetro ajusta la reflexión máxima, que también puede ser un vector de color o un valor decimal (promocionado a un vector gris). Este parámetro máximo indica cuan reflexiva será la superficie cuando sea observada desde 90º a su normal.

Aviso: Se puede ajustar la reflexión máxima a un valor menor que la reflexión mínima, aunque el resultado sea algo que no ocurre nunca en la naturaleza.

Cuando se añade la palabra clave fresnel, se utilizará la función de reflexión Fresnel en lugar de la reflexión estándar. Aquí se calculará la reflexión utilizando el acabado IOR (Índice de Refracción) del objeto. Por ello, cuando se utilice un tipo de reflexión fresnel se necesitará también una declaración interior (ior IOR), aún con pigmentos opacos. Recuerda que en la vida real la mayoría de los objetos opacos tienen una delgada capa transparente en su superficie reflectante, que tiene un IOR.

6.7.3.5  Conservar Energía para Reflexión

Uno de los rasgos de POV-Ray es la reflexión variable, incluyendo reflexión realista Fresnel (ver sección "Reflexión Variable"). Desafortunadamente, cuando ésta se complementa con transmisión constante (transmit), la textura puede parecer irreal. Esta irrealidad se debe a que en la escena se rompen las leyes de conservación de la energía. Mientras la cantidad de luz reflejada cambia, la cantidad de luz transmitida también debería cambiar (en una relación de toma-y-daca).

Esto puede conseguirse añadiendo la palabra clave conserve_energy (conservar energía) al acabado del objeto. Cuando se habilita conserve_energy, POV-Ray multiplicará la cantidad filtrada y transmitida por el valor que quede de restar el valor de la reflexión (por ejemplo, si la reflexión se ajusta al 80%, entonces filtrar/transmitir se multiplicará por 20%).

6.7.3.6  Iridiscencia

La Iridescencia, o interferencia de película fina de Newton, imita el efecto de la luz en superficies con una microscópica capa transparente superpuesta. El efecto es parecido al de una gota de aceite en un charco de agua o al color irisado de una pompa de jabón. Este efecto se controla mediante la declaración irid dentro de una declaración de finish.

Este parámetro modifica el color de la superficie en función del ángulo entre la fuente de luz y la superficie. Ya que este efecto funciona en conjunción con la posición y ángulo de las fuentes de luz, no se comporta siguiendo el mismo procedimiento que un patrón de pigmento.

La sintaxis es:

IRID:
    irid { Cantidad_Irid [IRID_ITEMS...] }
IRID_ITEMS:
    thickness Cantidad | turbulence Cantidad

El parámetro requerido Cantidad_Irid es la contribución al efecto iridiscente del color de la superficie. Como norma general hay que mantener este valor en .25 (25% de contribución) o menos, aunque también se pueden experimentar otros valores. Si la superficie se vuelve demasiado blanca, intenta bajar el valor de diffuse y, posiblemente, también el de ambient en la superficie.

La palabra clave thickness representa el grosor de la película. Éste es un parámetro incómodo de manejar, ya que el valor del grosor no guarda relación con la escala del objeto, sino que afecta a la escala del efecto. Una película delgada tiene una alta frecuencia de cambios de color (ej: una pompa de jabón), mientras que una película gruesa presentará mayores áreas del mismo color (un objeto envuelto en plástico transparente). El valor por defecto es 0.


El grosor de la película puede variarse mediante la palabra clave turbulence. Con iridiscencia sólo se puede ajustar la cantidad de turbulencia, ya que los valores de octaves, lambda y omega se ajustan internamente y no necesitan ser modificados por el usuario. Este parámetro varía un único valor, el grosor. Por ello, en vez de utilizar un vector, como se suele utilizar para turbulence, sólo se debe indicar un valor en coma flotante.

Además de esto, perturbar la normal de la superficie usando patrones de bultos también afectará a la iridiscencia.

Para los curiosos, la interferencia de película delgada ocurre cuando el rayo golpea la superficie de la película y una parte de la luz es reflejada, mientras que otra porción es transmitida al interior de la película. Este rayo de subsuperficie viaja a través de la película y rebota en el substrato opaco del objeto. La luz emerge de la película ligeramente cambiada de fase junto con el rayo que rebota en la superficie.

Este cambio de fase produce interferencias que varían con la longitud de onda de los colores del componente, resultando que en ocasiones las ondas son alteradas, y en ocasiones anuladas. Cuando estos componentes se recombinan, el resultado es la iridiscencia. Consúltese también ajustes globales "Longitud de onda de iridiscencia".

El concepto utilizado en este efecto viene del libro Fundamentos de Gráficos Tridimensionales por Computadora, por Alan Watt (Addison-Wesley).