**:
shder中主要書寫的兩個階段。乙個是幾何階段。它由乙個頂點著色器函式完成,接收來自應用階段的資料,生成資料傳遞給下乙個光柵化階段。光柵化階段由片元著色器函式完成。
不同的資料表示什麼具體的含義?shader中用「語義」這個概念進行指示。應用階段的語義種類如下: ;
比如這裡:
struct v2f//頂點著色器傳遞給片元著色器的結構體
; v2f vert
//幾何階段中 頂點著色器
定義了乙個結構體,有sv_position和texcoord兩個語義。
這裡的語義除了sv_position以外,還有
texcoord0~n系列
例如texcoord0、texcoord1、texcoord2…等等,主要用於高精度資料。
color0~n系列
例如color0、color1、color2…等等,主要用於低精度資料。
雖然這兩種語義我們可以根據需要自由定義,但是,它並不是可以無限定義的,不同的gpu硬體有不同的數量限制。
以下為手機平台的常見規則:
opengl es2.0支援最多8個
opengl es3.0支援最多16個
從效能優化角度來講,數量越少效能越好。
另外,每個語義是4維向量,利用好這一點,可以大大節省總數量
如果渲染表面朝向攝像機,則face節點輸出正值1,如果遠離攝像機,則輸出負值-1。
"unlit/myfirstshader"
_backtex
("backtex"
,2d)
="white"}
subshader ;
struct v2f
;fixed4 frag (v2f i,
float face:vface)
: sv_target
endcg
}}
通常情況下,片斷著色器最終只需返回乙個顏色值即可,也是我們最常見到的編寫方式,如下:
sv_target
這裡的sv_target就是指定輸出顏色到rendertarget的語義,其實我們也可以採用struct的方式,就是像應用階段到頂點與頂點到片斷一樣,只是由於平時我們只需返回乙個顏色所以就無需再用乙個struct了(你非要用也是可以的)。
當我們利用struct時,就可以通過下列語義來輸出多個內容:
sv_target0〜n
預設sv_target0,也就是sv_target,還有sv_target1,sv_target2…這個在需要輸出多個rendertarget時很有用。
sv_depth
一般情況下,模型的畫素深度值在光柵化時會自動插值計算得出,並不需要我們做額外的處理,但這並不代表不可以修改它,通過在片斷著色器中輸出sv_depth語義可以更改畫素的深度值。
注意此功能相對會消耗效能。
UnityShader學習記錄(三)
這篇文章主要說一下shader裡面的透明效果,透明效果在unityshader中有兩種方式,透明度測試和透明度混合,透明度測試是比較霸道的透明演算法,它只有透明和不透明兩種情況,也就是說這個unityshader能實現的不是透明就是不透明,不會存在半透明現象,所以它的值就只有0和1兩種。那麼要想實現...
unity shader 學習筆記
upgrade note replaced world2object with unity worldtoobject upgrade note replaced mul unity matrix mvp,with unityobjecttoclippos shader unity shader b...
Unity Shader 詳細自學(三)
pragma target 3.0 表示我們將要對這個著色器使用硬體的 shader model 3.0 的能力,硬體的 shader model 是硬體乙個用於著色處理的基礎的指令範圍和能力,值越高表示能使用越高階的功能,如果沒有使用 pragma target 3.0 這句指令,預設使用的是 s...