6.7.1  Pigmento

El color o patrón de colores de un objeto se define mediante una instrucción pigment(pigmento). Todas las texturas planas deben tener un pigmento. Si no se especifica uno, se usa el definido por defecto. El color que se define en este elemento de la textura, es el que se vería si el objeto apareciera totalmente iluminado. Se escoge el color básico propio del objeto, y POV-Ray lo intensifica o lo oscurece dependiendo de la iluminación de la escena. El nombre de pigmento procede del hecho de que define el color básico del objeto, no el color del que aparece.

La sintaxis de un pigmento es:

PIGMENTO:
    pigment {
        [IDENTIFICADOR_DE_PIGMENTO]
        [TIPO_DE_PIGMENTO]
        [MODIFICADOR_DE_PIGMENTO...]
    }
TIPO_DE_PIGMENTO:
    TIPO_DE_PATRON | COLOR |
    image_map { 
        TIPO_DE_BITMAP "bitmap.ext" [MODIFICADORES_DE_BITMAP...]
    }
MODIFICADOR_DE_PIGMENTO:
    MODIFICADOR_DE_PATRON | LISTA_DE_COLORES | LISTA_DE_PIGMENTOS | 
    color_map { CUERPO_DE_MAPA_DE_COLORES } | colour_map {  CUERPO_DE_MAPA_DE_COLORES  } | 
    pigment_map {  CUERPO_DE_MAPA_DE_PIGMENTOS } | quick_color COLOR |
    quick_colour COLOR

Cada uno de los elementos del pigmento es opcional, pero, si está presente, debería estar en el orden mostrado. Los elementos que siguen a un IDENTIFICADOR_DE_PIGMENTO modifican o substituyen las especificaciones que se dan en el identificador. Si no se especifica un identificador, entonces los elementos modifican los valores de pigmento que se dan en la textura por defecto actual. El TIPO_DE_PIGMENTO debe caer en una de cuatro categorías. Cada una de ellas se detalla en las secciones que siguen. Dichas categorías son: color sólido y patrón de mapa de imagen, que son específicas del apartado pigment, o patrón de lista de colores y patrón de mapa de color, que usan una amplia selección de los patrones generales de POV-Ray. Véase "Patrones" para detalles sobre patrones específicos.

Al tipo de patrón sigue opcionalmente uno o más modificadores de pigmento. Adicionalmente, a los modificadores de patrones generales, como las transformaciones, turbulencia y el modificador remolino (warp), los pigmentos pueden tener LISTA_DE_COLORES, LISTA_DE_PIGMENTOS, color_map, pigment_map, y quick_color que son específicos de los pigmentos. Véase "Modificadores de patrón" para informarse sobre los modificadores generales. Los modificadores específicos de los pigmentos se describen también en las secciones siguientes. Estos modificadores de pigmento se aplican sólo a los pigmentos, y no a otras partes de las texturas. Serán detallados más adelante.

El grupo pigmento es una parte de la especificación "texture". Sin embargo, dado que puede ser tedioso añadir un grupo texture sólo para añadir color a un objeto, se puede incorporar directamente un pigmento a un objeto sin especificar que es parte de una textura. Por ejemplo, en lugar de:

  object { Mi_Objeto texture {pigment { color Red } } }

puede abreviar:

  object { Mi_Objeto pigment {color Red } }

Si se hace así, internamente se crea una estructura texture completa con un grupo normal y finish por defecto, como si se hubiese especificado explícitamente escribiendo texture {...} alrededor.

Los identificadores de pigmento pueden declararse, para hacer los archivos de escena más legibles y para parametrizar escenas, de forma que cambiando tan sólo una sencilla declaración se cambien automáticamente muchos valores. Un identificador se declara como sigue:

DECLARACION_DE_PIGMENTO:
    #declare IDENTIFICADOR = PIGMENTO |
    #local IDENTIFICADOR = PIGMENTO

Donde IDENTIFICADOR es el nombre del identificador de hasta 40 caracteres de longitud y PIGMENTO es cualquier grupo pigment válido. Véase "#declare vs. #local" para información sobre ámbitos de los identificadores.

6.7.1.1  Pigmentos de Color Sólido

El tipo más sencillo de pigmento es un color sólido. Para especificar un color sólido simplemente se sitúa una especificación de color dentro de un grupo de pigmento. Por ejemplo:

  pigment { color Orange }

