UnityShader之积雪效果
阅读原文时间:2023年07月15日阅读:1

  积雪效果是比较简单的,只需要计算顶点法线方向和世界向上方向之间的点乘,将得到的值与预设的阀值比较,小于阀值为0,用这个值进行插值就OK了

代码:

Shader "MyShader/SnowShader" {
Properties{
_MainTex("MainTex",2D)="white"{}//纹理
_SnowNum("Snow Num",Range(-,))=//点乘阀值
_SnowIntensity("Snow Intensity",Range(,))=//积雪强度
_SnowColor("Snow Color",Color)=(1.0,1.0,1.0,1.0)//积雪颜色
}

 SubShader{  
     Pass{  
         Tags{"LightMode"="ForwardBase"}  
         CGPROGRAM  
         #pragma vertex vert  
         #pragma fragment frag  
         #include "UnityCG.cginc"

             sampler2D \_MainTex;  
             float4 \_MainTex\_ST;  
             fixed \_SnowNum;  
             fixed \_SnowIntensity;  
             fixed4 \_SnowColor;

             struct a2v{  
                 float4 vertex:POSITION;  
                 float3 normal:NORMAL;  
                 float2 texcoord:TEXCOORD0;  
             };

             struct v2f{  
                 float4 pos:SV\_POSITION;  
                 float3 worldNormal:TEXCOORD0;  
                 float2 uv:TEXCOORD1;  
             };

             v2f vert(a2v v){  
                 v2f o;  
                 o.pos=mul(UNITY\_MATRIX\_MVP,v.vertex);  
                 o.worldNormal=UnityObjectToWorldNormal(v.normal);  
                 o.uv=v.texcoord\*\_MainTex\_ST.xy+\_MainTex\_ST.zw;  
                 return o;  
             }

             fixed4 frag(v2f i):SV\_TARGET{  
                 fixed3 tex=tex2D(\_MainTex,i.uv).rgb;  
                 fixed3 worldNormalDir=normalize(i.worldNormal);  
                 fixed3 worldUpDir=fixed3(,,);  
                 //用smoothstep是为了使得积雪边缘过渡更平滑  
                 fixed colNum=smoothstep(\_SnowNum,,dot(worldNormalDir,worldUpDir))\*\_SnowIntensity;  
                 //fixed colNum=step(dot(worldNormalDir,worldUpDir),\_SnowNum);  
                 fixed3 finalCol=lerp(tex,\_SnowColor,colNum);  
                 return fixed4(finalCol,);  
             }  
         ENDCG  
     }  
 }  
 FallBack "Diffuse"  

}

效果图:

调整这几个值也可以做出其它效果,比如放置已久积满灰尘的物体