3.9.1  Pigmentos

Toda superficie debe tener un color. En POV-Ray a este color se le llama pigment. No es necesario que sea un solo color. Puede ser un patrón de colores, una lista de colores, o incluso un mapa de imagen. Los pigmentos también pueden ser superpuestos uno sobre otro siempre y cuando los pigmentos de las capas superiores sean al menos parcialmente transparentes para que los que están por debajo puedan ser visibles. Juguemos un poco con algunos de estos tipos de pigmentos.

Creemos un archivo llamado texdemo.pov y editémoslo de la siguiente manera:

  #include "colors.inc"
  camera {
    location <1, 1, -7>
    look_at 0
    angle 36
  }
  light_source { <1000, 1000, -1000> White }
  plane {
    y, -1.5
    pigment { checker Green, White }
  }
  sphere {
    <0,0,0>, 1
    pigment { Red }
  }

Haciendo un trazado rápido de prueba de este archivo a 200x150 -A, vemos que es una simple esfera roja sobre un plano a cuadros verde y blanco. Utilizaremos la esfera para ver nuestras texturas.

3.9.1.1  Usando pigmentos con lista de colores

Antes de comenzar debemos notar que ya hemos realizado un tipo de pigmento, el pigmento con lista de colores. En el ejemplo anterior hemos usado el patrón a cuadros (checker) en nuestro plano. Hay otros tres tipos de pigmentos con lista de colores, brick (ladrillos), hexagon y el patrón object (objeto). Probemos cada uno de ellos rápidamente. Primero, cambiamos el pigmento del plano como sigue:

  pigment { hexagon Green, White, Yellow }

Generando esto vemos un patrón hexagonal de tres colores. Note que este patrón requiere de tres colores. Ahora cambiamos el pigmento a...

  pigment { brick Gray75, Red rotate -90*x scale .25 }

Mirando la imagen resultante vemos que el plano ahora tiene un patrón de ladrillos. Vemos que tuvimos que rotar el patrón para que éste aparezca correctamente sobre el plano horizontal. Este patrón es usado generalmente en superficies verticales. También tuvimos que disminuir un poco su tamaño (scale .25) para poder verlo más claramente. Podemos jugar un poco con estos pigmentos con lista de colores, cambiar los colores, etc. hasta conseguir un piso que nos guste.

3.9.1.2  Usando pigmentos y patrones

Comencemos a texturizar nuestra esfera usando un patrón y un mapa de color que consista de tres colores. Reemplazamos el bloque del pigmento con lo siguiente:

  pigment {
    gradient x
    color_map {
      [0.00 color Red]
      [0.33 color Blue]
      [0.66 color Yellow]
      [1.00 color Red]
    }
  }

Generando esto vemos que el patrón gradient (gradiente) da un patrón interesante de franjas verticales. Cambiamos la dirección del gradiente a y. Las franjas ahora son horizontales. Cambiamos la dirección del gradiente a z. Ahora las franjas se parecen mas a anillos concéntricos. Esto es así porque la dirección del gradiente es tal que se aleja directamente de la cámara. Volvemos a poner la dirección a x, y agregamos lo siguiente al bloque de pigmento.

  pigment {
    gradient x
    color_map {
      [0.00 color Red]
      [0.33 color Blue]
      [0.66 color Yellow]
      [1.00 color Red]
    }
    rotate -45*z          // <- Agregar esta línea
  }

Las barras verticales están ahora inclinadas a un ángulo de 45 grados. Todos los patrones pueden ser rotados, escalados y trasladados de esta forma. Probemos ahora algunos tipos distintos de patrones. Uno por vez, sustituimos los siguientes identificadores en lugar de gradient x y generamos la imagen para observar el resultado: bozo, marble (mármol), agate, granite (granito), leopard, spotted (manchas) y wood (madera) (si queremos podemos probar todos los patrones listados en la sección "Patrones").

Al generar esto vemos que cada uno nos da un patrón ligeramente diferente. Pero para obtener resultados realmente buenos cada tipo de patrón requiere la utilización de algunos modificadores de patrones.

3.9.1.3  Usando modificadores de patrón

Veamos ahora algunos modificadores de patrón. Primero, cambiemos el tipo de patrón a bozo. Luego hacemos las siguientes modificaciones:

  pigment {
    bozo
    frequency 3            // <- Agregar esta línea
    color_map {
      [0.00 color Red]
      [0.33 color Blue]
      [0.66 color Yellow]
      [1.00 color Red]
    }
    rotate -45*z
  }

El modificador frequency (frecuencia) determina el número de veces que el mapa de color se repite por cada unidad de tamaño. Este cambio hace que el patrón bozo, que vimos anteriormente, tenga muchas más bandas. Ahora cambiemos el tipo de patrón a marble (mármol). Cuando generamos esto anteriormente, observamos un patrón con bandas similar a gradient y que no se parecía en nada a mármol. Esto sucede porque marble es en realidad un tipo de gradiente y necesita otro modificador de patrón para que sea más parecido a mármol. Este modificador se llama turbulence (turbulencia). Cambiemos la linea frequency 3 a turbulence 1 y generemos nuevamente la imagen. ¡Eso está mejor! Probemos ahora con frequency 3 justo a continuación de la turbulencia y echémosle un vistazo. ¡Aun más interesante!

¡Espera, que se pone mejor! La turbulencia en sí misma tiene modificadores propios. Podemos ajustar la turbulencia de varios modos. Primero, el número de coma flotante que sucede al identificador turbulence puede tomar cualquier valor, con los valores más altos causando más turbulencia. Segundo, podemos usar los identificadores omega, lambda y octaves (octavas) para variar los parámetros de la turbulencia.

