从哪里开始创建二维水?

Where to begin for create 2d water?

我想在 Unity 引擎中创建 2d 水。你能给我一些建议,从哪里开始?这是二维水 https://www.youtube.com/watch?v=iBWwNHEHo3I 的示例。提前致谢

一种方法是使用使用 GrabPass 的着色器。您需要在有水的地方制作一个四边形,然后将带有着色器的 material 应用到四边形。着色器应该有一个 GrabPass,然后是一个垂直翻转和扭曲 GrabPass 的通道。下面是这种着色器的一个示例 (source):

Shader "Custom/WaterGrab" 
{
    Properties 
    {        
        _Colour ("Colour", Color) = (1,1,1,1)
        _MainTex ("Noise text", 2D) = "bump" {}
        _Magnitude ("Magnitude", Range(0,1)) = 0.05
    }

    SubShader
    {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Opaque"}
        ZWrite On Lighting Off Cull Off Fog { Mode Off } Blend One Zero

        GrabPass { "_GrabTexture" }

        Pass 
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            sampler2D _GrabTexture;
            fixed4 _Colour;
            sampler2D _MainTex;
            float  _Magnitude;

            struct vin
            {
                float4 vertex : POSITION;
                float4 color : COLOR;
                float2 texcoord : TEXCOORD0;

            };

            struct v2f
            {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                float4 uvgrab : TEXCOORD1;

            };

            float4 _MainTex_ST;

            // Vertex function 
            v2f vert (vin v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);


            #if UNITY_UV_STARTS_AT_TOP
                float scale = -1.0;
            #else
                float scale = 1.0;
            #endif            

                o.uvgrab.xy = (float2(o.vertex.x, (o.vertex.y)* scale) + o.vertex.w) * 0.5;
                o.uvgrab.zw = o.vertex.zw;

                float4 top = mul(UNITY_MATRIX_MVP, float4(0, 0.5, 0, 1));
                top.xy /= top.w;

                o.uvgrab.y = 1 - (o.uvgrab.y + top.y);

                return o;
            }

            // Fragment function
            half4 frag (v2f i) : COLOR
            {        

                half4 bump = tex2D(_MainTex, i.texcoord );
                half2 distortion = UnpackNormal(bump).rg;


                i.uvgrab.xy += distortion * _Magnitude;                    
                fixed4 col = tex2D( _GrabTexture, i.uvgrab);                
                return col * _Colour;
            }

            ENDCG
        } 
    }
}

在这样的着色器中,您需要提供一个凹凸贴图来告诉水如何扭曲 GrabPass。在上面的示例中,它应该作为 _MainTex 纹理插入。它应该看起来像这样: