Unity shader造冰女

情景

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

效果图

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

原理

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

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"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值