Unity3D Shader系列之幾何著色器基礎

2021-10-12 10:12:33 字數 2494 閱讀 4160

最近一直在練習寫shader,發現用幾何著色器可以寫出特別酷炫的效果。於是去學習了一下,這裡做個總結以備查閱。

幾何著色器位於渲染流水線的幾何階段,在頂點著色器與片元著色器之間。

備註:**於馮樂樂的《unity shader入門精要》p9

其在shader中是可選的,完全可程式設計的。

頂點著色器是以頂點資料(區域性座標、法線方向、紋理座標等)做為輸入,然後輸出齊次裁剪空間下的頂點座標、頂點顏色以及其他階段需要的資訊。每個頂點都會呼叫一次頂點著色器。頂點著色器不能夠建立和銷毀任何頂點,也不知道此頂點與其他頂點的關係(比如這個頂點與其他頂點是否在同乙個三角形裡面)。

而幾何著色器以完整的圖元(primitive)作為輸入資料,輸出經過我們處理後的圖元。我們可以在幾何著色器裡面去建立或銷毀頂點,完全控制輸出的圖元個數與型別。幾何著色器的輸入圖元和輸出圖元都可以為點、線、麵任一種。

幾何著色器的語法還是挺簡單的,這裡以乙個demo為例。

// 1.設定著色器編譯目標等級

#pragma target 4.0

#pragma vertex vert

// 2.宣告幾何著色器方法

#pragma geometry geo

#pragma fragment frag

#include

"unitycg.cginc"

struct v2g

;struct g2f

; fixed4 _wireframecolor;

v2g vert

// 輸入: point line ********

// 輸出: pointstream linestream ********stream

// tristream.restartstrip

// 3.指定幾何著色器方法內新增的頂點數

[maxvertexcount(3

)]void

geo(******** v2g p[3]

, inout linestream stream)

fixed4 frag

(g2f i)

: sv_target

endcg}}}

#pragma target 4.0

#pragma target 4.0
#pragma target用來指定著色器的編譯目標等級。

幾何著色器在shader model 4.0及以上才支援。比如opengl es2.0是不支援的,也就是說幾何著色器目前基本只能在pc端使用。具體哪些平台支援shader model 4.0呢?可通過檢視unity官方文件,

#pragma geometry geo

指定幾何著色器的方法名,這沒什麼可說的,與頂點著色器和片元著色器一樣。

[maxvertexcount(num)]

幾何著色器方法名上必須新增。其用來定義幾何著色器中輸出頂點的最大數量,輸出頂點可以每次都不同,但是不能超過這個值。

[nvidia08]指出,當gs輸出在1到20個標量之間時,可以實現gs的效能峰值,如果gs輸出在27-40個標量之間,則效能下降50%。

void geo(******** v2g p[3], inout linestream stream)幾何著色器方法,返回型別為void。

******** v2g p[3]為輸入圖元,********表示輸入圖元型別為三角形。輸入圖元型別如下。

輸入型別

描述頂點數量

point

輸入圖元為點

1line

輸入圖元為線

2********

輸入圖元為三角形

3lineadj

輸入圖元為帶有鄰接資訊的直線,由4個頂點構成3條線

4********adj

輸入圖元為帶有鄰接資訊的三角形,由6個頂點構成

v2g為我們自定義的頂點著色器到幾何著色器的結構體。

輸出型別

描述pointstream

輸出圖元為點

linestream

輸出圖元為線

********stream

輸出圖元為三角形

Unity3D Shader系列之圓環

效果如下。很簡單,核心 就下面這兩句。原理就是通過計算當前uv與中心的距離是否在內環 innerradius 和外圓 outerradius 之間,若是,則將透明度置為1,若不是,則將透明度置為0。fixed dis distance in.texcoord,fixed2 0.5 0.5 color...

Unity3d Shader 運動模糊

攝影常用的一招就是延時攝影,以使運動的物體產生運動模糊。攝影技巧為 1,三角架固定相機 2,調長 時間 3,物件有運動物體和靜止物體參照 用了延時攝影,會產生藝術感,見下圖 2015年1月 拍攝於上海陸家嘴 遊戲方面可喜的是unity3d也可以實現類似效果,先看效果圖 第一張為無運動模糊 第二張為有...

Unity3D Shader 入門學習

unity3d 的所有渲染工作離不開著色器.shader 著色器其實是一小段程式,它負責將輸入的mesh網格.以指定的方式和輸入的貼圖或者顏色等組合作用.然後輸出.繪圖單元可以依據這個輸出來將影象繪製到螢幕上 輸入的貼圖或顏色等,加上對應的shader,以及對shader的特定引數設定,將這些內容 ...