UnityShader-透明水面效果

Shader "Costum/ceshi3"{
Properties{
    _Color("Color", Color) = (1,1,1,1)
    _MainTex("MainTex", 2D) = "white" {}
    _AlphaScale("Alpha Scale", Range(0, 1)) = 1
    _Wateramplitude("Water amplitude",Range(0.01,1))=1  //水紋的振幅 
    _Frequency("Water lines frequency",Range(1,10))=1   //水紋震動的頻率
}
    SubShader{
        Tags { "Queue" = "Transparent" "IngnoreProjector" = "True" "RenderType" = "Transparent" }
        LOD 200
        Pass{
            Tags { "LightMode" = "ForwardBase" }

            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "Lighting.cginc"

            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _AlphaScale;
            float _Wateramplitude;
            float _Frequency;
            struct a2v {
                float4 vertex : POSITION;
                float4 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 position : SV_POSITION;
                float3 worldNormal : TEXCOORD0;
                float3 worldPos : TEXCOORD1;
                float2 uv : TEXCOORD2;
            };

            v2f vert(a2v v)
            {
                v2f f;
                 float dis=distance(v.vertex,float3(0,0,0));
                float h= sin(dis*_Frequency+_Time.z)*_Wateramplitude;
                v.vertex.y=h;
                f.position = UnityObjectToClipPos(v.vertex);

                //計算世界空間下的法線
                f.worldNormal = UnityObjectToWorldNormal(v.normal);

                //計算世界空間下的頂點
                f.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                //計算變換後的紋理座標
                f.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

                return f;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                //歸一
                fixed3 worldNormal = normalize(i.worldNormal);
                fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

                //紋理顏色
                fixed4 textColor = tex2D(_MainTex, i.uv);


                //反射顏色
                fixed3 albedo = textColor.rgb * _Color.rgb;

                //環境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

                //漫反射
                fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));

                return fixed4(ambient + diffuse, textColor.a * _AlphaScale);
            }

            ENDCG
        }
    }
FallBack "Transparent/Cutout/VertexLit"
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章