lcy
2025-01-02 c867ea92cce28ea0ceb312ef8e2f8e7e0888b1d6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Shader "Custom/WaterWave Effect" 
{
    Properties 
    {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
 
    CGINCLUDE
    #include "UnityCG.cginc"
    uniform sampler2D _MainTex;
    uniform float _distanceFactor;
    uniform float _timeFactor;
    uniform float _totalFactor;
    uniform float _waveWidth;
    uniform float _curWaveDis;
 
    fixed4 frag(v2f_img i) : SV_Target
    {
        //计算uv到中间点的向量(向外扩,反过来就是向里缩)
        float2 dv = float2(0.5, 0.5) - i.uv;
        //按照屏幕长宽比进行缩放
        dv = dv * float2(_ScreenParams.x / _ScreenParams.y, 1);
        //计算像素点距中点的距离
        float dis = sqrt(dv.x * dv.x + dv.y * dv.y);
        //用sin函数计算出波形的偏移值factor
        //dis在这里都是小于1的,所以我们需要乘以一个比较大的数,比如60,这样就有多个波峰波谷
        //sin函数是(-1,1)的值域,我们希望偏移值很小,所以这里我们缩小100倍,据说乘法比较快,so...
        float sinFactor = sin(dis * _distanceFactor + _Time.y * _timeFactor) * _totalFactor * 0.01;
        //距离当前波纹运动点的距离,如果小于waveWidth才予以保留,否则已经出了波纹范围,factor通过clamp设置为0
        float discardFactor = clamp(_waveWidth - abs(_curWaveDis - dis), 0, 1);
        //归一化
        float2 dv1 = normalize(dv);
        //计算每个像素uv的偏移值
        float2 offset = dv1  * sinFactor * discardFactor;
        //像素采样时偏移offset
        float2 uv = offset + i.uv;
        return tex2D(_MainTex, uv);    
    }
 
    ENDCG
 
    SubShader 
    {
        Pass
        {
            ZTest Always
            Cull Off
            ZWrite Off
            Fog { Mode off }
 
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest 
            ENDCG
        }
    }
    Fallback off
}