[shader]Unity 移動端海面
阿新 • • 發佈:2019-01-30
Shader "QQ/Water_Depth_Wave" { Properties { _WaterColor("海水顏色",Color) = (0,.25,.4,1) _FarColor("海面顏色",Color)=(.2,1,1,.3) [NoScaleOffset]_BumpMap("法線貼圖", 2D) = "white" {} _BumpPower("法線強度",Range(-1,1))=.6 _EdgeColor("邊緣顏色",Color)=(0,1,1,0) [NoScaleOffset]_WaveTex("海浪貼圖",2D)="white" {} _WaveSpeed("海浪速度",Range(0,10))=4 [NoScaleOffset]_EdgeTex("邊緣貼圖",2D)="white" {} _EdgeRange("邊緣融合",Range(0.1,1))=.4 _WaveSize("貼圖尺寸",Range(0.01,1))=.25 _WaveOffset("xy,zw為偏移",vector)=(.1,.2,-.2,-.1) _LightColor("燈光顏色",Color)=(1,1,1,1) _LightVector("xyz為燈光角度,w為衰減",vector)=(.5,.5,.5,100) } SubShader{ Tags{ "RenderType" = "Opaque" "Queue" = "Transparent" } Blend SrcAlpha OneMinusSrcAlpha LOD 200 Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fog #pragma multi_compile DEPTH_OFF DEPTH_ON #pragma target 3.0 #include "UnityCG.cginc" fixed4 _WaterColor; fixed4 _FarColor; fixed4 _LightColor; sampler2D _BumpMap; float _WaveSize; float4 _WaveOffset; float4 _LightVector; float _BumpPower; #ifdef DEPTH_ON fixed4 _EdgeColor; sampler2D _WaveTex; float _WaveSpeed; sampler2D _EdgeTex; float _EdgeRange; sampler2D_float _CameraDepthTexture; #endif struct a2v { float4 vertex:POSITION; half3 normal : NORMAL; }; struct v2f { float4 pos : POSITION; UNITY_FOG_COORDS(0) half3 normal:TEXCOORD1; float4 screenPos:TEXCOORD2; fixed3 viewDir:TEXCOORD3; fixed2 uv[2] : TEXCOORD4; }; v2f vert(a2v v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); float4 wPos=mul(unity_ObjectToWorld,v.vertex); o.uv[0]=wPos.xz*_WaveSize+_WaveOffset.xy*_Time.y; o.uv[1]=wPos.xz*_WaveSize+_WaveOffset.zw*_Time.y; o.normal=UnityObjectToWorldNormal(v.normal); o.viewDir= WorldSpaceViewDir(v.vertex); o.screenPos = ComputeScreenPos(o.pos); COMPUTE_EYEDEPTH(o.screenPos.z); return o; } fixed4 frag(v2f i):COLOR { fixed4 col=_WaterColor; half3 nor = UnpackNormal((tex2D(_BumpMap,i.uv[0])+tex2D(_BumpMap,i.uv[1]))*.5f); nor= normalize(i.normal + nor.xzy *half3(1,0,1)* _BumpPower); half spec =max(0,dot(nor,normalize(normalize(_LightVector.xyz)+normalize(i.viewDir)))); spec = pow(spec,_LightVector.w); half fresnel=dot(nor,normalize(i.viewDir)); fresnel=saturate(dot(nor*fresnel,normalize(i.viewDir))); #ifdef DEPTH_ON half depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos))); depth=saturate((depth-i.screenPos.z)*_EdgeRange); fixed4 edge = (tex2D(_EdgeTex,i.uv[0])+tex2D(_EdgeTex,i.uv[1])); col =lerp(edge*_EdgeColor,col,depth); float time=_Time.x*_WaveSpeed; float wave=tex2D(_WaveTex,float2(time+depth,1)).a; col+=_EdgeColor*saturate(saturate(wave)-depth)*edge.a; #endif col.rgb=lerp(col,_FarColor,_FarColor.a-fresnel); col.rgb+=_LightColor.rgb*spec*_LightColor.a; return col; } ENDCG } } FallBack OFF }