Bump Mapping

Bump mapping permite simular la visualización de los detalles de una superficie cuando el observador la contempla desde cualquier dirección. La técnica La técnica bump mapping utiliza un mapa de textura para perturbar el vector normal de cada píxel, lo cual aporta rugosidad a la superficie simulando una geometría mas compleja.

Tenemos un mapa de textura, el bump map que especifica la perturbación de los vectores normales y es lo que usaremos para conseguir el efecto que buscamos. Pero para aplicarlo, primero necesitamos trabajar en el mismo sistema de referencia en el que está definido el bump map. Hasta ahora trabajábamos en el sistema de referencia de la cámara, ahora lo haremos en el espacio tangente.

Para pasar del sistema de referencia de la cámara al espacio tangente necesitamos construir una matriz, para que la que necesitamos 3 vectores, la normal del vértice, la tangente y la bitangente.

La normal en un punto es el vector perpendicular al plano tangente que pasa por ese punto.

La tangente en un punto es un vector que pasa perpendicularmente por ese punto.

Sin embargo en este caso no tenemos un solo vector, tenemos infinitos. Cualquiera de ellos nos sirve, aunque para evitar distorsiones en los bordes el vector que elijamos debe ser coherente con los vectores vecinos, una forma sencilla de conseguirlo es orientar la tangente en la misma dirección que el mapa que las coordenadas de la textura.

La bitangente es cualquier otro vector perpendicular, pero para simplificar los cálculos lo mejor es calcular un vector bitangente que sea perpendicular a los dos anteriores.

El shader bump_shader.vert será el encargado de realizar el cambio de sistema de referencia y bump_shader.frag realizará los cálculos de la iluminación. Estos 3 vectores llegarán al shader, con ellos tenemos que construir la matriz para pasar del modelo al espacio tangente. En nuestro caso como el resto de variables las tenemos en el sistema de referencia de la cámara crearemos una matriz para pasar del sistema de referencia de la cámara al espacio tangente. La matriz a construir será la siguiente:

Como queremos la matriz para pasar de la cámara al espacio tangente multiplicaremos la matriz de paso del modelo a la cámara por la que acabamos de crear.

A continuación, calcularemos las variables que necesitamos pasar al .frag para los cálculos de la iluminación. Que son las coordenadas de la textura (no las tocamos), la dirección de la cámara, la dirección de la luz y la dirección del foco. Los calcularemos igual que hacíamos antes, pero multiplicaremos la matriz que hemos obtenido antes por los valores calculados para transformarlos al espacio tangente.

El shader bump_shader.frag recibirá estos valores, y realizará exactamente los mismos cálculos de iluminación que realizábamos en la iluminación por pixel, solo tenemos que hacer una modificación, obtener la normal perturbada del bump map. Para ello obtendremos el valor de la posición en la que estamos del bump map, como está en el rango [0,1] y lo queremos en el rango [-1,1], es decir normalizado lo multiplicaremos por dos y restaremos uno. Este será el vector normal que usaremos para calcular la iluminación, los cálculos de la iluminación son exactamente los mismos que en el shader para calcular la iluminación por píxel.

El resultado es el siguiente:

Recursos utilizados:

OpenGL-Tutorial (Normal Mapping): http://www.opengl-tutorial.org/es/intermediate-tutorials/tutorial-13-normal-mapping/ Fabien Sanglard´s website (Bump Mapping): http://fabiensanglard.net/bumpMapping/index.php

results matching ""

    No results matching ""