Le texture warping se classe dans les nombreux effets que l'on peut appliquer à une texture
afin de produire un résultat vraiment sympathique. Le principe du warping consiste à perturber les coordonnées
de texture pour créer une déformation de l'image finale.
L'image suivante nous montre un exemple de texture warping:
Fig. 19 - La démo DEMO_Texture_Warping.xml
Il y a plusieurs méthodes pour déformer les coordonnées de texture. Nous utiliserons celle basée sur une
normal map. Cette normal map a été créée à partir d'une texture contenant un bruit de Perlin en utilisant le
plugin de nVidia
pour Photoshop:
Fig. 20 - La texture de bruit
Cette technique consistant à utiliser un shader GLSL pour déformer les coordonnées de texture est
puissante car on agit ainsi au niveau de chaque texel. Cela signifie qu'il n'est pas nécessaire d'avoir
un mesh dense pour réaliser cet effet.
Le shader suivant, provenant de la démo DEMO_Texture_Warping.xml, montre le warping de texture:
[Vertex_Shader]
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
[Pixel_Shader]
uniform sampler2D colorMap;
uniform sampler2D noiseMap;
uniform float timer;
void main (void)
{
vec3 noiseVec;
vec2 displacement;
float scaledTimer;
displacement = gl_TexCoord[0].st;
scaledTimer = timer*0.1;
displacement.x += scaledTimer;
displacement.y -= scaledTimer;
noiseVec = normalize(texture2D(noiseMap, displacement.xy).xyz);
noiseVec = (noiseVec * 2.0 - 1.0) * 0.035;
gl_FragColor = texture2D(colorMap, gl_TexCoord[0].st + noiseVec.xy);
}
La variable uniform timer contient le temps écoulé en secondes. Grâce au temps écoulé,
on crée un jeu de coordonnées de texture displacement qui nous permet de récupérer une valeur
noiseVec dans la texture de bruit. Ce vecteur noiseVec est ensuite ajouté aux coordonnées
de texture de base gl_TexCoord[0].st + noiseVec.xy afin de puiser dans l'image de base
la valeur perturbée.