Shader "Custom/snowMaterial" { ? ? Properties ? ? { ? ? ? ? _Color ("Color", Color) = (1,1,1,1) ? ? ? ? _MainTex ("Albedo (RGB)", 2D) = "white" {} ?? ? ? ? ? _NormalTex("NormalTex",2D)="bump"{} ? ? ? ? _SnowTex("SnowTex",2D)="white"{} ? ? ? ? _SnowDir("SnowDir",vector)=(0,1,0,0) ? ? ? ? _SnowAmount("SnowAmount",Range(0,2))=1 ? ? ? ? _SnowNormal("SnowNormal",2D)="bump"{}
? ? ? ?? ? ? } ? ? SubShader ? ? { ? ? ? ? Tags { "RenderType"="Opaque" } ? ? ? ? LOD 200
? ? ? ? CGPROGRAM ? ? ? ? // Physically based Standard lighting model, and enable shadows on all light types ? ? ? ? #pragma surface surf StandardSpecular fullforwardshadows
? ? ? ? // Use shader model 3.0 target, to get nicer looking lighting ? ? ? ? #pragma target 3.0
? ? ? ? sampler2D _MainTex; ? ? ? ? sampler2D _NormalTex; ? ? ? ? sampler2D _SnowTex; ? ? ? ? sampler2D _SnowNormal; ? ? ? ? ?struct Input ? ? ? ? { ? ? ? ? ? ? float2 uv_MainTex; ? ? ? ? ? ? float2 uv_NormalTex; ? ? ? ? ? ? float2 uv_SnowTex; ? ? ? ? ? ? float2 uv_SnowNormal; ? ? ? ? ? ? float3 worldNormal; ? ? ? ? ? ? INTERNAL_DATA ? ? ? ? };
? ? ? ? half _Glossiness; ? ? ? ? half _Metallic; ? ? ? ? half _SnowAmount; ? ? ? ? fixed4 _Color; ? ? ? ? float4 _SnowDir; ? ? ? ? // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. ? ? ? ? // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. ? ? ? ? // #pragma instancing_options assumeuniformscaling ? ? ? ? UNITY_INSTANCING_BUFFER_START(Props) ? ? ? ? ? ? // put more per-instance properties here ? ? ? ? UNITY_INSTANCING_BUFFER_END(Props)
? ? ? ? void surf (Input IN, inout SurfaceOutputStandardSpecular o) ? ? ? ? { ?? ? ? ? ? ? ? float3 normalTex=UnpackNormal(tex2D(_NormalTex,IN.uv_NormalTex)); ? ? ? ? ? ? float3 SnowNormal=UnpackNormal(tex2D(_SnowNormal,IN.uv_SnowNormal)); ? ? ? ? ? ? fixed3 wNormal=WorldNormalVector(IN,(0,0,1));//计算顶点的世界法线 ? ? ? ? ? ? // Albedo comes from a texture tinted by color ? ? ? ? ? ? fixed3 finalNoraml=lerp(normalTex,SnowNormal,saturate(dot(wNormal,_SnowDir.xyz))*_SnowAmount); ? ? ? ? ? ? o.Normal=finalNoraml; ? ? ? ? ? ? ? ? ? ? ? ? fixed3 fwNormal=WorldNormalVector(IN,finalNoraml); ? ? ? ? ? ? float lerpVal=saturate(dot(fwNormal,_SnowDir.xyz ));
? ? ? ? ? ? fixed4 c =lerp( tex2D (_MainTex, IN.uv_MainTex) * _Color,tex2D(_SnowTex,IN.uv_SnowTex),lerpVal*_SnowAmount);
? ? ? ? ? ? o.Albedo = c.rgb; ? ? ? ? ? ? // Metallic and smoothness come from slider variables ? ? ? ? ? ? ? ? ? ? ? ? o.Smoothness = _Glossiness; ? ? ? ? ? ? o.Alpha = c.a; ? ? ? ? } ? ? ? ? ENDCG ? ? } ? ? FallBack "Diffuse" } ?
|