Unity shader实现积雪掩盖效果
发表于2018-05-27
为了让游戏中的雪地场景变得更加真实,开发者基本会根据飘雪效果针对角色不同位置,加入时间因素,会让觉得身上的积雪堆积的越来越多,也可以是某个物体,随着时间越来越长,该物体就会被积雪掩埋。越是这种细心逼真的操作越会被玩家喜欢,下面就针对积雪掩盖效果给大家做介绍。
效果图

原理
为了实现这个功能,其实主要是利用了法线 和 雪方向来做文章,我们在角色凹凸不平的地方进行对模型向外拉伸,然后着色使用雪的颜色即可。
shader代码
Shader "Custom/SnowShader" { Properties { _MainColor("Main Color", Color) = (1.0,1.0,1.0,1.0) //颜色值(改变亮度和色调用的,这里可以无视) _MainTex("Base (RGB)", 2D) = "white" {} //主纹理 _Bump("Bump", 2D) = "bump" {} //法线图 _Snow("Level of snow", Range(1, -1)) = 1 //雪的凹凸参数 _SnowColor("Color of snow", Color) = (1.0,1.0,1.0,1.0) //雪的颜色 _SnowDirection("Direction of snow", Vector) = (0,1,0) //雪的方向 _SnowDepth("Depth of snow", Range(0,1)) = 0 //雪的厚度 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Standard vertex:vert #pragma target 3.0 struct Input { float2 uv_MainTex; float2 uv_Bump; float3 worldNormal; INTERNAL_DATA }; sampler2D _MainTex; sampler2D _Bump; float _Snow; float4 _SnowColor; float4 _MainColor; float4 _SnowDirection; float _SnowDepth; //这里是处理法线的角度和雪的朝向,如果这里需要显示雪的时候,就把模型向外拉 //拉的规则是: 雪的方向 和 法线的方向和向量 * 雪的厚度 * 凹凸不平的层度 void vert(inout appdata_full v) { float4 sn = mul(UNITY_MATRIX_IT_MV, _SnowDirection); if (dot(v.normal, sn.xyz) >= _Snow) v.vertex.xyz += (sn.xyz + v.normal) * _SnowDepth * _Snow; } void surf(Input IN, inout SurfaceOutputStandard o) { half4 c = tex2D(_MainTex, IN.uv_MainTex); o.Normal = UnpackNormal(tex2D(_Bump, IN.uv_Bump)); //雪的角度如果和法线的角度大于了参数值(_Snow,这里可以理解为凹凸不平的层度)则使用雪的颜色,否则使用贴图的颜色 if (dot(WorldNormalVector(IN, o.Normal), _SnowDirection.xyz) >= _Snow) o.Albedo = _SnowColor.rgb; else o.Albedo = c.rgb * _MainColor; o.Alpha = 1; } ENDCG } FallBack "Diffuse" }