Una especificación de color consiste en la palabra opcional color seguida de un identificador de color o por una especificación de la cantidad de rojo, verde, azul, filtro o transparencia no filtrada en superficie. Véase la sección "Especificando Colores" para más detalles sobre los colores. Cualquier modificador de patrón que se use con un color sólido es ignorado, ya que no hay patrón que modificar.

6.7.1.2  Patrones con Lista de Colores

Hay cuatro patrones con lista de colores: checker, hexagon, brick y object. El resultado es un patrón de colores sólidos con transiciones bruscas en lugar de la mezcla de colores característica de los patrones de mapa de colores. Cada uno de estos patrones es tratado con más detalle en una sección posterior. Su sintaxis es:

PIGMENTO_DE_LIST_DE_COLORES:
  pigment {brick [COLOR_1, [COLOR_2]] [PIGMENT_MODIFIERS...] }|
  pigment {checker [COLOR_1, [COLOR_2]] [PIGMENT_MODIFIERS...]}|
  pigment { 
     hexagon [COLOR_1, [COLOR_2, [COLOR_3]]] [PIGMENT_MODIFIERS...] 
  }|
  pigment {object IDENTIFICADOR_DE_OBJETO | OBJECTO {} [COLOR_1, COLOR_2]}

Cada COLOR_n es una especificación válida de color. Puede haber una coma entre cada color o se puede usar la palabra color como separador de forma que POV-Ray pueda determinar dónde empieza y termina cada una de las especificaciones. Los patrones brick y checker llevan dos colores y hexagon usa tres. Si hay un número de colores insuficiente, se usan los colores por defecto.

6.7.1.3  Mapas de Colores

Muchos de los patrones de colores no usan cambios de color abruptos, o sólo dos o tres colores, como pasa con los patrones de ladrillos, el ajedrezado o el hexagonal. Habitualmente, los patrones usan transiciones suaves de un color al siguiente. Los colores de definen en un modificador de pigmento de tipo color_map que describe como el patrón varía de un color al siguiente.

Cada uno de los patrones disponibles es de hecho un función matemática que toma cualquier punto (x, y, z) y lo convierte en un valor entre 0.0 y 1.0 inclusive.  Este número se usa para especificar cómo se mezclan los colores del mapa.

La sintaxis de color_map es la siguiente:

MAPA_DE_COLORES:
    color_map { CUERPO_DE_MAPA_DE_COLORES } | colour_map {  CUERPO_DE_MAPA_DE_COLORES }
CUERPO_DE_MAPA_DE_COLORES:
    IDENTIFICADOR_DE_MAPA_DE_COLORES | ELEMENTO_DE_MAPA_DE_COLORES...
ELEMENTO_DE_MAPA_DE_COLORES:
    [ Valor COLOR ] | 
    [ Valor_1, Valor_2 color COLOR_1 color COLOR_2 ]

Donde los valores Valor_n son números de coma flotante entre 0.0 y 1.0 inclusive y cada COLOR_n, es una especificación de color.

Nota: Los corchetes [] son parte del ELEMENTO_DE_MAPA_DE_COLORES. No son símbolos de la notación descriptiva que denoten partes opcionales. Los corchetes rodean cada elemento de un mapa de colores.

Pueden haber de 2 a 256 elementos en el mapa. Puede usarse la forma alternativa colour_map.

Veamos un ejemplo:

  sphere {
    <0,1,2>, 2
    pigment {
      gradient x       // Éste es el TIPO_DE_PATRÓN
      color_map {
        [0.1  color Red]
        [0.3  color Yellow]
        [0.6  color Blue]
        [0.6  color Green]
        [0.8  color Cyan]
      }
    }
  }

La función de patrón gradient x se evalúa y el resultado es un valor entre 0.0 y 1.0. Si el valor es menor que el primer elemento (en este caso 0.1) entonces se usa el primer color (rojo). Valores entre 0.1 y 0.3 usan una mezcla de rojo y amarillo mediante una interpolación lineal de los dos colores. Análogamente, los valores entre 0.3 y 0.6 van del amarillo al azul.

El tercer y cuarto elemento tienen ambos un valor de 0.6. Esto causa un cambio abrupto de color del azul al verde. Específicamente, un valor inferior a 0.6 estará muy próximo al azul, pero un valor de 0.6 será verde. Siguiendo adelante, los valores entre 0.6 y 0.8 consistirán en una transición entre verde y cyan. Finalmente, cualquier valor mayor de 0.8 será cyan.

