Unity3d 描邊shader詳解

來源:互聯網
上載者:User

1.邊緣光方法(Rim Light):
Unity官方教程裡有例子,其中核心是這兩句代碼:
 
half rim = 1.0 - saturate(dot (normalize(IN.viewDir), IN.worldNormal));
o.Emission = _RimColor.rgb * pow (rim, _RimPower);
IN.viewDir是當前視角向量,IN.worldNormal是物體的法線。dot是計算視角和法線的點積,等於視角和法線夾角的cos值,如:

圖片:sl7.jpg


 
Cos的範圍是1-0,1-cos就成了0-1,在夾角90度時達到最大值,正好用來類比側光的強度(與視角成90度的部分光線最強,就是邊緣光了)
把這個值的變動率用一個pow函數(rim的_rimPower次方)進行放大,就能強化邊緣發亮的效果。比較一下:

圖片:sl1.jpg


 
沒有經過Pow放大變動率的邊緣光,cos函數的變化是比較平緩的,造成大片地區被染色。

圖片:sl2.jpg


 
經過Pow函數放大變動率,就有了邊緣發亮的效果。這個圖大致體現了放大前後變動率的曲線:

圖片:sl14.jpg


 
 
這種邊緣光在複雜幾何形體的時候效果還是不錯的。

圖片:sl3.jpg


 

圖片:sl4.jpg


 
但是在平直的物體上,邊緣光就不見了

圖片:sl5.jpg


 
到了方形物體,幾乎很難看見了

圖片:sl6.jpg


 
很好理解,正方形每個面法線都是一個方向的,沒法體現出變化和輪廓了。
另外這種方法在描繪凹的幾何體時,凹的部分(包括法線貼圖造成的凹凸)的邊緣也都會被畫出來,並不是真正意義上的邊緣輪廓,就是一種側光效果。
該方法的好處是簡單,只要把官方的shader改寫,加上計算邊緣光的幾句,就能實現。要顯示的時候動態切換shader就可以。基本不需要代碼幹預,效率高。
 
2.單個物體輪廓渲染方法
這個方法實現比較複雜,只能介紹大致思路:
1.把要渲染輪廓的物體放在一個單獨的層裡
2.在層裡設定一個disable的攝像機,culling mask是渲染物體所在層。
3.主攝像機保持culling mask是everything
4.產生1個renderTexture
5.把那個disable的輔助攝像機用RenderWithShader方法,指定一個單色渲染的shader(只需要輪廓,不需要光照計算)渲染物體的輪廓到一個renderTexture
6.繼續用單色Shader,用Unity內建Blur類似的方法,把物體輪廓圖上下左右移動幾個像素,疊加在一起,得到一個比原來輪廓大,邊緣模糊的輪廓圖,存到一個臨時renderTexture
7.把大的輪廓圖和原始輪廓圖疊加,把中間清晰輪廓部分消除掉,就能得到一個完整帶透明度的輪廓圖。
8.在主攝像機的OnRenderImage裡,把這個透明輪廓圖和主攝像機渲染的映像進行alpha混合,就能產生一個完整並且不被遮擋的輪廓效果了。
效果:

圖片:sl8.jpg


 
明顯效果比側光好多了。不過這種方法開銷比較大,而且需要很多代碼的支援。
 
附上一個小Demo,包含了上述兩種方法。
滑鼠可以控制鏡頭平移、旋轉、縮放。滑鼠划過物體顯示側光效果,點擊物體顯示清晰輪廓效果,再次點擊效果消除。

圖片:sl9.jpg


 

圖片:sl10.jpg


圖片:sl11.jpg


可以設定邊緣顏色 和寬度 模糊度
目標按照材質進行分組以方便處理

圖片:sl12.jpg


 
變換成細線 綠色

圖片:sl13.jpg


 ---------------------------------------------------------------------------------------------------------------------
最佳化了代碼,減少了一組RenderTexture,這個東西還是很耗資源的,減少了計算的次數。
另外增加了一組模糊、裁剪一次完成的shader,資源上更節省,不過邊緣較模糊。
兩種演算法效果比較:

圖片:sl15.jpg


 
 多次模糊再裁剪的演算法,邊緣光滑,模型的鋸齒在邊緣線被光滑了,開銷略大

圖片:sl16.jpg


 
 一次同時模糊、裁剪演算法,邊緣較模糊,鋸齒也被等比放大,但開銷較省。
根據需要使用。
總體上因為是全屏效果,與被渲染物體數量無關,所以基本上顯示輪廓物體的多少不會影響效率。

附件裡包含兩種方法的代碼和shader。RimLight方法一個shader就能對應一種材質效果,不需要代碼支援。後一種方法需要代碼加shader,類似官方的Image Effect效果。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.