3.9.10  Trabajando con texturas superpuestas

Con la multitud de colores, patrones y opciones que existen para crear texturas complejas en POV-Ray, podemos fácilmente dedicarnos sólo a mezclar y retocar las texturas correctas para nuestra última creación. Sin embargo, tarde o temprano aparecerá esa textura especial, una especie de madera barnizada, con manchas amarillas veteadas y algunas salpicaduras verticales de color gris, que parece como si alguien la hubiera empezado a pintar pero se hubiera detenido, dejando parte de la madera visible bajo la pintura.

¿Y entonces? ¿Cómo podemos poner todo esto en una textura? Ningún patrón puede hacer tantas cosas. Antes de sentir pánico y optar por el mapa de imagen, hay al menos una opción: las texturas superpuestas

Con las texturas superpuestas sólo necesitamos especificar una serie de texturas, una detrás de otra, todas ellas asociadas al mismo objeto. Cada textura será aplicada sobre la anterior, en el orden en que aparezcan.

Es muy importante observar que debemos usar algún grado de transparencia (con filtro o transmisión) en los pigmentos de las texturas superiores, o de lo contrario no se verán las inferiores. No recibiremos ningún aviso o error, ya que técnicamente es legal hacerlo, aunque no tenga sentido. Es como perder horas dibujando un elaborado mural para luego pintarlo con una capa de látex por encima.

Diseñemos un objeto muy simple con una textura superpuesta, y veamos cómo funciona. Creamos un archivo llamado LAYTEX.POV y añadimos las siguientes líneas:

  #include "colors.inc"
  #include "textures.inc"
  camera {
    location <0, 5, -30>
    look_at <0, 0, 0>
  }
  light_source { <-20, 30, -50> color White }
  plane { y, 0 pigment { checker color Green color Yellow  } }
  background { rgb <.7, .7, 1> }
  box { <-10, 0, -10>, <10, 10, 10>
    texture {
      Silver_Metal // un objeto de metal ...
      normal {     // ... que ha sido golpeado
        dents 2
        scale 1.5
      }
    } // (fin de la textura inferior)
    texture { // ... tiene algunas machas de suciedad ...
      pigment {
        granite
        color_map {
          [0.0 rgb <.2, 0, 0> ]
          [0.2 color Brown ]
          [0.2 rgbt <1, 1, 1, 1> ]
          [1.0 rgbt <1, 1, 1, 1> ]
        }
        frequency 16
      }
    } // (fin de la textura de manchas)
    texture { // ... y algunas marcas de hollín negro
      pigment {
        bozo
        color_map {
          [0.0 color Black ]
          [0.2 color rgbt <0, 0, 0, .5> ]
          [0.4 color rgbt <.5, .5, .5, .5> ]
          [0.5 color rgbt <1, 1, 1, 1> ]
          [1.0 color rgbt <1, 1, 1, 1> ]
        }
        scale 3
      }
    } // (fin de la textura de hollín)
  } // (fin de la sentencia de la caja)

¡Uf! Esto se complica, así que, para que se lea mejor, hemos incluido comentarios explicando lo que hacemos y señalando el final de las declaraciones (así no nos perderemos con todas esas llaves de cierre). Para empezar, hemos creado una simple caja sobre el clásico suelo ajedrezado, y hemos puesto un pálido cielo azul. Vamos a por la parte divertida...

Hemos comenzado haciendo uso en la caja de la textura Silver_Metal (metal plateado), tal como está declarada en textures.inc (para ganar puntos, mira en textures.inc y observa cómo está creada esta textura estándar). Para empezar a darle su aspecto maltratado, hemos añadido un patrón de normal "dents", que crea la ilusión de dentelladas en la superficie, como si nuestra misteriosa caja de metal hubiera sido golpeada un poco por todas partes.

Las manchas de óxido no son mas que un fino grano de granito mezclando rojo oscuro con marrón para pasar abruptamente a total transparencia para la mayoría del mapa de color. Cierto que podríamos haber conseguido un patrón de óxido mucho más realista con un mapa de pigmentos para las manchas de óxido, pero los mapas de pigmento se tratan en otra sección del manual, así que olvidémoslos de momento.

Para finalizar, hemos añadido una tercera textura a la caja. El patrón cambiante aleatorio bozo de la textura cambia gradualmente de negro en el centro a un gris semitransparente en el medio, para acabar en una transparencia total. Esto le da una apariencia de marcas de hollín cubriendo la superficie de la caja de metal. El resultado final es una caja misteriosa de metal que parece haber sido realmente maltratada, que hemos obtenido usando múltiples patrones de textura, uno encima de otro, para producir un efecto que ningún patrón aislado hubiera podido conseguir.

