Então, eu já implementei a parte da reflexão:
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;
}
}
Agora, a pergunta é como essas ondulações são implementadas?
time
valor, você pode mudar ouv.xy
com um(sin(time),cos(time))
vetor de deslocamento. Obviamente, você deve descobrir as amplitudes das compensações seno e cosseno. Eu começaria apenas compensando ouv.y
primeiro e ver como posso ajustar ainda mais o efeito.Respostas:
Tentei implementar o que o teodron sugeria:
Parece bem próximo (é difícil dizer sem a imagem de base), mas você pode ajustar os parâmetros.
Você pode vê-lo em ação lá: https://www.shadertoy.com/view/Xll3R7
Algumas observações:
EDIT: Eu mudei o yoffset para incluir a modificação do @cepro
fonte