Post-Processing: Onde de Choc 2D en GLSL





Je ne sais plus comment mais je suis tombé sur cette page qui montre un shader de shockwave 2D ou onde de choc. J’ai trouvé l’effet sympa, alors yep, un petit tour du coté de GeeXLab et voilà le shader est maintenant opérationnel et ajouté à la librairie de shaders de GXL.

La petite demo pour GeeXLab est disponible ici: PostFX 2D Shockwave.

La demo se lance en chargeant le fichier principal 2D_Shockwave_Demo.xml dans GeeXLab.

La demo a été testé avec la dernière version de GeeXLab, la 0.1.14.

Pour voir une onde de choc, il suffit d’appuyer sur la touche K. Cela crée une onde de choc à partir de la position de la souris. La petite astuce est que la position de la souris, exprimée en coordonnées d’écran (le 0;0 est le coin supérieur gauche), est convertie en coordonées de texture (le 0;0 est le coin inférieur gauche et le poitn 1.0; 1.0 représente le coin supérieure droit car les coordonnées de texture varient de 0 à 1). La position de la souris est stockée dans la variable uniform center.

La variable uniform time quant à elle contient le temps écoulé en secondes depuis le debut de l’onde de choc.

Voila le code du shader GLSL qui se trouve dans le fichier PostFX_2DShockwave_Lib.xml.


[Vertex_Shader]
void main(void)
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
}
[Pixel_Shader]
uniform sampler2D sceneTex; // 0
uniform sampler2D gridTex; // 1
uniform vec2 center; // Mouse position
uniform float time;
uniform vec3 shockParams; // 10.0, 0.8, 0.1
void main()
{
vec2 uv = gl_TexCoord[0].xy;
vec2 texCoord = uv;
float distance = distance(uv, center);
if ((distance <= (time + shockParams.z)) &&
(distance >= (time - shockParams.z)))
{
float diff = (distance - time);
float powDiff = 1.0-pow(abs(diff*shockParams.x), shockParams.y);
float diffTime = diff * powDiff;
vec2 diffUV = normalize(uv - center);
texCoord = uv + (diffUV * diffTime);
}
vec4 grid = texture2D(gridTex, texCoord * 1.0);
gl_FragColor = texture2D(sceneTex, texCoord) * grid;
}

One comment

  • omissis
    November 17, 2009 - 2:59 pm | Permalink

    hey nice effect and with a little effort! :)

  • Comments are closed.