Normal Maps

De Codepixel

explicacion muy rapida. Normal mapping consiste en usar un mapa de normales (una textura que contiene normales) para los calculos de shading. Es decir, que las normales en vez de cogerlas de la superficie se leen de una textura.

Parallax es practicamente lo mismo pero lo que cambia es donde se samplea la normal en la textura. El punto donde se leen las normales de la textura viene dado por el punto de la superficie original mas un offset que esta relacionado con un mapa de alturas. Intenta dar una mejor aproximacion, teniendo en cuenta tambien las alturas en las proximidades del punto de la superficie. Esto con un dibujito se entiende a la perfeccion :P


Puedo añadir que en cada pixel de la textura de Normal Mapping, ésta almacenada una normal. Es necesario entender que una normal puede tener cualquier direccion, es decir, un normal map tiene que poder almacenar tanto normales con sus componentes positivas como negativas o una mezcla.


Para poder codificar cualquier normal dentro de un pixel es necesario multiplicar los valores de la normal por 0.5 y sumar a estos valores 0.5 para desplazarlos.


Por ejemplo, si una normal tiene una componente a -1, multiplicamos por 0.5 y sumamos 0.5, nos da 0. Si una normal tiene una componente a 1, multiplicamos por 0.5 y sumamos 0.5, nos da 1.


O lo que es lo mismo, estamos pasando de un rango de valores [-1 ... 0 ... 1] a [0 ... 1]. Porque debemos recordar que en el pixel de una textura, solo podemos almacenar números positivos como tal, porque en la gran mayoría de los casos, cada canal de color estará representado por un 8bits.


Luego también es necesario coger esa normal y 'llevarla' a su posición correcta en el modelo, y esto se hace mutliplicando esa normal por el espacio tangencial del triangulo en el que esta la normal.


El espacio tangencia se construye de la siguiente forma, se genera una matriz con 3 vectores, el 1er vector es la normal de ese triangulo ( no confundir con la que hemos hablado de la textura), el 2o vector es la tangente, que se un vector paralelo al triangulo en cuestión, y el 3er triangulo es la binormal, que es el producto vectorial entre los otros dos.


Si tu coges la normal de la textura, la pasas del rango [0 ... 1] al rango [-1 ... 0 ... 1] y el resultado lo multiplicas por la matriz que define el espacio tangencial, tendrás la normal colocada correctamente en la superficie de ese triangulo.


       Es bastante comun el comprimir las normales. 32bits es un monton, sobre todo en consolas :P El enlace que habia en la version previa a la modificacion de javi estaba chulo y este enlace esta muy bien: http://aras-p.info/texts/CompactNormalStorage.html

Entre muchas comillas, el normal map es la técnica que le permite al artista asignarle una normal especifica a cada uno de los pixeles que representaran el objeto. Repito, entre muchas comillas :)


Lo bueno del normal map es que es capaz de crear la sensación de rugosidad en superficies planas, pero una persona pierde esa sensación cuando su vista se acerca al contorno del objeto, pues el normal map como tal no puede modificar la geometría del objeto, solo las normales en los pixeles de este.


El parallax maping tampoco puede cambiar la geometría del objeto aunque es una tecnica mas avanzada que el normal. Igualmente a mi no me acaba de hacer el peso pues estira mucho las texturas en los cambios bruscos de direcciones de normales.


Y si se quiere solucionar eso de los contornos que he comentado antes, seguramente tendremos que ir a parar a técnicas super elitistas y actuales como una taselación de geometría y desplazamiento de esta en tiempo real.


Lo que no se es si una geometría taselada y desplazada mediante un mapa de alturas continua necesitando el normal map o no. A primera vista creo que si, pues la taselación no tiene que tener la misma resolución que tenia le geometría cuando se creo el normal, pero no lo tengo claro del todo.

[editar] Enlaces

Herramientas personales
Navegación
Herramientas