6.7.5  Texturas con Patrón (Patterned Textures)

Las texturas con patrón son texturas complejas elaboradas a partir de múltiples texturas. Una textura plana tiene sólo una declaración de pigmento, normal y acabado. Incluso un pigmento con un mapa de pigmentos es sólo un pigmento sencillo y por eso es considerada una textura plana, al igual que los mapas de normales en las declaraciones de normal.

Las texturas de patrón pueden utilizar cualquier declaración de texture_map para determinar la mezcla o el patrón de texturas o bloque de texturas, como checker, con una lista de texturas, o un mapa de bits similar a un mapa de imagen determinado, llamado mapa de material, con una declaración de material_map.

La sintaxis es:

TEXTURA_CON_PATRÓN:
    texture
    {
        [PATTERNED_TEXTURE_ID]
        [TRANSFORMATIONS...]
    } |
    texture
    {
        PATTERN_TYPE
        [TEXTURE_PATTERN_MODIFIERS...]
    } |
    texture
    {
        tiles TEXTURE tile2 TEXTURE
        [TRANSFORMATIONS...]
    } |
    texture
    {
        material_map
        {
            BITMAP_TYPE "bitmap.ext"
            [BITMAP_MODS...] TEXTURE... [TRANSFORMATIONS...]
        }
    }
TEXTURE_PATTERN_MODIFIER:
    PATTERN_MODIFIER | TEXTURE_LIST |
    texture_map { TEXTURE_MAP_BODY }

Hay algunas restricciones a la hora de utilizar texturas con patrón. Una textura con patrón no puede ser utilizada como textura por defecto (ver sección "La directiva #default"). Una textura con patrón no puede ser utilizada como capa en una textura de múltiples capas, aunque sí se puede usar una textura con capas en alguna de las texturas incluidas en una declaración de textura con patrón.

6.7.5.1  Mapas de Texturas

Además de especificar una mezcla de colores con un mapa de color o un mapa de pigmento, se pueden crear mezclas de texturas utilizando texture_map. La sintaxis para un mapa de textura es idéntica a la del mapa de pigmento, excepto que se especifica una textura por cada entrada del mapa.

La sintaxis para texture_map es como sigue:

TEXTURE_MAP:
    texture_map { TEXTURE_MAP_BODY }
TEXTURE_MAP_BODY:
  TEXTURE_MAP_IDENTIFIER | TEXTURE_MAP_ENTRY...
ENTRADA_DEL_MAPA_DE_TEXTURAS:
    [ Value TEXTURE_BODY ]

Donde Value es un valor en coma flotante entre 0.0 y 1.0, ambos inclusive, y cada CUERPO_DE_TEXTURA es cualquier cosa que pueda situarse dentro de una declaración texture (...). La palabra clave texture y sus {} llaves no necesitan ser especificadas.

Aviso: los [] corchetes son parte de la ENTRADA_DEL_MAPA_DE_TEXTURAS. No son símbolos de notación indicando partes opcionales. Los corchetes envuelven cada entrada en el mapa de texturas.

Pueden haber entre 2 y 256 entradas por mapa.

Por ejemplo:

  texture {
    gradient x       // éste es el tipo de patrón 
    texture_map {
      [0.3  pigment{Red} finish{phong 1}]
      [0.3  T_Wood11]    // esto es un identificador de textura
      [0.6  T_Wood11]
      [0.9  pigment{DMFWood4} finish{Shiny}]
    }
  }

Cuando la función gradient x devuelve valores entre 0.0 y 0.3 se utiliza la textura roja brillante. De 0.3 a 0.6 se utiliza el identificador de textura T_Wood11. De 0.6 a 0.9 se usará una mezcla de T_Wood11 y un DMFWood4 brillante. De 0.9 en adelante, sólo se utiliza la última textura.

Los mapas de textura pueden estar anidados hasta cualquier nivel de complejidad que se desee. Las texturas en un mapa de texturas pueden tener mapas de colores, o mapas de texturas, o cualquier tipo de textura que se desee.

