描邊shader的實現有很多種,頂點外擴是其中之一。頂點外擴的原理是用2個pass 渲染物體2次
第一遍:描邊,頂點沿法線方向外拓後用黑色渲染。外擴這一步的實現是在投影空間,也就是2d的,根絕法線的x和y值進行外擴,因為是沿著法線方向外擴,所以法線越和攝像機方向相同,也就是越接近面向攝像機的頂點,頂點的位置變化的越小,當法線和攝像機方向相同時,不會有任何變化。
第一遍渲染後,實際的影象如下:
第二遍:正常渲染物體,與第一遍渲染的混合在一起
優點:(1)效果最好。
(2)適用範圍廣。
缺點:(1)對效率有一定影響。因為有2個pass,所以drawcall為正常的2倍
(2)對於法線過度不均勻的模型,比如立方體,輪廓會有縫隙。
上邊的立方體例子我是特意把描邊的外擴值調到很大,便於理解。由第一遍渲染後的圖和第二遍渲染後的圖的對比,很容易理解這個方法的原理。其實就是通過法線來把邊緣進行位移,如果不是邊緣,則不位移,比如立方體的正面。在第二次渲染後,會覆蓋同位置的畫素,因為邊緣已經外擴,畫素的位置已經不是原來的位置,因此不會被覆蓋,而像位於立方體正面的畫素,則會被第二次渲染時覆蓋,最後就混合成了帶黑邊的效果圖。
shader "study/3_outline"
_linesize("outlinesize", range(0, 0.1)) = 0.02
_linecolor("linecolor", color) = (0,0,0,1)
} subshader
// 先繪製這個純色的頂點,然後在下乙個pass繪製物件
//這裡不存在前後面,關閉裁剪前後面,也不需要深度快取
cull off // 關閉剔除,模型前後都會顯示
zwrite off // 系統預設是開的,要關閉。關閉深度快取,後渲染的物體會根據ztest的結果將自己渲染輸出寫入
ztest always // 深度測試[一直顯示],被其他物體擋住後,此pass繪製的顏色會顯示出來
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float _linesize;
float4 _linecolor;
struct v2f
;float4 frag(v2f i) : color
endcg
} pass
;
float4 frag(v2f i) : color
endcg
} }}
附上工程連線: 2 2頂點宣告
2.2 頂點宣告 該小節對頂點宣告的描述絕大多數都取自翁雲兵的 著色器和效果 該文對頂點宣告的描述是我所見到最詳盡最透徹的,這裡向作者表示敬意 到現在為止,我們已經使用自由頂點格式 flexible vertex format fvf 來描述頂點結構中的各分量。但是,在可程式設計管線中,我們的頂點資...
Unity Shader (四)頂點程式示例
1 在頂點函式中實現凸起效果 2 漸變及溜光效果 3 頂點扭曲效果 旋轉矩陣去影響頂點 優化繞y軸旋轉的矩陣,除去0與其他項相乘的項 float x cos angle v.vertex.x sin angle v.vertex.z float z sin angle v.vertex.x cos ...
opengl 教程 9 頂點屬性插值
本章我們了解3d管線的乙個重要特性,在光柵化階段的頂點屬性插值。從前面的教程我們知道,為了在螢幕上輸出渲染的物體,我們在頂點shader中輸出gl position,這是乙個四維向量,表示齊次空間的頂點座標,x,y,z都經過了透視除法,除以了w值,x y的範圍是 1,1 而z的範圍是 0,1 而w則...