shader实现积雪效果

Posted 柯腾_wjf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shader实现积雪效果相关的知识,希望对你有一定的参考价值。

Shader "Custom/Shader1" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Bump ("Bump", 2D) = "bump" {}
        _Snow ("Snow Level", Range(0,1) ) = 0
        _SnowColor ("Snow Color", Color) = (1.0,1.0,1.0,1.0)
        _SnowDirection ("Snow Direction", Vector) = (0,1,0)
        _SnowDepth ("Snow Depth", Range(0,0.3)) = 0.1
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf CustomDiffuse vertex:vert
        
        sampler2D _MainTex;
        sampler2D _Bump;                
        float _Snow;
        float4 _SnowColor;
        float4 _SnowDirection;
        float _SnowDepth;

        struct Input {
            float2 uv_MainTex;
            
            //3
            float2 uv_Bump;
            float3 worldNormal; INTERNAL_DATA
        };

        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_Bump, IN.uv_Bump));
            
            if (dot(WorldNormalVector(IN, o.Normal), _SnowDirection.xyz) > lerp(1,-1,_Snow)) {
                o.Albedo = _SnowColor.rgb;
            } else {
                o.Albedo = c.rgb;
            }

            o.Alpha = c.a;
        }

        inline float4 LightingCustomDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten) {
            float difLight = max(0, dot (s.Normal, lightDir));
            float hLambert = difLight * 0.5 + 0.5;
            float4 col;
            col.rgb = s.Albedo * _LightColor0.rgb * (hLambert * atten * 2);
            col.a = s.Alpha;
            return col;
        }

        void vert (inout appdata_full v) {
            float4 sn = mul(transpose(_Object2World) , _SnowDirection);
            if(dot(v.normal, sn.xyz) >= lerp(1,-1, (_Snow * 2) / 3)) {
                v.vertex.xyz += (sn.xyz + v.normal) * _SnowDepth * _Snow;
            }
        }
        ENDCG
    } 
    FallBack "Diffuse"
}

通过以上shader可以实现在石头上叠加积雪的效果,_SnowDepth为积雪的厚度,这个shader也能实现其他一些类似的效果(如灰尘的堆积)。

以上是关于shader实现积雪效果的主要内容,如果未能解决你的问题,请参考以下文章

UnityShader之积雪效果

Cg入门16:Fragment shader - 片段级光照

Cg入门19:Fragment shader - 片段级模型动态变色

Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)

Cg入门17:Fragment shader - 片段级光照(添加阴影)

Unity 之 后处理实现界面灰度效果(PostProcessing实现 | Shader实现)