El área mezclada de un mapa de texturas funciona calculando completamente las texturas que intervienen en su totalidad, y luego interpolando sus colores aparentes. Esto significa que la reflexión, refracción y cálculos de iluminación se realizan dos veces por cada punto, cuando, normalmente, la forma de calcular un mapa de pigmento y un mapa de normal en una textura sencilla sería computar el pigmento, la normal, la reflexión, refracción e iluminación sólo una vez por cada punto.

Las texturas completas pueden también utilizarse en los bloques de patrón, como checker, hexagon y brick. Por ejemplo...

  texture {
    checker
      texture { T_Wood12 scale .8 }
      texture {
        pigment { White_Marble }
        finish { Shiny }
        scale .5
      }
    }
  }

Aviso: en el caso de los bloques de patrón, la palabra clave texture ha de envolver toda la información sobre la textura. Nótese también que esta sintaxis prohíbe el uso de texturas superpuestas, aunque, sin embargo, se pueden declarar texturas para una capa y referenciar después al identificador.

Con el tipo de textura average también se utilizan mapas de texturas. Consultar "Average" para más detalles.

Se pueden declarar y utilizar identificadores de mapas de texturas, pero el único modo de declarar un bloque de mapa de textura con patrón es declarando un identificador de textura para la textura completa.

6.7.5.2  Baldosas (Tiles)

Las versiones anteriores de POV-Ray tenían una textura con patrón llamada textura baldosas (tiles). Se utilizaban las palabras clave tiles y tile2 para crear un patrón ajedrezado de texturas.

TEXTURA_BALDOSAS:
    texture
    {
        tiles TEXTURA tile2 TEXTURA
        [TRANSFORMACIONES...]
    }

Aunque aún se soporta este diseño por razones de compatibilidad, se debe utilizar el patrón de textura checker descrito en la sección "Mapas de Texturas" en lugar de las baldosas

6.7.5.3  Mapas de Materiales

La textura con patrón material_map extiende el concepto de mapas de imágenes a texturas completas en lugar de a colores sólidos. Un mapa de material nos permite "envolver" con un mapa de bits bidimensional nuestros objetos tridimensionales.

En lugar de colocar el color sólido de la imagen en el objeto como un mapa de imagen, se especifica una textura completa basada en el índice o color de la imagen en ese punto. Se debe especificar una lista de texturas a utilizar como una paleta de texturas en lugar de una paleta de colores normal.

Cuando se utiliza con una imagen mapeada como GIF, y algunás imágenes PNG y TGA, el índice del píxel se usa como un índice dentro de la lista de texturas que indicamos. Para imágenes sin mapear, como algunas imágenes PNG o TGA, el valor del bit 8 del componente rojo en un rango 0-255 se utiliza como índice.

Si el índice del píxel es mayor que el número de texturas listadas, entonces se toma el índice como módulo N, donde N es la longitud de las texturas listadas.

Note: La declaración material_map no tiene nada que ver con la declaración material. Un mapa de material no es un modo de crear un material con patrón. Consultar la sección "Material" para la explicación de este tema sin relación, aunque de nombre parecido.

6.7.5.3.1 Especificando un Mapa de Materiales

La sintaxis para un material_map es:

MATERIAL_MAP:
    texture
    {
        material_map
        {
            TIPO_DE_BITMAP "bitmap.ext"
            [MODIFICADOR_DE_BITMAP...] TEXTURA... [TRANSFORMACIONES...]
        }
    }
TIPO_DE_BITMAP:
    gif | tga | iff | ppm | pgm | png | jpeg | tiff | sys
MODIFICADOR_DE_BITMAP:
    map_type Tipo | once | interpolate Tipo

Después de la palabra clave requerida TIPO_DE_BITMAP tiene que ir una expresión de cadena conteniendo el nombre de archivo del mapa de material del tipo especificado. A continuación pueden ir algunos modificadores que se describen más adelante.

Aviso: las primeras versiones de POV-Ray permitían algunos modificadores antes de TIPO_DE_BITMAP, pero esa sintaxis ha sido reemplazada en favor de la aquí descrita.

Aviso: el formato sys es un formato específico de sistema, como BMP para Windows o Pict para Macintosh.

