Shader "Custom/Snow" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _RimColor("Rim Color", Color) = (1,1,1,1) _SnowPower ("Snow Power",range(0,1)) = 0.2//边缘强度 _SnowRang("Snow Range",range(0,1)) = 0.1 } SubShader { Pass { CGPROGRAM #include "UnityCG.cginc" struct v2f { float4 vertex:POSITION; float2 uv:TEXCOORD0; float3 normal:TEXCOORD1; float rim:COLOR; }; sampler2D _MainTex; float4 _RimColor; float _SnowPower; float _SnowRang; v2f vert(appdata_base v) { v2f o; o.uv = v.texcoord; float3 sn = mul((float3x3)_World2Object, float3(0,1,0)); o.normal = normalize(mul((float3x3)_Object2World,v.normal)); float diff = saturate(dot(v.normal,sn)); if( 1-diff<_SnowRang) { v.vertex.xyz+=normalize(diff*sn+(1-diff)*v.normal)*_SnowPower; } o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); return o; } fixed4 frag (v2f IN):COLOR { fixed4 c = tex2D(_MainTex, IN.uv); float diff = saturate(dot(float3(0,1,0),IN.normal)); if(1-diff<_SnowRang) { float range = (diff/0.8)*(diff/0.8); //c.rgb = _RimColor.rgb*range+c.rgb*(1-range); c.rgb = _RimColor.rgb; } return c; } #pragma vertex vert #pragma fragment frag ENDCG } } FallBack "Diffuse" }