Effet 2D: le Twirl (ou Swirl) en GLSL

Twirl effect in GLSL

Voila un petit effet 2D facile à mettre en oeuvre avec un programme GLSL (OpenGL Shading Language): le twirl ou swirl. Il s’agit de déformer une image 2D comme si on la faisait tournoyer autour de son centre.

Et concrétement ça donne quoi? Voilà l’image originale:

Radeon R7 250

Et voila le résultat pour quelques valeurs de torsion:

Twirl effect - GLSL Hacker demo

Twirl effect - GLSL Hacker demo

Twirl effect - GLSL Hacker demo

Voilà maintenant le code du programme GLSL:

Vertex shader

#version 150
in vec4 gxl3d_Position;
in vec4 gxl3d_TexCoord0;
out vec4 Vertex_UV;
void main()
{
  gl_Position = gxl3d_Position;		
  Vertex_UV = gxl3d_TexCoord0;
}

Pixel shader

#version 150
uniform sampler2D tex0;
uniform float twirl_amount;
in vec4 Vertex_UV;
out vec4 FragColor;

void main (void)
{
  vec2 uv = Vertex_UV.xy-0.5;
  uv.y *= -1.0; 
  float angle = atan(uv.y,uv.x);
  float radius = length(uv);
  angle+= radius * twirl_amount;
  vec2 shifted = radius*vec2(cos(angle), sin(angle));
  FragColor = texture(tex0, shifted+0.5);
}

La demo, codée avec GLSL Hacker, est dispo dans le demopack sous le répertoire host_api/PostFX/Twirl/.

Références:
Twirl Filter in GLSL