Los nombres de archivos especificados en la declaración de material map se buscarán primero en la carpeta o directorio actual y, si no se encuentran, en las carpetas especificadas por cualquier opción +L o Directorio_de_Libreria activo. Esto debería facilitar el mantener todos los archivos con mapas de materiales en una subcarpeta aparte e indicar mediante un Directorio_de_Libreria donde se encuentran nuestros mapas de material. Ver "Directorios de Librerías" para más detalles.

El material es mapeado, por defecto, en el plano x-y. El material es proyectado sobre el objeto como si utilizásemos un proyector en la dirección Z. El material ocupa exactamente un área cuadrada desde las coordenadas XY (0,0) a (1,1), sin importar el tamaño original del archivo en píxeles. Si se quiere modificar esto, se ha de trasladar, rotar y/o escalar la textura para mapear la superficie del objeto como se desee.

El nombre de archivo puede ir seguido opcionalmente por uno o más MODIFICADORES_DE_BITMAP. No hay modificadores que sean específicos para material_map. Se utilizan los modificadores genéricos de bitmap map_type, once e interpolate descritos en "Modificadores de Bitmap".

Aunque es legal el uso de interpolate en mapas de material, el índice de color se interpola antes de elegir la textura. No interpola el color final como podría esperarse que lo hiciera. En general, la interpolación de mapas de material no conlleva ningún resultado útil, pero esto puede ser corregido en futuras versiones.

Lo siguiente es incluir una o más declaraciones de texture. Cada textura en la lista corresponde a un índice en el archivo de mapa de bits. Por ejemplo:

  texture {
     material_map {
        png "povmap.png"
        texture {               // utilizado con el índice 0
           pigment {color red 0.3 green 0.1 blue 1}
           normal  {ripples 0.85 frequency 10 }
           finish  {specular 0.75}
           scale 5
        }
        texture {              // utilizado con el índice 1
           pigment {White}
           finish {
             ambient 0 diffuse 0 
             reflection 0.9 specular 0.75
           }
        }
                                // utilizado con el índice 2
        texture {pigment{NeonPink} finish{Luminous}}
        texture {              //utilizado con el índice 3
           pigment {
              gradient y
              color_map {
                 [0.00 rgb < 1 , 0 , 0>]
                 [0.33 rgb < 0 , 0 , 1>]
                 [0.66 rgb < 0 , 1 , 0>]
                 [1.00 rgb < 1 , 0 , 0>]
              }
           }
           finish{specular 0.75}
           scale 8
        }
     }
     scale 30
     translate <-15, -15, 0>
  }

Después de una declaración de material_map, pero aún dentro de la declaración de textura, se puede agregar cualquier modificador de textura permitido.

Aviso: no se pueden agregar más pigmentos, normales o declaraciones de acabado a la textura fuera del mapa de materiales.

Lo siguiente es ilegal y generará un mensaje de error:

  texture {
    material_map {
      gif "matmap.gif"
      texture {T1}
      texture {T2}
      texture {T3}
    }
    finish {phong 1.0}
  }

El acabado debe ser añadido individualmente a cada textura. Las anteriores versiones de POV-Ray permitían estas especificaciones, pero han sido depuradas. Las restricciones anteriores en la sintaxis han sido necesarias para corregir ciertos errores en el código. Esto significa que algunas escenas de POV-Ray 1.0 que utilizan mapas de materiales pueden requerir modificaciones menores que no pueden ser corregidas automáticamente con el modo de compatibilidad de versiones.

Si un valor de índice en particular no se utiliza en una imagen, entonces puede ser necesario suministrar algunas texturas de relleno. Se puede utilizar un programa de retoque u otra utilidad para examinar la paleta del archivo para determinar como ordenar la lista de texturas.

Las texturas en un textura de materiales mapeados pueden estar superpuestas pero las texturas de materiales mapeados no funcionan como parte de una textura superpuesta. Para utilizar una textura superpuesta en un mapa de material se debe declarar previamente como un identificador de textura e invocarlo en el interior de la lista de texturas.