J'ai donc déjà implémenté la partie réflexion:
uniform sampler2D texture;
uniform vec2 resolution;
uniform vec3 overlayColor;
void main()
{
vec2 uv = gl_FragCoord.xy / resolution.xy;
if (uv.y > 0.3)// is air - no reflection or effect
{
gl_FragColor = texture2D(texture, vec2(uv.x, uv.y));
}
else
{
// Compute the mirror effect.
vec4 color = texture2D(texture, vec2(uv.x, 0.6 - uv.y));
//
vec4 finalColor = vec4(mix(color.rgb, overlayColor, 0.25), 1.0);
gl_FragColor = finalColor;
}
}
Maintenant, la question est de savoir comment ces ondulations sont mises en œuvre?
time
valeur, vous pouvez déplacer leuv.xy
avec un(sin(time),cos(time))
vecteur de décalage. Bien sûr, vous devez déterminer les amplitudes des décalages sinus et cosinus. Je commencerais par juste compenser leuv.y
premier et voir comment je peux ajuster davantage l'effet.Réponses:
J'ai essayé de mettre en œuvre ce que teodron a suggéré:
Il semble assez proche (c'est difficile à dire sans l'image de base) mais vous pouvez modifier les paramètres.
Vous pouvez le voir en action là: https://www.shadertoy.com/view/Xll3R7
Quelques remarques:
EDIT: j'ai changé le yoffset pour inclure la modification de @cepro
la source