前段時間根據油管上的教程寫過一篇Godot Shader特效:2D描邊(outline)效果的筆記,此效果實現原理在2D和3D上是不通用的,於是又在油管上淘到了一個ID爲Dave the Dev的朋友發佈的教程How to outline a 3D object in Godot _ Game Dev Tutorial 4,感謝大神們無私的奉獻!
先看效果圖
注:這次實現全部使用Godot自帶的材質和Shader
原理
Godot的材質系統爲每一個材質提供了一個Next Pass
屬性,該屬性的作用就是給材質提供一個次級材質,通過Next Pass
可以將多個材質以鏈的形式串聯起來。在這個例子中,我們會爲主材質添加一個Next Pass
材質用於專門渲染Outline。這意味着模型會被渲染兩次:第一次按照主材質渲染第二次按照次級材質渲染。
主材質不需要什麼特別設置,僅僅是在Next Pass處再新建一個SpatialMaterial就可以了
下面來說一下次級材質的設置:
- 首先這個次級材質僅用來實現輪廓,所以應設爲
Unshaded
意爲不接受光照。 - 將
Cull Mode
設爲Front
,意爲將表面剔除設置爲剔除前表面,而僅渲染背對攝像機的表面,這樣次級材質纔不會遮擋住主材質。 - 啓用
Grow
,Grow
即渲染時沿模型面的法線方向偏移渲染,以實現模型的視覺縮放效果。 - 設置
Grow Amount
即Grow
的偏移量。 -
Albedo
即輪廓的顏色。
原理還是很好理解的,但是使用中一定要注意Grow Amount
值不宜過大,否則會出現下面的炸裂情況:
小結
這個實現方式要注意Grow Amount
大小,尤其是Low Poly模型,因爲面數較少,更容易出現穿幫。