Si se quieren áreas de color liso, simplemente se ha de especificar el mismo color en dos elementos adyacentes. Por ejemplo:

  color_map {
    [0.1  color Red]
    [0.3  color Yellow]
    [0.6  color Yellow]
    [0.8  color Green]
  }

En este caso, cualquier valor de 0.3 a 0.6 será de color amarillo puro.

La primera versión sintáctica de ELEMENTO_DE_MAPA_DE_COLOR con un número en coma flotante y un color es el estándar en la actualidad. La otra versión de doble valor numérico es obsoleta y debería evitarse. Usando esa antigua sintaxis, el primer ejemplo se convertiría en:

  color_map {
    [0.0 0.1  color Red color Red]
    [0.1 0.3  color Red color Yellow]
    [0.3 0.6  color Yellow color Yellow]
    [0.6.0.8  color Yellow color Green]
    [0.8 1.0  color Green color Green]
  }

Se puede usar color_map con cualquier patrón, excepto brick, checker, hexagon, object e image_map. Es posible declarar y usar identificadores para un mapa de colores. Por ejemplo:

  #declare Colores_del_Arco_Iris=
    color_map {
      [0.0   color Magenta]
      [0.33  color Yellow]
      [0.67  color Cyan]
      [1.0   color Magenta]
    }
  object {
    Mi_Objeto
    pigment {
      gradient x
      color_map { Colores_del_Arco_Iris }
    }
  }

6.7.1.4  Mapas de Pigmentos y Listas de Pigmentos

Además de especificar transiciones entre colores con un mapa de colores, se puede crear una mezcla de pigmentos usando pigment_map. La sintaxis de un mapa de pigmentos es idéntica a la del mapa de colores, excepto que se especifica un pigmento en cada elemento del mapa, en lugar de un color.

Su sintaxis es:

MAPA_DE_PIGMENTO:
    pigment_map { CUERPO_DE_MAPA_DE_PIGMENTO }
CUERPO_DE_MAPA_DE_PIGMENTO:
    IDENTIFICADOR_DE_MAPA_DE_PIGMENTO | ELEMENTO_DE_MAPA_DE_PIGMENTO...
ELEMENTO_DE_MAPA_DE_PIGMENTO:
    [ Valor CUERPO_DE_PIGMENTO ]

Donde Valor es un número en coma flotante entre 0.0 y 1.0 incluidos y cada CUERPO_DE_PIGMENTO es cualquier cosa que pueda encontrarse dentro de una instrucción pigment{...}. La palabra pigment y la llaves {} no necesitan especificarse.

Nota: Los corchetes [] son parte del ELEMENTO_DE_MAPA_DE_PIGMENTO. No se trata de símbolos de notación que denoten que una parte es opcional. Los corchetes rodean cada elemento del mapa de pigmento.

Pueden haber entre 2 y 256 elementos en un mapa de pigmento.

Por ejemplo

  sphere {
    <0,1,2>, 2
    pigment {
      gradient x       // éste es el TIPO_DE_PATRÓN
      pigment_map {
        [0.3 wood scale 0.2]
        [0.3 Jade]    // esto es un identificador de pigmento
        [0.6 Jade]
        [0.9 marble turbulence 1]
      }
    }
  }

Cuando la función gradient x devuelve valores entre 0.0 y 0.3, se usa el pigmento escalado de tipo madera. De 0.3 a 0.6, se usa el pigmento de identificador Jade. De 0.6 a 0.9 se usa una mezcla entre Jade y mármol turbulento. De 0.9 en adelante sólo se usa este último.

Los mapas de pigmento pueden ser anidados hasta cualquier nivel de complejidad que se desee. Los pigmentos de uno de estas construcciones pueden tener en su composición mapas de color, o mapas de pigmento o cualquier otro tipo de pigmento que se desee. Un elemento de un mapa de pigmento puede ser un color sólido, pero si todos lo son tal vez sería más conveniente usar color_map para acelerar los cálculos.

También se pueden usar pigmentos completos con los patrones de bloque como checker, hexagon y brick. Por ejemplo...

  pigment {
    checker
    pigment { Jade scale .8 }
    pigment { White_Marble scale .5 }
  }

Nota: en el caso de los patrones de bloque es necesario usar la palabra pigment y las llaves alrededor de la información del pigmento.

