etereaetereaaboutcontactworkstrainingresourceseterealinksmoreetereashop
Home > Training > Mapas de relieve (1 de 2)
Etérea Workshops Banner

Mapas de relieve: mucho más que bumps
Por favor: no hagas un copiar-pegar de este material en tu página, weblog o foro sin mi permiso. En su lugar puedes incluir un link a esta página.
PRIMERA PARTE
Ir a la Segunda Parte
Introducción

Si estás leyendo esto es porque te interesa o trabajas con herramientas 3D, y por lo tanto habrás empleado en muchas ocasiones los Bumps: ese tipo de imágenes en escala de grises que sirven para simular un relieve superficial.

Pero además de los Bumps existen otros procedimientos para aportar relieve superficial en una infografía tridimensional. En principio podemos utilizar los siguientes sistemas (puede que exista alguno más, pero eso ya se me escapa):

1. Bump Maps
2. Displacement Maps
3. Normal Maps
4. Vector Displacement Maps


Los dos primeros son muy conocidos y ampliamente utilizados en el mundillo de las CGI desde el principio. Los Normal Maps también son muy empleados hoy en día, especialmente en el entorno de los videojuegos, por su versatilidad. Quizá sean los Vectorial Displacement Maps los más desconocidos y menos empleados del grupo.

En este artículo nos vamos a centrar especialmente en los dos últimos: los Normal Maps y los Vector Displacement Maps, aunque previamente veremos también unas cuantas cosillas de los dos primeros.



Bump y Displacement Maps

Seguro que todos habréis hecho mil veces la siguiente operación: estáis trabajando en un proyecto 3D y necesitáis una textura de asfalto —por ejemplo—. Acudís a una página de texturas (supongo que ya todos conoceréis CGTextures, y ni no es así ya estáis tardando en visitarla), os bajáis la imagen que mejor se adapte a vuestras necesidades y procedéis a tratarla en Photoshop antes de importarla en vuestra aplicación 3D. Normalmente le haremos lo siguiente:

— A partir del JPEG que nos habremos bajado crearemos una versión “tileable” (repetible, azulejable) para que no se noten los cortes en la repetición de los sucesivos módulos (aquí encontrarás algunos consejos para conseguir una mejor textura tileable o seamless).

— Con la propia imagen RGB generaremos una imagen en escala de grises para emplearla en el canal de Bump, y probablemente otra (o quizás la misma) para emplearla en el canal de Specular, porque en un asfalto hay zonas que brillan un poquito y otras que no.

Pero fijaos en una cosa: esto que todos hemos hecho en muchas ocasiones es en realidad un “apaño”. Cuando tomamos la información de color de nuestra textura (es decir, una FOTO que alguien ha hecho de ese material) y la convertimos a escala de grises para utilizarla como Bump, esa imagen que acabamos de generar no tiene nada que ver con lo que realmente debería ser un —buen— Bump.

Un Bump —o un Displacement Bump— debería ser una imagen que contuviera la información del relieve de esa superficie, de manera que las zonas mas claras, los blancos, representaran los puntos más elevados, y las zonas más oscuras, los negros, representaran los puntos más hundidos.

Idealmente, un Bump o un Displacement debería ser una imagen DEM (Digital Elevation Model). Se trata de un sistema empleado en topografía para representar el relieve de terrenos a partir de una escala de grises. Como las variaciones de altitud en la superficie de la Tierra son muy grandes —oscilando entre la cota cero a nivel del mar y los 8.848 metros del Everest— se utilizan imágenes de 16 bits en vez de las de 8 bits que estamos acostumbrados a emplear. De ese modo, en lugar de contar sólo con 256 niveles de gris (28), tenemos 65.536 niveles (216), unos “poquitos más” que vienen muy bien para que no se vean escalones (con 8 bits habría que emplear uno de los 256 posibles tonos de gris cada 34,5 metros y con los 16 bits disponemos de un gris diferente para cada 13 centímetros, aproximadamente).

En las siguientes imágenes podemos apreciar el aspecto que tiene un DEM (rebajado aquí a 8 bits) y la simulación de relieve que obtenemos con él mediante un Bump, aunque también podríamos emplearlo como mapa de desplazamiento:
Imagen DEm y bump resultante
Imagen DEM de España bajada de la web de la USGS GTOPO30.   Relieve obtenido a partir de la anterior imagen: un Bump perfecto.
Pero claro ¿de donde sacamos o cómo obtenemos un “DEM” para esa textura de hormigón, asfalto o piedrecitas que nos acabamos de bajar de internet? Lamentablemente no podemos. Y por eso tendremos que ingeniarnoslas para simular ese DEM a partir del RGB. La forma de obtenerlo puede variar bastante, y dependerá mucho de las características de la propia imagen: cada caso es diferente.

