如何使用GLSL片段着色器实现这种波动?


11

所以我已经实现了反射部分:

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;
}
}

资源

现在的问题是这些涟漪如何实现?


3
这不是一个完整的答案,而是一系列提示:您需要一种统一的方法来“动画化”效果-即类似时间的变量。使用该time值,您可以uv.xy使用(sin(time),cos(time))偏移矢量来移动。当然,您必须找出正弦和余弦偏移的幅度。我将首先抵消第uv.y一个,然后看看如何进一步调整效果。
teodron'1

非常感谢您提供这些提示。事实证明,这是尝试@LeFauve的实现后我需要的。
cepro 2015年

Answers:


11

我试图实现teodron的建议:

void main()
{
    vec2 uv = gl_FragCoord.xy / resolution.xy;
    float sepoffset = 0.005*cos(iGlobalTime*3.0);
    if (uv.y > 0.3 + sepoffset)// is air - no reflection or effect
    {
        gl_FragColor = texture2D(texture, vec2(uv.x, -uv.y));
    }
    else
    {
        // Compute the mirror effect.
        float xoffset = 0.005*cos(iGlobalTime*3.0+200.0*uv.y);
        //float yoffset = 0.05*(1.0+cos(iGlobalTime*3.0+50.0*uv.y));
        float yoffset = ((0.3 - uv.y)/0.3) * 0.05*(1.0+cos(iGlobalTime*3.0+50.0*uv.y));
        vec4 color = texture2D(texture, vec2(uv.x+xoffset , -1.0*(0.6 - uv.y+ yoffset)));
        // 
        //vec4 finalColor = vec4(mix(color.rgb, overlayColor, 0.25), 1.0);
        gl_FragColor = color;
    }
}

它看起来很接近(没有基本图像很难说),但是您可以调整参数。

您可能会看到它在起作用:https : //www.shadertoy.com/view/Xll3R7

一些说明:

  • 因为我将图像上下颠倒,所以必须反转y坐标,但这可能取决于您传递给resolution的内容。如果结果对您不利,只需取消uv.y
  • 我更改了您的统一声明,使其可以与shadertoy一起使用。您可以忽略这些更改。
  • 但是,您将需要添加一个提供时间的制服并使用它代替iGlobalTime(以秒为单位的时间)
  • 我添加了一个潮汐效果,因为在您的示例中看起来像一个潮汐效果,但是很难分辨(请参见sepoffset变量)。如果您不喜欢它,可以将其删除
  • 我删除了叠加色,因为它看起来不太好,而且您的示例中没有
  • 调整效果以符合您的口味:
    • 更改iGlobalTime的因数以加快/减慢效果(可以根据需要分别更改它们,例如,加快x的移动并降低y的移动)
    • 更改cos()因子以放大/减弱效果

编辑:我更改了yoffset以包括来自@cepro的修改


1
很努力!+1
teodron'1

3
谢谢您的帮助 :)。这确实确实提供了非常接近的结果。但我认为它缺少最后一个要素。请注意,在图片中,这些波纹越靠近相机(屏幕的底部),它们的波纹(垂直拉伸)就越大。因此,也许我们需要缩放uv.y的y偏移量?浮点yoffset =((0.3-uv.y)/0.3)* 0.05 *(1.0 + cos(iGlobalTime * 3.0 + 50.0 * uv.y));. 我已经尝试过了,我有点喜欢结果。
cepro

切入@cepro的涟漪好收场。我错过了
LeFauve 2015年

IMO修改后的wave模式有问题。尽管海浪对我来说越来越大,但它们却带有奇怪的“镜像”图案(最新版Chrome中的GTX 680)。
马里奥
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.