Un mapa de pigmentos se usa también con el tipo de pigmento average. Véase "Promedio" (average) para más detalles.

No se debe usar pigment_map o pigmentos individuales con image_map. Véase la sección "Mapas de Textura" para una forma alternativa a ese uso.

Se pueden declarar y usar identificadores de mapas de pigmento, pero la única forma de declarar un patrón de bloques de pigmento es usar un identificador de pigmento para todo el pigmento.

6.7.1.5  Mapas de Imagen

Cuando todo lo demás falla y ninguno de los tipos de patrón de pigmentos detallados hasta ahora cubre las necesidades, se puede usar image_map para extender una imagen de mapa de bits bidimensional sobre un objeto tridimensional.

6.7.1.5.1  Especificando un Mapa de Imagen

La sintaxis de image_map es:

MAPA_DE_IMAGEN:
    pigment
    {
        image_map
        {
            [TIPO_DE_BITMAP] "bitmap[.ext]"
            [MODIFICADORES_DE_MAPA_DE_IMAGEN...]
        }
        [MODFICADORES_DE_PIGMENTO...]
    }
TIPO_DE_BITMAP:
    gif | tga | iff | ppm | pgm | png | jpeg | tiff | sys
MODIFICADORES_DE_MAPA_DE_IMAGEN :
    map_type Type | once | interpolate Type | 
    filter Palette, Amount | filter all Amount |
    transmit Palette, Amount | transmit all Amount

Tras el opcional TIPO_DE_BITMAP, se sitúa una cadena de caracteres con el nombre del archivo que contiene la imagen de mapa de bits del tipo especificado. Si no se proporciona TIPO_DE_BITMAP, se espera el mismo tipo que se fije para almacenamiento del resultado.

Ejemplo:

  plane {
    -z,0 
    pigment {
      image_map {png "Eggs.png"}
    }
  }

  plane {
    -z,0 
    pigment {
      image_map {"Eggs"}
    }
  }

El segundo método buscará y usará el archivo "Eggs.png" si el fichero de destino se fija a png (Output_File_Type=N en el fichero INI o +FN en la línea de comandos). Esto es particularmente útil cuando la imagen utilizada ha sido generada también por POV-Ray.

A esta especificación pueden seguirla varios modificadores opcionales, que se describen más adelante.

Nota: versiones más antiguas de POV-Ray permitían algunos modificadores antes del TIPO_DE_BITMAP, pero esta sintaxis está desfasada en favor de la que aquí se detalla.

Nota: el formato sys es un formato que depende del sistema operativo, como el BMP en Windows o Pict en Macintosh.

Los nombres de archivos especificados en las instrucciones image_map se buscarán primero en el directorio actual y, si no se encuentran, en las carpetas especificadas en cada una de las opciones +L o Library_Path activas. Esto facilita el almacenamiento de los archivos de imagen en un subdirectorio específico y usar una opción Library_Path para especificar dónde está la biblioteca de imágenes. Véase "Directorios de las Librerías" para más detalles.

Por defecto, la imagen se sitúa en el plano x-y. La imagen se proyecta sobre el objeto, como si hubiese un proyector de diapositivas situado en el extremo negativo del eje z. La imagen llena exactamente un área cuadrada de coordenadas (0,0) a (1,1) independientemente del tamaño original en píxeles de la imagen. Si se desea alterar esto, se puede trasladar, rotar o escalar el pigmento o la textura para situarla en el lugar adecuado de la superficie del objeto.

En la sección "Ajedrezado", se explica el patrón checker. Las casillas se describen como cubos sólidos de una substancia coloreada de la cual se recortan los objetos. Para los mapas de imagen se debe imaginar que cada píxel es un larga y delgada varilla, de sección cuadrada, coloreada, que se extiende paralela al eje z. La construcción está hecha de filas y columnas de estas varillas pegadas, y el objeto está esculpido en este material.

Si se desea cambiar la orientación por defecto, se puede rotar, trasladar o escalar el pigmento o la textura para situarla en el lugar adecuado del objeto.

El nombre de archivo va seguido opcionalmente por uno o más MODIFICADORES_DE_BITMAP. Los modificadores filter, filter all, transmit, y transmit all son específico de los mapas de imagen y se comentan en las siguientes secciones. Además, también pueden usarse aquí los modificadores más generales map_type, once e interpolate, descritos en "Modificadores de Mapa de Bits".

6.7.1.5.2  Los Modificadores de Bitmap: Filter y Transmit