La opción más corta y sencilla, y que la verdad funciona muy bien con algunas texturas, consisten simplemente en convertir nuestro RGB a Escala de Grises, sin más. En las siguientes imágenes podemos ver un ejemplo en el que esta conversión directa funciona bastante bien y proporcionará unos resultados decentes:
RGB y grayscale resultante
Aquí tenemos una porción de una textura de guijarros bajada de CGTextures. Imaginad el relieve que estas piedrecitas tienen: cada una es como un pequeño montículo que sobresale del plano donde están apoyadas. Por lo tanto, la parte más elevada de cada piedrita deberá ser la más clara de nuestro Bump map y la parte más baja, junto con los intersticios, deberá ser la más oscura.   Por suerte, al convertir la imagen a escala de grises es más o menos eso lo que obtenemos. Es importante analizar la imagen resultante en Photoshop para predecir cómo se comportará cuando sea utilizada como Bump dentro de nuestro soft 3D. Esta capacidad de “predicción” nos la dará la práctica. También podemos emplear el filtro “Emboss” de Photoshop para simular lo que ocurrirá.
Nos llevamos la versión RGB de la imagen junto con la versión en Grayscale a la aplicación 3D, las incorporamos en sus canales correspondientes y vemos lo que obtenemos:
Diffuse, bump y diffuse+bump
La imagen RGB aplicada en un plano 3D dentro del canal Diffuse. El Bump que obtenemos con la versión en escala de grises La mezcla de Diffuse y Bump que nos da el render.
No es un resultado absolutamente perfecto, desde luego: las piedrecitas deberían verse más “almohadilladas”, pero podríamos mejorarlo desenfocando un poquito el mapa de Bump, por ejemplo. En cualquier caso la muestra es perfectamente apropiada para partir de una simple conversión de RGB a Grayscale.



Pero no todas las imágenes funcionan correctamente al convertirlas, sin más, a escala de grises para usarlas como Bump. Por ejemplo, fijaos en la siguiente imagen de una chapa oxidada:
Chapa oxidada RGB y grayscale
La chapa tiene algunas zonas oxidadas y otras donde todavía conserva la pintura. Imaginad que queremos tener la zona pintada en azul muy lisa y la zona oxidada con aspecto rugoso.   Si convertimos la imagen anterior a escala de grises tendremos esto: la zona oxidada se ve más oscura y en efecto nos dará un aspecto muy rugoso al aplicarla como Bump, pero en las zonas pintadas también tenemos diferentes tonos de gris.
Podríamos modificar la imagen en escala de grises usando los Niveles de Photoshop, pero para un caso como éste nos va a venir muy bien emplear otro pequeño truco: antes de convertir un RGB a Grayscale fijémonos siempre en el aspecto que tienen cada uno de los canales de color de una imagen —el Rojo, el Verde y el Azul— porque probablemente sean muy diferentes entre sí y también muy distintos de la versión directa en escala de grises de la textura, de modo que podamos utilizar uno de esos canales de color como materia prima para crear nuestro Bump Map:
Canales R, G y B
En el canal Rojo (R) vemos que hay poco contraste: la zona oxidada tiene unos tonos medios, no llegan a ser muy oscuros, y en la zona pintada también hay tonos grises: no nos sirve para lo que queremos. El canal Verde (G) es un poco más contrastado que el Rojo y nos iría incluso mejor que la versión simple en escala de grises. Pero no nos quedemos todavía con él. Vamos a verlos todos ;-) En este caso es el canal Azul (B) el que mejor nos va a venir, ya que hay un mayor contraste entre la zona oxidada, que queremos rugosa, y la zona donde todavía conserva la pintura, que queremos lisa.
Diferencias en el bump resultante
Ese canal azul todavía lo “tocaremos” un poquito con los niveles, contrastandolo para “quemar” y hacer que casi desaparezca por completo el detalle en las zonas claras … …y de ese modo el Bump resultante es exactamente lo que necesitabamos: rugoso en las zonas oxidadas y bastante liso en donde todavía conserva la pintura. Comparadlo con este otro Bump obtenido con la versión inicial en Escala de Grises: aunque existan variaciones, toda la chapa en general se percibe rugosa.
Veamos a continuación dos casos opuestos. Primero una imagen de donde podremos extraer fácilmente un mapa de Bump que funcione perfectamente: una superficie craquelada. Y a continuación un primer plano de una gravilla rugosa donde va a ser prácticamente imposible obtener un buen Bump.
Superficie craquelada y mapa de bump
La fotografía RGB de una superficie craquelada. Esto nos lo llevaremos a nuestro canal de diffuse o color.   A partir de uno de los canales de color y después de haber quemado las zonas más claras obtemos esta imagen en Grayscale que emplearemos en el canal de Bump.
En esta secuencia de tres imágenes vemos el resultado tras hacer unos renders 3D: A) sólo con el canal de color; B) sólo con el Bump; y C) finalmente el render conjunto. Conclusión: el Bump obtenido a partir de la imagen RGB funciona perfectamente. Por supuesto el resultado final mejoraría muchísimo si añadieramos un canal de especular y otro de reflexión, suciedad, etc…