Probemos esto:

  pigment {
    marble
    turbulence 0.5
    lambda 1.5
    omega 0.8
    octaves 5
    frequency 3
    color_map {
      [0.00 color Red]
      [0.33 color Blue]
      [0.66 color Yellow]
      [1.00 color Red]
    }
    rotate 45*z
  }

Al generar esto observamos que la turbulencia ha cambiado y el patrón se ve diferente. Juguemos un poco con los valores de turbulence, lambda, omega y octaves para ver qué es lo que hacen.

3.9.1.4  Usando pigmentos transparentes y texturas superpuestas

Los pigmentos se describen por medio de valores numéricos que dan el valor rgb del color a usar (ej. color rgb<1,0,0> nos da un color rojo). Pero esta sintaxis permite más, no sólo valores rgb. Podemos especificar una transparencia filtrada modificándolo de la siguiente manera: color rgbf<1,0,0,1>. La f viene de filter (filtro), la palabra que usa POV-Ray para identificar la transparencia filtrada. Un valor de 1 significa que el color es completamente transparente, pero aun filtra la luz de acuerdo a qué pigmento es. En este caso, el color es rojo transparente, como celofán rojo.

POV-Ray tiene otro tipo más de transparencia. Se llama transmittance o transparencia no-filtrada (el identificador es transmit; vea también rgbt). Se diferencia de filter en que no filtra la luz de acuerdo al color del pigmento. En cambio, permite que toda la luz pase sin ser modificada. Puede especificarse de la siguiente manera: rgbt <1,0,0,1>.

Usemos algunos pigmentos transparentes para crear otro tipo de textura, la textura superpuesta. Retomando el ejemplo anterior, declaramos la siguiente textura.

  #declare AreaTierra = texture {
      pigment {
        agate
        turbulence 1
        lambda 1.5
        omega .8
        octaves 8
        color_map {
          [0.00 color rgb <.5, .25, .15>]
          [0.33 color rgb <.1, .5, .4>]
          [0.86 color rgb <.6, .3, .1>]
          [1.00 color rgb <.5, .25, .15>]
        }
      }
    }

Esta textura se usará en el área de la tierra. Ahora creemos los océanos declarando lo siguiente.

  #declare AreaOceanos = texture {
      pigment {
        bozo
        turbulence .5
        lambda 2
        color_map {
          [0.00, 0.33 color rgb <0, 0, 1>
                      color rgb <0, 0, 1>]
          [0.33, 0.66 color rgbf <1, 1, 1, 1>
                      color rgbf <1, 1, 1, 1>]
          [0.66, 1.00 color rgb <0, 0, 1>
                      color rgb <0, 0, 1>]
        }
      }
    }

Nota: el océano es el área azul opaco y la tierra es el área transparente que permitirá que la textura de la capa inferior sea visible.

Ahora, declaremos una nueva textura para simular una atmósfera con nubes.

  #declare AreaNubes = texture {
    pigment {
      agate
      turbulence 1
      lambda 2
      frequency 2
      color_map {
        [0.0 color rgbf <1, 1, 1, 1>]
        [0.5 color rgbf <1, 1, 1, .35>]
        [1.0 color rgbf <1, 1, 1, 1>]
      }
    }
  }

Ahora apliquemos todo esto a nuestra esfera.

  sphere {
    <0,0,0>, 1
    texture { AreaTierra }
    texture { AreaOceanos }
    texture { AreaNubes }
  }

Generamos esto y vemos una representación aceptable de un pequeño planetoide. Pero puede ser mejor. En particular, no nos convence la apariencia de las nubes. Hay un modo con el cual pueden ser mucho más realistas.

3.9.1.5  Usando mapas de pigmentos

Los pigmentos pueden ser combinados de la misma manera en que los colores se combinan en un mapa de colores, usando los mismos identificadores de patrón y pigment_map. Probémoslo.

Agregamos las siguientes declaraciones, asegurándonos que aparezcan antes que las otras declaraciones que tenemos en el archivo.

  #declare Nubes1 = pigment {
      bozo
      turbulence 1
      color_map {
        [0.0 color White filter 1]
        [0.5 color White]
        [1.0 color White filter 1]
      }
    }
  #declare Nubes2 = pigment {
    agate
    turbulence 1
    color_map {
      [0.0 color White filter 1]
      [0.5 color White]
      [1.0 color White filter 1]
      }
    }
  #declare Nubes3 = pigment {
    marble
    turbulence 1
    color_map {
      [0.0 color White filter 1]
      [0.5 color White]
      [1.0 color White filter 1]
    }
  }
  #declare Nubes4 = pigment {
    granite
    turbulence 1
    color_map {
      [0.0 color White filter 1]
      [0.5 color White]
      [1.0 color White filter 1]
    }
  }

Ahora usamos estos pigmentos declarados en la capa de nubes de nuestro planetoide. Reemplazamos la capa de nube declarado con lo siguiente.

  #declare AreaNubes = texture {
    pigment {
      gradient y
      pigment_map {
        [0.00 Nubes1]
        [0.25 Nubes2]
        [0.50 Nubes3]
        [0.75 Nubes4]
        [1.00 Nubes1]
      }
    }
  }

Al generar esto vemos un patrón interesante que se asemeja bastante a los patrones del clima en la Tierra. Están separadas en bandas, simulando los distintos tipos de clima a distintas latitudes.