Para hacer la imagen o una parte de ella transparente, se pueden especificar valores para filter y/o transmit para cada color o valor de la paleta de una imagen PNG, GIF o IFF (por lo menos para los modos que usan paleta). Se puede hacer mediante el añadido de la palabra filter o transmit después del nombre de archivo. Esta palabra irá seguida de dos números. El primero nos indica el número de la paleta al que hacemos referencia, y el segundo el valor de transparencia que aplicamos. Los valores pueden ir separados por una coma. Por ejemplo:

  image_map {
    gif "mypic.gif"
    filter   0, 0.5 // Hace el color 0 50% transparente filtrado
    filter   5, 1.0 // Hace el color 5 100% transparente filtrado
    transmit 8, 0.3 // Hace el color 8 30% transparente sin filtrado
  }

Se puede dotar a toda la imagen de un valor de filter o transmit usando filter all Cantidad o transmit all Cantidad. Por ejemplo:

  image_map {
    gif "stnglass.gif"
    filter all 0.9
  }

Nota: anteriores versiones de POV-Ray usaban la palabra alpha para especificar transparencia con filtro, sin embargo esa palabra se usa habitualmente para especificar transparencia no filtrada. Por esta razón alpha no será usada en lo sucesivo.

Véase la sección "Especificando Colores" para ver detalles de las diferencias entre transparencia filtrada y no filtrada.

6.7.1.5.3  Uso del Canal Alfa

Otra forma de especificar transparencia no filtrada en un mapa de imagen consiste en usar el canal alfa. POV-Ray usará automáticamente el canal alfa almacenado en la imagen para transparencia no filtrada. El formato PNG permite almacenar un valor diferente para cada índice de color de la imagen, si así se desea. Si utiliza un programa de edición de imágenes que permite utilizar esta característica, puede utilizarlo en lugar de especificar valores desde el archivo POV. Puesto que los archivos PNG y TGA también pueden almacenar un canal alfa completo de la imagen, con información sobre la transparencia, también es posible generar mapas de imagen cuya transparencia no depende del color, si no de la posición de cada píxel en la imagen.

Mientras que POV-Ray usa transmit 0.0 para especificar opacidad y 1.0 para la transparencia completa, la información del canal alfa tiene un rango de 0 a 255 en la dirección contraria. Un dato Alfa 0 significa lo mismo que transmit 1.0 y el dato alfa 255 produce un transmit 0.0.

6.7.1.6  Color Rápido

Cuando desarrollamos escenas de POV-Ray, a veces es útil generarlas en modo de baja calidad para probarlas rápidamente. La opción +Q de la línea de comandos o la opción Quality del archivo INI se pueden usar para eliminar algunos patrones que consumen mucho tiempo de cálculo y conseguir que la generación de la escena concluya en muy poco tiempo. Véase "Ajustes de Calidad" para más detalles. De todas formas, ajustes del tipo +Q5 o Quality=5 o inferior desactivan los cálculos complejos de pigmentación y crean objetos grises.

Añadiendo quick_color a un pigmento, se le dice al POV-Ray qué color sólido debe usar para generaciones rápidas, en lugar de un pigmento complejo. Por ejemplo:

  pigment {
    gradient x
    color_map{
      [0.0 color Yellow]
      [0.3 color Cyan]
      [0.6 color Magenta]
      [1.0 color Cyan]
    }
    turbulence 0.5
    lambda 1.5
    omega 0.75
    octaves 8
    quick_color Neon_Pink
  }

Esto obliga a POV-Ray a usar el color Neon_Pink para pruebas a calidad +Q5 o inferior, y un patrón gradiente con turbulencia para calidades +Q6 y superiores. Colores sólidos como

  pigment {color Magenta}

fijan automáticamente quick_color a ese valor. Se puede ajustar esto si se desea. Imaginemos que tenemos 10 esferas amarillas en la pantalla. Si se desea identificarlas individualmente, se le puede dar a cada una un quick_color diferente a cada una como:

  sphere {
    <1,2,3>,4
    pigment { color Yellow  quick_color Red }
  }
  sphere {
    <-1,-2,-3>,4
    pigment { color Yellow  quick_color Blue }
  }

y así, con calidad +Q6 o superior todas se verán amarillas, pero a +Q5 o inferior sus colores serán diferentes, con lo que serán fáciles de identificar.

También se admite la escritura quick_colour para esta expresión.