Shader "Custom/Water"
{
    Properties
    {
        _BumpMap ("_BumpMap)", 2D) = "bump" {}
        _Cube("Cube", Cube) = ""{}
        _Color("spec Color", color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent"}
        CGPROGRAM
        #pragma surface surf WaterSpecular alpha:fade vertex:vert
        #pragma target 3.0

        sampler2D _BumpMap;
        samplerCUBE _Cube;
        float4 _Color;

        void vert(inout appdata_full v)
            {
                float movement;
                float length = 5;
                float height = 0.5;
                float time = 3;

                movement = sin(abs((v.texcoord.x * 2 - 1) * length) + _Time.y * time) * height;
                movement += sin(abs((v.texcoord.x * 2 - 1) * length) + _Time.y * time) * height;
                v.vertex.y += movement / 2;
            }

        struct Input
        {
            float2 uv_BumpMap;
            float3 worldRefl;
            float3 viewDir;
            INTERNAL_DATA
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            float3 normal1 = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap + _Time.x * 0.1));
            float3 normal2 = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap - _Time.x * 0.1));
            o.Normal = (normal1 + normal2) / 2;

            float3 refColor = texCUBE(_Cube, WorldReflectionVector(IN, o.Normal));

            float rim = saturate(dot(o.Normal, IN.viewDir));
            rim = pow(1 - rim, 1.5);

            o.Emission = refColor * rim;
            o.Alpha = saturate(rim + 0.5);
        }

        float4 LightingWaterSpecular(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
        {
            float3 h = normalize(lightDir + viewDir);
            float spec = saturate(dot(h, s.Normal));
            spec = pow(spec, 300);

            float4 final;
            final.rgb = spec * _Color.rgb * 5;
            final.a = s.Alpha + spec;

            return final;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

노멀맵의 uv값에 _Time을 곱하여 물이 흐르는 듯한 효과를 주었으며, Sky에 적용된 것과 같은 큐브맵 텍스쳐를 Water Material에 적용하여 마치 빛이 반사된 것 같은 효과를 준다.

+ Recent posts