3 頂點外擴方法實現的描邊shader

2021-07-14 07:14:34 字數 1575 閱讀 1599

描邊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則...