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。
*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 是指攝影機到頂點的距離,但我還是沒能找到什麼文章可以讓我認知更清晰一點...>口<,我腦中還是沒有畫面,但至少可以理解成攝影機越靠近值越小,越遠值越大?
留言
張貼留言