3.9.10.1  Declarando texturas superpuestas

En el caso de que queramos usar una textura superpuesta en distintos objetos de una escena, es perfectamente legal declarar una textura superpuesta. No vamos a repetir la textura completa del ejemplo anterior, pero el formato general sería algo así:

  #declare Abused_Metal =
    texture { /* inserta tu textura básica aquí... */ }
    texture { /* aquí las manchas de óxido... */ }
    texture { /* y aquí las de hollín */ }

POV-Ray no tiene problemas para saber cuándo acaba la declaración, ya que las texturas están una tras otra sin objetos ni sentencias en medio. La textura superpuesta declarada se asume que continúa mientras no se encuentre algo que no sea una textura. Así, se puede añadir cualquier número de capas en una declaración de este tipo.

Algo más acerca de las texturas superpuestas: cualquiera que sea la textura superpuesta que creemos, declarada o no, no debemos olvidar el envoltorio de la textura. En las texturas simples típicas, es normal tener simplemente un pigmento, con un acabado o un normal, o los dos, sin la sentencia de la textura. Esto no se puede hacer con las texturas superpuestas. En POV-Ray podemos superponer texturas enteras, pero no partes individuales de la textura. Por ejemplo

  #declare Bad_Texture =
    texture { /* inserta tu textura base aquí... */ }
    pigment { Red filter .5 }
    normal { bumps 1 }

no funcionaria. El pigmento y el normal están ahí como flotando, sin ser parte de ninguna textura en particular. En un objeto, con una sola textura simple, podemos hacer esto, pero no con las texturas superpuestas, donde nos genera un error, ya sea en el objeto o en la declaración.

3.9.10.2  Otro ejemplo de texturas superpuestas

Para explicar un poco más cómo trabajan las texturas superpuestas, veremos un ejemplo con detalle. Vamos a crear un mantel para usar en una escena de picnic. Ya que un simple mantel a cuadros rojos y blancos queda demasiado nuevo, plano, y muy parecido a un suelo de baldosas, usaremos las texturas superpuestas para ensuciar el mantel.

Vamos a crear una escena con cuatro cajas. La primera tendrá esa textura plana blanca y roja que empezamos para nuestra escena de picnic. La segunda añade una capa para decolorar el mantel. Una tercera añade algunas manchas de vino. La ultima añade unas cuantas arrugas (no es otra capa, pero debemos observar cuándo y dónde afecta añadir cambios en el normal a las texturas superpuestas).

Empezamos por poner una cámara, algunas luces, y la primera caja. De momento, la textura es un ajedrezado normal, sin capas. Mira el archivo layered1.pov.

  #include "colors.inc"

  camera {
    location <0, 0, -6>
    look_at <0, 0, 0>
  }

  light_source { <-20, 30, -100> color White }
  light_source { <10, 30, -10> color White }
  light_source { <0, 30, 10> color White }

  #declare PLAIN_TEXTURE =
    // ajedrezado blanco y rojo
    texture {
      pigment {
        checker
        color rgb<1.000, 0.000, 0.000>
        color rgb<1.000, 1.000, 1.000>
        scale <0.2500, 0.2500, 0.2500>
      }
    }

  // caja con textura ajedrezada sencilla
  box { <-1, -1, -1>, <1, 1, 1>
    texture {
      PLAIN_TEXTURE
    }
    translate  <-1.5, 1.2, 0>
  }

Tracemos esta escena. No es particularmente interesante, ¿verdad? Es por ello que debemos usar texturas superpuestas para hacerla más interesante.

Primero añadimos una capa con dos grises diferentes, parcialmente transparentes. Los ajustamos respecto al ajedrezado rojo y blanco, pero añadiendo algo de turbulencia para hacer el decolorado mas realista. Añadamos la siguiente caja a la escena anterior y volvamos a trazarla (mira el archivo layered2.pov).

  #declare FADED_TEXTURE =
    // textura ajedrezada blanca y roja
    texture {
      pigment {
        checker
        color rgb<0.920, 0.000, 0.000>
        color rgb<1.000, 1.000, 1.000>
        scale <0.2500, 0.2500, 0.2500>
      }
    }
    // grises para decolorar los cuadros blancos y rojos
    texture {
      pigment {
        checker
        color rgbf<0.632, 0.612, 0.688, 0.698>
        color rgbf<0.420, 0.459, 0.520, 0.953>
        turbulence 0.500
        scale <0.2500, 0.2500, 0.2500>
      }
    }

  // caja blanca y roja descolorida
  box { <-1, -1, -1>, <1, 1, 1>
    texture {
      FADED_TEXTURE
    }
    translate  <1.5, 1.2, 0>
  }

