Unity Shader特效:人物模型動態流動光特效

本文寫於2017-6-6,轉載請註明

以下爲正文

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

先上效果圖:

 

Shader界面圖:

因爲特效師的攻擊特效做得過爲酷炫,不夠樸素,於是打算增加“憤怒狀態”這一設定,然後就需要一個特效來支撐這一設定。
上網查了一些文章,一開始想做邊緣光的特效,發現效果不太理想,最後找到一篇動態邊緣光的文章,發現效果不錯,思路是通過一個噪聲圖對模型貼圖顏色進行疊加,再加上基於時間的貼圖紋理座標改變來實現的。但是將代碼照搬後導出遊戲發現嚴重問題——人物貼圖全部丟失不顯示了!覺得是文章本身的代碼就寫得有問題,於是查找其他邊緣光相關文章按着動態邊緣光的思路用表面着色器重新修改了一遍,發現效果更好且能成功導出!
感嘆國內博客中的BUG太多,估計他們也沒有實際導出過,只是在編輯器裏預覽了一下而已……

以下是Shader源碼:
 

 Shader "Custom/DynamicRimLighting" {  
         //屬性域  
        Properties {  
            //紋理顏色  
             _MainColor ("Main Color", Color) = (1,1,1,1)  
              //主紋理屬性  
              _MainTex ("Texture", 2D) = "white" {}  
              //法線貼圖紋理屬性  
              _BumpMap ("Bumpmap", 2D) = "bump" {}  
              //邊緣光顏色值  
              _RimColor ("Rim Color", Color) = (1,1,1,1)  
              //邊緣光強度值  
              _RimPower ("Rim Power", Range(0.0,1.0)) = 0.5  
              //
              _RimMask("RimMask", 2D) = "white"{}  
                 _RimSpeed("RimSpeed", Range(-10, 10)) = 1.0  
              _Glossiness ("平滑度", Range(0,1)) = 0.5
              _Metallic ("金屬性", Range(0,1)) = 0.0
              _Brightness ("亮度", Range(0,3)) = 1.5
              _SpecialBrightness ("變身亮度", Range(0,3)) = 1.5
        }

        SubShader {  
              //標明渲染類型是不透明的物體  
              Tags { "RenderType" = "Opaque" }  
              //標明CG程序的開始  
              CGPROGRAM  
              //聲明表面着色器函數  
              #pragma surface surf Standard
              //定義着色器函數輸入的參數Input  
              struct Input {  
                  //主紋理座標值  
                  float2 uv_MainTex;  
                  //法線貼圖座標值  
                  float2 uv_BumpMap;  
                  //視圖方向  
                  float3 viewDir;  
              };  
              //聲明對屬性的引用  
              float4 _MainColor;  
              sampler2D _MainTex;  
              sampler2D _BumpMap;  
              float4 _RimColor;  
              float _RimPower;  
              sampler2D _RimMask;  
              float _RimSpeed;  
              half _Glossiness;
              half _Metallic;
              half _Brightness;
              half _SpecialBrightness;

              //表面着色器函數  
              void surf (Input IN, inout SurfaceOutputStandard o) {  
              fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);  
              fixed rimMask = tex2D(_RimMask, IN.uv_MainTex + float2(0 , _Time.y *_RimSpeed)).r;  
                  //賦值顏色信息  
              o.Metallic = _Metallic;
              o.Smoothness = _Glossiness;
              o.Albedo = tex.rgb *_Brightness* _MainColor.rgb+_RimColor.rgb*_RimPower*(_SpecialBrightness-rimMask); 

              //賦值法線信息  
              o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));  
              half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal)); 
 
              //賦值自發光顏色信息  
              //o.Emission = _RimColor.rgb * pow (rim, _RimPower);  
              o.Emission = _RimColor.rgb *_RimPower*(_SpecialBrightness-rimMask);
              }  
              //標明CG程序的結束  
              ENDCG  
        }
        Fallback "Diffuse"
}



參考文章:
 Unity Shader-邊緣光(RimLight)效果
 http://blog.csdn.net/puppet_master/article/details/53548134
Unity Shader 表面着色器邊緣光(Rim Lighting)二
  http://blog.csdn.net/jk823394954/article/details/48983621

 

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