Unity Shader特效:模型溶解、燃燒

 

本文寫於2017-6-2,原創,轉載請註明。

以下爲正文

………………………………………………………………………………………………………………………………

半年前看的一篇講溶解特效的文章,然而只講思路,沒有源文件,最近挺流行這種特效的,決定嘗試一下。

最後結合網絡上一些不成熟的例子和文章的思路,寫了一個表面着色器Shader,效果挺不錯的,達到了要求,這裏記錄一下。
先上效果圖:


面板可輸入各類數值,注意給一個噪聲貼圖(這裏是用Photoshop分層雲彩濾鏡生成):
 

 

以下是Shader源碼:

Shader "Custom/MyDissolveSurface" {
    Properties {
        _Color ("顏色", Color) = (1,1,1,1)
        _MainTex ("主貼圖 (RGB)", 2D) = "white" {}
        _Glossiness ("平滑度", Range(0,1)) = 0.5
        _Metallic ("金屬性", Range(0,1)) = 0.0
        _NoiseTex ("噪聲貼圖 (R)",2D) = "white"{}  
        _EdgeWidth("邊緣寬度",Range(0,0.5)) = 0.1  
        _EdgeColor("邊緣顏色",Color) =  (1,1,1,1)  
        _EdgeThresholdValue ("硬邊緣閾值(0爲不使用)",Range(0,1)) = 0.5  
        _DissolvePercentage ("溶解百分比",Range(0,1)) = 0  
    }

    SubShader {
            Tags { "RenderType"="Opaque" }
            LOD 200
            CGPROGRAM
            // Physically based Standard lighting model, and enable shadows on all light types
            //原編譯指令
            //#pragma surface surf Standard fullforwardshadows
            //增加addshadow以獲得正確的陰影
            #pragma surface surf Standard fullforwardshadows addshadow
            // Use shader model 3.0 target, to get nicer looking lighting
            #pragma target 3.0
            sampler2D _MainTex;
            sampler2D _NoiseTex;  
            float _EdgeWidth;  
            float4 _EdgeColor;  
            float _EdgeThresholdValue;  
            float _DissolvePercentage;

            struct Input {
                float2 uv_MainTex;
                float3 worldPos;
            };

            half _Glossiness;
            half _Metallic;
            fixed4 _Color;

            void surf (Input IN, inout SurfaceOutputStandard o) {

                // Albedo comes from a texture tinted by color
                fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;
                // Metallic and smoothness come from slider variables
                o.Metallic = _Metallic;
                o.Smoothness = _Glossiness;
                o.Alpha = c.a;
                float DissolveFactor = saturate(_DissolvePercentage);  
                //使用固定座標
                // float noiseValue = tex2D(_NoiseTex,IN.uv_MainTex).r;   
                //使用世界座標
                float noiseValue = tex2D(_NoiseTex,IN.worldPos.rg).r;

                //如果該值對應噪聲圖的值更大,則拋棄

                if(noiseValue <= DissolveFactor)  
                {  
                    discard;  
                }   
                float4 texColor = tex2D(_MainTex,IN.uv_MainTex);  
                float EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor));  
                float4 BlendColor = texColor * _EdgeColor;  

                if(_EdgeThresholdValue>0){
                //不使用漸變(硬邊緣)
                float HardEdgeFactor=EdgeFactor;
                if(HardEdgeFactor>_EdgeThresholdValue){
                    HardEdgeFactor=1;
                    o.Emission =0;  
                }else{ 
                    HardEdgeFactor=0;
                    o.Emission =_EdgeColor; 
                }
                    o.Albedo = lerp(texColor,BlendColor,1-EdgeFactor);  
                }else{
                    o.Emission =0; 
                    //使用漸變(軟邊緣)
                if(_EdgeThresholdValue>=1){
                    o.Albedo = BlendColor; 
                    o.Alpha=0;
                }else{
                    o.Albedo = lerp(texColor,BlendColor,1 - EdgeFactor);  
                }
            }
        }
    ENDCG
    }
    FallBack "Diffuse"
}

參考文章:
 《Trifox》中的遮擋處理和溶解着色器技術(上)
http://gad.qq.com/article/detail/7190982
《Trifox》中的遮擋處理和溶解着色器技術(下)
http://gad.qq.com/article/detail/7190975
 Shader溶解特效
http://blog.csdn.net/xiaoge132/article/details/51657246

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章