Unity shader造冰女

来源:互联网 发布:软件开发收费标准 编辑:程序博客网 时间:2024/05/16 09:33

情景

在游戏中有的时候需要角色走到雪地场景,这个时候如果雪飘雪的,角色走角色的就会觉得不是很真实(当然估计没几个玩家会在意),如果角色走到不同的位置(不同的角度,不同的风向),随着时间的加长,角色身上的雪会堆积得越来越多,或者一个刚被杀死的怪物,随着时间越来越长,雪掩盖了他的身体,会不会很真实的感觉呢~这里就要实现这个功能。

效果图

首先来看我们要实现的功能

原理

为了实现这个功能,其实主要是利用了法线 和 雪方向来做文章,我们在角色凹凸不平的地方进行对模型向外拉伸,然后着色使用雪的颜色即可。

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"}
0 0