积雪效果是比较简单的,只需要计算顶点法线方向和世界向上方向之间的点乘,将得到的值与预设的阀值比较,小于阀值为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"
}
效果图:
调整这几个值也可以做出其它效果,比如放置已久积满灰尘的物体
手机扫一扫
移动阅读更方便
你可能感兴趣的文章