Shader着色器語法:編程
在Unity引擎中,爲了方便用戶和咱們的引擎溝通,Unity創造了一種簡單語法,方便咱們與引擎的交流,這個語法Unity官方稱爲ShaderLab語法;緩存
1、ShaderLab語法格式:函數
Shader 「着色器名稱」測試
{優化
// 花括號期間的東西就是着色器的源代碼spa
}對象
一、Shader中的方法:SubShader;隊列
SubShader時Shader當中的方法成員,它在一個Shader腳本中是能夠存在多個的,可是多個SubShader並不表明這些SubShader都會執行,Unity引擎會自動尋找能夠在當前狀況下運行的SubShader對象;圖片
注意,每一個Shader都必需要有一個SubShader對象;it
Shader 「着色器名稱」
{
// 花括號期間的東西就是着色器的源代碼
SubShader // 第一個
{
// 下面的代碼就是着色器實際繪製代碼
}
SubShader // 第二個
{
}
. . .
SubShader // 第N個
{
}
}
二、SubShader中的執行過程: Pass;
Pass語法塊,其實是用來作最總渲染的代碼位置,咱們的固定着色器和Cg語言可編程着色器都必須寫在Pass塊當中。
注意:Pass在SubShader不必定存在,當咱們在使用Unity給咱們提供的Surface(表面着色器)語法的時候就能夠不寫Pass過程,Pass過程決定了你的繪製次數,若是隻有一個Pass過程,那麼你的DrawCall就是1,若是產生多個Pass過程就必定會產生多個DrawCall,DrawCall越大你的繪製效率就越低!
Shader 「着色器名稱」
{
// 花括號期間的東西就是着色器的源代碼
SubShader // 第一個
{
// 下面的代碼就是着色器實際繪製代碼
Pass
{
// 固定着色器代碼或者是可編程着色器代碼
}
}
}
2、固定着色器語法:
由於固定着色器只能改變最終輸出色,因此,咱們這裏只能控制色彩的變換,下面就是控制色彩的語法:
Color:
// 語法
Color (R, G, B, A)/[變量名(必定是顏色變量)]
設定對象的純色是否有效,他對燈光無任何影響,他屬於自發光;
Lighting:
Lighting on/off
表示當前渲染物體是否接受燈光的變化影響,在這裏若是你只有自發光,燈光的開關是無用的,若是你開了燈那麼自發光(Color)就會失效效果!
Material Block 材質塊:
主要包含材質如何和燈光產生做用,如下屬性就是對於燈光色彩的反應屬性:
一、Diffuse (R, G, B, A)/[變量名(必定是顏色變量)]
表示材質塊中漫反射的顏色,也是物體的基礎色彩;
二、Specular (R, G, B, A)/[變量名(必定是顏色變量)]
表示在漫反射的基礎上疊加上高光色彩;
三、Shininess Number/[變量(必定是一個float類型的)]
表示對高光的光澤度的改變,範圍在0.0 - 1.0之間,0的時候會出現更大的高光反射,1的時候會得到一個細微的亮斑;
四、Amibent (R, G, B, A)/[變量名(必定是顏色變量)]
表示環境光色彩的影響;
五、Emission (R, G, B, A)/[變量名(必定是顏色變量)]
自發光色彩,當不被任何光照照射的時候的一種顏色;
材質塊中顏色的影響關係:
Emission顏色是最高等級的顏色,他能夠覆蓋掉漫反射顏色,若是沒有Emission的存在,漫反射纔是主要顏色:
最終色彩的生成公式:
Amibent Color * Render Setting菜單下的環境光顏色 + (Light Color * Diffuse Color + Light Color * Specular Color) + Emission;
Cull:
裁減渲染,將不須要的部分剔除掉,有如下幾種方式:
一、front:表示將順時針渲染的面裁減掉,不繪製了;
二、back:表示將逆時針渲染的面裁剪掉;
三、off:表示不執行任何裁剪,這樣正面背面都會繪製,加劇了GPU負擔;
3、深度測試:
一、什麼是深度:
深度其實就是該像素點在3D世界中距離攝像機的距離,深度值(Z軸)越大,則離攝像機越遠;
二、什麼是深度緩衝:
深度緩衝中記錄了每一個像素點的深度值,若是啓用了深度緩衝區,在繪製每一個像素以前,3D API函數會把它的深度值和已存儲的像素點的深度值進行比較,若是新像素的深度值 < 原先像素的深度值,則新像素就替代原來的像素;反之,新像素值會被遮擋,新像素的顏色和深度值就會被丟棄,最終屏幕上顯示的就是深度緩存中深度對應的像素點的顏色!
三、什麼叫深度測試:
新像素的深度值(Z軸值)和舊像素的深度值進行比較的過程;
四、爲何須要深度測試:
能夠表達物體之間遮擋關係,因此咱們須要深度測試;
在ShaderLab中咱們使用的深度測試和深度緩存寫:ZTest, ZWrite;
Unity引擎由於是3D引擎因此ZTest, ZWrite都是默認打開的,若是你不寫表示他們都開啓,咱們能夠在他們以後加入off關鍵字表示關閉某一個選項;
4、屬性:
咱們設置屬性實際上是爲了讓咱們的「檢視體面板」中可以設定顏色,貼圖或者一些常規屬性的東西,這樣咱們就能夠手動的調節他;
屬性塊關鍵字:Properties { // 屬性內容 }
注意:屬性塊只能寫在全部SubShader之上,不能隨便亂寫,並且他必須在全部的SubShader以外。咱們也能夠不去寫Properties;
屬性的定義方式:
變量名( 「在檢視體面板中顯示的名字」, 屬性的數據類型) = 屬性的默認值
注意:屬性的默認值必須寫,不得省略;
一、Color:表示當前屬性是用來設定顏色的;
二、Range(min, max):表示當前屬性是用來設定一個區間的數字,範圍在min 至 max之間;
三、2D:表示當前屬性使用的是2D紋理貼圖,能夠是任意類型的圖片,(tga, png, psd, jpg, jpeg, bmp, 包括法線貼圖);他的默認值: 「white」 {}
四、Float: 表示當前屬性是一個浮點數字;
五、Vector: 表示當前屬性是一個4維的向量;
六、Cube:表示立方體貼圖,主要在天空盒中使用;
5、紋理設定:
格式:SetTexture[紋理的變量對象]{[命令選項]}
命令選項:
combine: 將兩個顏色源混合,混合的源能夠是previous(上一次的結果);
constant(常量顏色值)、primary(頂點的顏色值)、texture(紋理顏色值)中的一種;
constantColor:用來設定一個常量顏色值與紋理色混合;
matrix: 對當前紋理進行矩陣扭曲;
例如:
一、直接使用紋理顏色: SetTexture[_MainTexture] { combine texture }
二、讓紋理的顏色和常量色彩混合 SetTexture[_MainTexture]{ constantColor[_Color] combine constant * texture }
三、咱們但願頂點色彩和紋理顏色混合 SetTexture[_MainTexture]{ combine primary * texture }
四、咱們但願頂點和常量顏色混合到紋理色中 SetTexture[_MainTexture]{ constantColor[_Color] combine constant * texture * primary }
6、標籤屬性;
標籤的用戶在於定義當前的着色器代碼是能夠支持你定義的類型方式,若是超出了這個範圍,那麼當前的着色器代碼會失效;
標籤格式:Tags{//標籤類型和值}
一、SubShader內部標籤:
他的標籤主要用來描述當前子着色器的渲染順序;
順序標籤:」Queue」;
Unity引擎預設值:
一、」BackGround」. 值爲1000,好比天空盒;
二、」Geometry」. 幾何體。值爲2000,大部分物體都在這個隊列中,不透明物體都在這裏,這個隊列內部的物體的渲染順序會有進一步的優化(按照深度值進行從近到遠的繪製);
三、「AlphaTest」。若是須要進行Alpha測試的物體就繪製在這一層,值爲2450;
四、「Transparent」. 有透明繪製需求的物體在這一層繪製,值爲3000;
五、」Overlay」. 在鏡頭上做效果處理的操做在這一層,好比鏡頭光暈效果,值爲4000;
用戶也能夠自定義任意值,可是必定要基於系統默認值來增長或者減小,不能直接給一個數值。例如:Tags{ 「Queue」=「Geometry+10」 }
渲染類型標籤:」RenderType」:
一、」Opaque」:表示實體對象,沒有透明通道的概念,若是你非要給他透明通道,他就忽略你的透明通道;
二、「Tranparent」:表示能夠繪製帶有Alpha通道的物體;
三、「BackGround」:表示天空盒繪製方式;
四、「Overlay」:表示鏡頭上的繪製效果,例如輝光;
例如:咱們但願當前繪製支持Alpha透明那麼咱們能夠這樣設置: Tags{「RenderType」=「Transparent」 「Queue」=「Transparent」}
其餘的設置:
若是咱們想忽略透視矩陣:」IgnoreProjector」=「true」 這樣咱們就支持攝像機的正交矩陣了
若是咱們須要當前渲染須要支持精靈的切割圖:"CanUserSpriteAtlas"="True"
二、Pass內部標籤:
Pass中的Tags主要用來控制對燈光的執行方式,Tags決定了你的Pass過程是在什麼級別的燈光渲染下執行的,高級別能夠兼容低級別,反過來不行;
在標籤內部能夠制定當前過程所能支撐的渲染級別:
例如:
// 對頂點光照的燈光模式
Tags{ 「LightMode」=「Vertex」 }
// 對於前置光照
Tags{ 「LightMode」=「ForwardBase」 }
// 對於前置光照追加光源
Tags{ 「LightMode」=「ForwardAdd」 }
// 對於遲延光照
Tags{「LightMode」=「PrepassBase」}
// 實時渲染
Tags{ 「LightMode」=「PrepassFinal」 }
7、Alpha通道測試
Alpha通道的測試,發生在圖像最終進入屏幕以前的最後一刻;
啓用通道測試的關鍵字:AlphaTest;
格式:AlphaTest off // 表示關閉Aplha通道測試;
格式:AlphaTest comparsion Alphavalue // 表示讓引擎繪製的時候忽略掉必定範圍的值;
comparsion:表示比較運算符;
大於(Greater): 僅渲染alpha 值大於 Alphavalue 的像素
大於等於(GEqual): 僅渲染alpha 值大於等於 Alphavalue 的像素
小於(Less): 僅渲染alpha 值小於 Alphavalue 的像素
小於(LEqual): 僅渲染alpha 值小於等於 Alphavalue 的像素
等於(Equal): 僅渲染alpha 等於 Alphavalue 的像素
不等於(NotEqual): 僅渲染alpha 不等於 Alphavalue 的像素
說明用途,AlphaTest是用來忽略掉指定範圍的像素對象,可是他不能對顏色的還原有直接的幫助,若是想讓顏色按照本身的需求正常的還原回來,咱們須要藉助顏色混合命令;
Aplha顏色混合命令爲: Blend
當圖像被渲染的時候,全部着色器執行之後,全部貼圖都被按照顏色本身的需求顯示在屏幕上,Blend能夠經過計算值來限定顏色的表達;
Blend off
關閉混合功能;
Blend SrcFactor DestFactor
啓動配置混合功能。產生的顏色被乘以 SrcFactor,已經存在屏幕上的顏色乘以DestFactor,而且將二者疊加在一塊兒;
SrcFactor和DestFactor能夠取如下值:
One
表示值爲1,使用此設置來讓源或目標顏色徹底經過;
Zero
表示值爲0,使用此值用來刪除源或者目標色;
SrcColor
表示使用源顏色值來作混合運算;
DstColor
表示使用目標色的值來作混合運算;
SrcAplha
表示使用源像素的Alpha通道值來與顏色混合運算;
DstAlpha
表示使用目標像素的Alpha通道值來與顏色混合計算;
OneMinusSrcColor
表示一個公式 (1 - source color)
OneMinusSrcAlpha
表示一個公式(1 - source aplha)
OneMinusDstColor
表示一個公式 (1 - dest color)
OneMinusDstAlpha
表示一個公式(1 - dest aplha)
混合的經常使用組合:
SrcAlpha OneMinusSrcAlpha 表示標準混合,該繪製繪製,不應繪製的丟棄
One One 表示添加劑,讓顏色的飽和度達到最大;
One OneMinusDstColor 軟性添加劑,根據背景顏色深度,若是背景深度越大那麼前景顏色就越鮮明;
DstColor Zero 與後面背景進行融合;
DstColor SrcColor 讓後面背景顏色的融合度更深;