AmplifyShader ForceField Shader

ForceField 防護罩,這個關鍵字可以找到不少教學,依需求可以簡單到複雜,下面應該是簡單的...XD

* 首先看一下最終的成像:


* 分析成像的組成:

        1. Object Intersect Line - 物體接觸面高光
        2. Fresnel ( Rim Light ) - 菲聶爾反射,常應用在邊緣高光
        3. Grab Pass + UV Offset - 貼圖流動
        4. Vertex Offset - 頂點位移


* 1. Object Intersect Line - 物體接觸面高光

          -- 1.1 這邊要使用到 Depth Fade Node,這個 Node 的 Out 是透過 Distance 參數控制來顯示與自身交疊物件的多寡,如下圖


          -- 1.2 1.1透過 Saturate Node 會取得一個 0~1 的數值,將這個數值拿來當作 Lerp 的 Alpha 進行染色

* 2. Fresnel ( Rim Light ) 

          菲聶爾反射,基本上就是 vertex NormalView Direction 內積的 Minus。其實很常應用,邊緣光是一例,可以自己串,也可以使用 ASE 內建的,以下兩種都會貼上。

* 3. Grab Pass + UV Offset

          -- 3.1 這邊使用到 Grab Screen Position Node,這是取得物體轉換到 Screen Space 後每個像素點的座標值(根據螢幕大小正規化[0~1]後的數值),類似 Screen Position Node,但不一樣的是前者座標起始點是左下角,後者是左上角。

        Grab Screen Position Node:  

        Grab Screen Color Node:   搭配 Grab Screen Color Node,提供對 Screen Space 的 UV 作用,利用 UV 擾動達到畫面扭曲的效果

          -- 3.2 使用 Panner 對 UV 做隨時間的擾動,這邊使用一張 Normal Texture,利用 Offset 當 Speed。


* 4. Vertex Offset - 頂點位移

        Vertex Normal Node:    Vertex Normal Node,與頂點垂直的向量 (需注意有沒有 Smooth 的差別)
          -- 4.1 將 Vertex Normal 乘上一個參數就會是放大/縮小

          -- 4.2 利用 3.1 的 Normal Texture 的 X(U) 方向數值當亂數與 Vertex Normal 相乘就可以製造出擾動,這時提供的參數就像擾動的放大/縮小係數
-------------------------------------------------------------------------------------------------------------------------------------------------------------------

上面提供每個步驟分解的效果串法,但最終還是要將所有效果串接在一起,將邊緣高光與畫面擾動效果相加,當作物體交接面 Lerp 染色的 input B。透過 1.1 可以看到相交的地方會是黑色,才會被染色; 而白色的部分,就會進行擾動。頂點擾動相對單純,只是借用 Normal Texture 的 X(U) 數值來當亂數擾動而已

留言

這個網誌中的熱門文章

UE4: Spine2D 導入與基本使用