A continuación un ejemplo opuesto: resultará muy difícil —por no decir imposible— generar un buen Bump con las siguientes imágenes:
Gravilla: RGB y grayscale
El primer plano de una superficie de gravilla. Esta es nuestra imagen en color RGB, nuestra única materia prima.   Tanto si convertimos directamente a Grayscale como si partimos de alguno de los canales R, B o B, el resultado resulta poco apropiado para ser empleado como una correcta representación del relieve.
Y en efecto al incorporar cada mapa en sus canales, Diffuse y Bump, vemos que el resultado no es convincente. El relieve que obtenemos no corresponde con los verdaderos volúmenes de cada una de las piedrecitas que componen la grava. Si tuvieramos que describir el resultado que percibimos sería: “una imagen PLANA de grava en perspectiva con un RUIDO añadido en forma de Bump”.

Probablemente podríamos haber manipulado un poco más la imagen empleada como Bump para trata de eliminar ese ruido producido por la textura rugosa superficial y la propia composición mineral de las piedrecitas, pero lo que es evidente es que esta fotografía resulta mucho más complicada a la hora de tratar de extraer de ella la información de relieve de su contenido.

Como conclusión podríamos decir que no todas las imágenes de una superficie nos van a servir para extraer de ellas la información necesaria para definir un BUEN Bump.

Es verdad que existen aplicaciones dedicadas que nos pueden ayudar a generar un mejor Bump (e incluso Normal Maps y Ambient Occlusion) partiendo de una imagen. Quizá el más conocido sea Crazy Bump. No he tenido la oportunidad de probarlo, pero desde luego, viendo el vídeo demostrativo parece casi milagroso.



Prácticamente todas las consideraciones que hemos desarrollado hasta ahora se pueden aplicar también a los Mapas de Desplazamiento, con la particularidad de que quizás para éstos últimos sea necesario generar un mapa todavía más preciso, desde el punto de vista de la verdadera representación tridimensional del relieve.

¿La diferencia entre un Bump y un Displacement? Los primeros consisten en una SIMULACIÓN de relieve, mientras que los segundos aportan un relieve REAL, modificando la malla tridimensional de nuestro modelo. Es por tanto en los bordes de nuestros objetos donde se hace evidente la “falsedad” de un Bump o la “realidad” de un Displacement. Lo ideal sería usar siempre desplazamientos, pero claro, eso tiene un coste altísimo: la inmensa cantidad de polígonos que son necesarios para representar adecuadamente ese relieve (por mucho que sean polígonos añadidos en tiempo de render como sucede con el sub-pixel o micro-polygon displacement).

En la siguiente comparativa vemos la diferencia entre un Bump y un Displacement. Primero tenemos el mapa de color y el mapa de relieve (usado indistintamente para generar Bump o Desplazamiento) y a continuación los resultados. Mientras no nos fijemos en los contornos del cilindro, el Bump es tan bueno —o incluso mejor— que el Displacement:




Normal Maps

Tanto un Bump como un Displacement lo que hacen es perturbar la superficie del objeto en el que actúan siguiendo la dirección normal —perpendicular— en cada punto y por eso sólo es necesario un Grayscale para contener la información de relieve: donde más luminosa o blanca es mi imagen más “altitud” percibiremos, ya sea simulada o real; y donde más oscura o negra sea la imagen más “profundidad”.

Como detalle importante: conviene que estéis seguros de cómo funciona vuestro programa 3D con los Bumps/Displacements. Suele haber dos posibilidades:

— El blanco absoluto proporciona un 100% de relieve y el negro absoluto nos da un 0% (con lo cual los tonos negros no porporcionan relieve alguno y a partir de ahí todos los tonos de gris hasta el blanco porporcionan un relieve positivo).

o bien

— El blanco absoluto proporciona un 50% de relieve y el negro absoluto nos da un -50% de relieve (con lo cual los tonos más oscuros hasta el negro proporcionan un relieve negativo, el gris medio nos da lo que podríamos llamar la “cota 0” y apartir de ahí todos los tonos de gris más claros hasta el blanco porporcionan un relieve positivo).

