Итак, я уже реализовал часть отражения:
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;
}
}
Теперь вопрос в том, как реализованы эти колебания?
time
значения можно сместитьuv.xy
с(sin(time),cos(time))
вектором смещения. Конечно, вы должны вычислить амплитуды синусов и косинусов. Я бы начал с простого смещенияuv.y
первого и посмотрел, как я могу настроить эффект дальше.Ответы:
Я попытался реализовать то, что предложил теодрон:
Это выглядит довольно близко (трудно сказать без базового изображения), но вы можете настроить параметры.
Вы можете увидеть это в действии там: https://www.shadertoy.com/view/Xll3R7
Некоторые замечания:
РЕДАКТИРОВАТЬ: я изменил yoffset, чтобы включить модификацию из @cepro
источник