Aunque la diferencia es pequeña, el ajedrezado blanco y rojo ya no parece tan nuevo.

Como hay una botella de vino en la escena del picnic, pensamos que sería un bonito detalle añadir una o dos manchas. Aunque este efecto puede ser conseguido poniendo una burbuja aplanada en el mantel, lo que realmente queremos obtener es la mancha del derrame, no el líquido en sí. Así que es hora de añadir otra capa más.

De nuevo añadimos una caja a la escena que ya teníamos y volvemos a trazar (mira el archivo layered3.pov).

  #declare STAINED_TEXTURE =
    // textura ajedrezada blanca y roja
    texture {
      pigment {
        checker
        color rgb<0.920, 0.000, 0.000>
        color rgb<1.000, 1.000, 1.000>
        scale <0.2500, 0.2500, 0.2500>
      }
    }
    // grises para decolorar el ajedrezado
    texture {
      pigment {
        checker
        color rgbf<0.634, 0.612, 0.688, 0.698>
        color rgbf<0.421, 0.463, 0.518, 0.953>
        turbulence 0.500
        scale <0.2500, 0.2500, 0.2500>
      }
    }
    // mancha de vino
    texture {
      pigment {
        spotted
        color_map {
          [ 0.000  color rgb<0.483, 0.165, 0.165> ]
          [ 0.329  color rgbf<1.000, 1.000, 1.000, 1.000> ]
          [ 0.734  color rgbf<1.000, 1.000, 1.000, 1.000> ]
          [ 1.000  color rgb<0.483, 0.165, 0.165> ]
        }
        turbulence 0.500
        frequency 1.500
      }
    }

  // caja manchada
  box { <-1, -1, -1>, <1, 1, 1>
    texture {
      STAINED_TEXTURE
    }
    translate  <-1.5, -1.2, 0>
  }

Ahora, el mantel tiene una textura con personalidad.

Otro toque que queremos añadir al mantel son unas cuantas arrugas, como si el mantel hubiera sido arrugado. Esto no es otra capa más, sino el normal de la capa superior. Debemos recordar que sólo tiene efecto en la capa superior y que no será visible en capas inferiores (sin importar lo transparente que puedan ser las capas superiores).

Añadamos la caja final a nuestra escena y volvamos a trazar (mira el fichero layered4.pov)

  #declare WRINKLED_TEXTURE =
    // ajedrezado blanco y rojo
    texture {
      pigment {
        checker
        color rgb<0.920, 0.000, 0.000>
        color rgb<1.000, 1.000, 1.000>
        scale <0.2500, 0.2500, 0.2500>
      }
    }
    // grises para decolorar el ajedrezado
    texture {
      pigment {
        checker
        color rgbf<0.632, 0.612, 0.688, 0.698>
        color rgbf<0.420, 0.459, 0.520, 0.953>
        turbulence 0.500
        scale <0.2500, 0.2500, 0.2500>
      }
    }
    // manchas de vino
    texture {
      pigment {
        spotted
        color_map {
          [ 0.000  color rgb<0.483, 0.165, 0.165> ]
          [ 0.329  color rgbf<1.000, 1.000, 1.000, 1.000> ]
          [ 0.734  color rgbf<1.000, 1.000, 1.000, 1.000> ]
          [ 1.000  color rgb<0.483, 0.165, 0.165> ]
        }
        turbulence 0.500
        frequency 1.500
      }
      normal {                    // se agrega para arrugar
        wrinkles 5.0000
      }
    }

  // caja arrugada
  box { <-1, -1, -1>, <1, 1, 1>
    texture {
      WRINKLED_TEXTURE
    }
    translate  <1.5, -1.2, 0>
  }

Bueno, puede que éste no sea el mantel que usaríamos en nuestros picnics, pero si comparamos la primera y última cajas, veremos cuánta profundidad, dimensión y personalidad es posible sólo con el uso creativo de las texturas.

Una nota final: los comentarios acerca del normal de la superficie no son ciertos para los acabados. Si una capa inferior contiene un acabado especular y una capa superior no, la capa especular se verá a través de las partes transparentes de la capa superior.