Con los Normal Maps lo que hacemos es perturbar la superficie de un objeto siguiendo tres direcciones: por una lado la dirección normal en cada punto y por otro en dos direcciones tangentes a la superficie y ortogonales entre sí. En el siguiente gráfico podemos entender mejor lo que hacen un Bump (o un Displacement Map) y lo que obtenemos con un Normal Map (y también con un Vector Displacement Map, a los que llegaremos más tarde).
Diagrama explicativo Bump vs Normal
Para los Bump y Displacement Maps sólo es necesaria una imagen en escala de grises porque eso nos basta para controlar la perturbación del relieve en una única dirección, normal a la superficie en cada punto.   En los Normal y Vector Displacement Maps empleamos los tres canales de una imagen RGB para controlar otras tantas direcciones XYZ. Dos de ellas tangentes a la superficie y ortogonales entre sí mismas [ X Red] e [Y Green] y otra normal a cada punto [Z Blue].
Básicamente, lo que obtenemos con un Normal Map es una representación del relieve superficial de un objeto mucho más creíble y fidedigna.

Eso sí: si ya extraer un buen Bump a partir de una imagen RGB no siempre es tarea fácil, generar un Normal Map a partir de una fotografía es mucho más complejo (aunque por lo visto la mencionada aplicación Crazy Bump es capaz de hacerlo).

Lo ideal sería preparar el material real —la superficie a fotografiar— de un modo muy específico, iluminandola desde distintos ángulos, para crear varias fotografías que luego se ensamblan y tratan con ayuda del ordenador. En la red encontraréis algunos tutoriales para hacer este tipo de cosas.

Pero para lo que se ha extendido ampliamente el uso de Normal Maps es para generar mapas de relieve a partir de modelos tridimensionales CG muy densos, de manera que luego esa información pueda ser aplicada en una versión de mucha más baja resolución poligonal manteniendo un nivel de credibilidad impresionante. Por ello se han popularizado enseguida en el mundo de los videojuegos.

Actualmente se tiende a modelar todos los personajes, objetos y los entornos con muchísimos polígonos, mapas de desplazamiento, infinidad de detalles superficiales (utilizando fantásticas herramientas dedicadas como ZBrush o Mudbox) para luego extraer esa información superficial, convertirla en un Normal Map y aplicarsela a una versión muchísimo más ligera de esa misma geometría.

Vamos a hacer una pequeña prueba para que veáis la diferencia de calidad y realismo entre un simple Bump y un Normal Map. Primero modelamos una porción de tejado, algo sencillo, partiendo de una teja y distribuyendo varias instancias o clones adecuadamente:
Modelo 3D, bump y normal resultantes
A partir del modelo 3D extraemos primero un Bump Map “bakeandolo” desde la geometría. Si vuestro programa no puede extraer la información de relieve en forma de Bump directamente podéis emplear un simple pase de Ambient Occlusion, que hará el papel casi perfectamente (fijaos: los puntos más claros son las zonas más elevadas y los puntos más oscuros son los recovecos y las zonas más profundas).   Y por otro lado extraemos un Normal Map. Supongo que la mayoría de los programas modernos son capaces de bakear esta información desde el modelo 3D. Si no disponéis de esa capacidad siempre podéis intentar un procedimiento similar al descrito en el tutorial mencionado anteriormente (pensado para generar Normal Maps con objetos reales, pero que imagino se podrá aplicar también con geometría 3D)
A continuación aplicamos el Bump Map sobre un simple plano, lo iluminamos desde diferentes ángulos y vemos el resultado:
¿Os parecen realistas y creíbles estas tejas? A lo mejor, si las miramos de lejos pueden servir, pero la verdad es que dejan bastante que desear, la verdad…



Sin embargo fijaos en la diferencia cuando lo que hacemos es aplicar un Normal Map, también sobre un simple plano, y lo iluminamos todo desde diferentes ángulos:
Esto ya está mejor ¿no?. Para este tipo de situaciones los Normal Maps son clarísimamente mejores que los tradicionales Bumps porque representan el volumen de un modo mucho más creíble. La sensación de volumetría en las tejas es casi pefecta. Si levantaramos la vista y viesemos la cresta o caballete del tejado se haría evidente la falsedad del relieve, por supuesto (porque no hay un auténtico relieve, es obvio) pero al margen de eso, el resultado es muy bueno.
— Continuar con la segunda parte del artículo —


Etérea Workshops Banner
Por favor: no hagas un copiar-pegar de este material en tu página, weblog o foro sin mi permiso. En su lugar puedes incluir un link a esta página.
All images copyright Cristóbal Vila

you are the visitor | eres el visitante

Ir a la Segunda Parte