Shader Outline Shader

Outline,外框線,google 其實可以找到很多參考文章,對模型做 2 次渲染,沿法線做放大並渲染,我個人認為是比較基礎的實踐方式,另還有比較類似後製? 針對整個螢幕去算外框線的,在這篇文章就不多著墨了 ( 還沒研究 XD )。

* 看一下最終的成像:

* 分析成像的組成:

        1. 第一個 pass: 將模型沿著法線方向放大,僅渲染背面 ( 剃除正面渲染 )
        2. 第二個 pass: 正常渲染正面
         
        * 下圖是在 max 模擬的實踐方式,藍色茶壺僅渲染背面,紅色茶壺就是正常炫染正面而已

* 1. 將模型沿法線放大

         * 可以使用 Amplify 自己串
            -- 這邊是將 local space 的 vertex 沿著法向量方向放大,乘上一個變數控制粗細。Cull Mode Front 就是剃除正面渲染,Offset 可以用來消除模型複雜面因為放大而產生的不必要的外框線。


         * Amplify 也有提供 Outline Node
            -- 提供 Color, Width 兩個 Input 來改變顏色與粗細,但目前沒有支援 Unlit Shader。

         * 自己寫 Code
            -- Outline Pass 重點在 vert (appdate v) 那邊對 local space vertex 做沿著法線的放大。

*2. 正常渲染正面

         * Amplify 自己串
            -- 單純輸出圖片,上面忘記提醒,在 Output Node 要設定 Shader Type 是 DoublePassUnlit 才會有兩個 Pass 可以設定喔!

         * 自己寫 Code
            -- 簡單到不知道要解釋什麼。XD


** Q: 上述將 local space 的 vertex 沿著法線放大會產生鏡頭遠近影響線粗細的問題,如下圖


** A: Extrude vertex along normal in clip/projection space, not in local space.

         * 在 local space 下放大模型,透視攝影機下,鏡頭的遠近會影響模型本身的大小,也就造成了鏡頭遠的時候模型放大線變的很細的情況,這時候我們要在 clip space 下去對模型進行放大,然後使用 clip space 的 w 來當縮放比例


         * 透過以上修改,鏡頭無論放大縮小,都不會產生遠的時候線很細的情況,視覺上會以為縮小時線變很粗,其實在畫面上所佔的 pixel 數量是相同的。

  


** 補上一個 OpenGL 內各空間轉換的圖示 (如有認知上的錯誤,還請不吝嗇糾正,感恩 :) )

         * 一般 vertex shader 輸出是 Clip Space 的資料,到了 fragment shader 輸入的是 Screen/Viewport Space 的資料。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

       自己的碎碎念: 雖然說 o.vertex.w 是指攝影機到頂點的距離,但我還是沒能找到什麼文章可以讓我認知更清晰一點...>口<,我腦中還是沒有畫面,但至少可以理解成攝影機越靠近值越小,越遠值越大?

留言

這個網誌中的熱門文章

UE4: Spine2D 導入與基本使用