Shader - ShaderLab基礎

Unity中的所有Shader都是使用ShaderLab的聲明性語言編寫的。而ShaderLab是Unity對CG/HLSL/GLSL的一層封裝,重點支持的是Cg着色器語言。

目前面向GPU的編程有三種高級圖像語言:HLSL語言,GLSL語言,Cg語言。
HLSL語言:High Level Shading Language,由Microsoft公司提供,通過Direct3D圖形軟件庫來編寫的着色器語言。
GLSL語言:OpenGL Shading Language,由OpenGL安委會提供,在OpenGL中進行着色器編程的語言。
Cg語言:C for Graphics,由NVIDIA公司和Microsoft公司合作提供,有自己的一套關鍵字和函數庫,獨立於三維編程接口,在Direct3D和OpenGL上都可工作。

語法格式:

Shader "name"
{
	[Properties]
	SubShaders
	[FallBack]
	[CustomEditor]
}

tips:在[和]內的內容可以不實現,例如[properties]在實際書寫shader過程中,可能不會用到屬性

Shader
Shader 是着色器文件的根命令,每個文件必須定義一個(且只有一個)。“name”定義了shader的名稱以及在選擇列表中的路徑。
Properties
Properties定義了在材質屬性面板中可進行設置以及修改的參數列表,語法格式爲:

Properties
{
	Name("Show Name",Type) = default value
	...
}

ShaderLab 提供的Properties類型有:

類型 描述 語法
Range(min,max) 在(min,max)範圍內的浮點數 name(“display name”,Range(min,max)) =number
Float 浮點數 name(“display name”,Float) =number
Int 整數 name(“display name”,Int) =number
Color 顏色(RGBA,顯示顏色選擇器,可以根據需要調整顏色空間) name (“display name”, Color) = (number,number,number,number)
Vector 矢量(顯示爲四個數字字段) name (“display name”, Vector) = (number,number,number,number)
2D 2D紋理(如果默認沒有紋理可以設置“defaulttexture”爲“”) name (“display name”, 2D) = “defaulttexture” {}
Cube 立方體貼圖(如果默認沒有紋理可以設置“defaulttexture”爲“”) name (“display name”, Cube) = “defaulttexture” {}
3D 3D紋理(如果默認沒有紋理可以設置“defaulttexture”爲“”) name (“display name”, 3D) = “defaulttexture” {}
注意:
着色器內的每個屬性都由名稱進行引用,通常 使用下劃線(_)作爲起始字符。
"display name" 是指在材質屬性面板中顯示的名字。
對於2D紋理,默認值爲空字符串("")或內置紋理,內置紋理包括:“white”(1,1,1,1)、"black"(0,0,0,0)、"gray"(0.5,0.5,0.5,0.5)、"bump"(0.5,0.5,1,0.5)、"red"(1,0,0,0)。
非2D紋理,默認值使用空字符串(“”),當未指定紋理時,會使用gray(0.5,0.5,0.5,0.5)紋理
在着色器的固定函數中,可以使用[name]的方式,訪問屬性值
Properties中的數據參數會被序列化爲材質的數據,而在subshader中定義的參數值,如果不是Properties的一部分,是不會進行保存的,但是可以使用代碼進行設置(Material.SetFloat)

在Properties中定義的屬性前,可以指定其他可選屬性
Properties的可選屬性:

屬性 描述
[HideInInspector 不在材質屬性面板中顯示該屬性
[NoScaleOffset] 在材質顯示面板中不會顯示此紋理的平鋪/偏移字段
[Normal] 表示紋理屬性需要法線貼圖
[HDR] 表示紋理屬性需要高動態範圍(HDR)紋理
[Gamma] 將float/vector屬性指定爲sRGB值,可根據需要進行顏色空間轉換
[PerRendererData] 會將該物體的其他材質上的紋理加載進來
[Toggle] 在面板上顯示一個可勾選項

SubShader
Untiy中的每個着色器都包含一個子着色器列表,當Unity需要顯示一個網格時,它獲取需要使用的着色器,並提取第一個能運行在當前用戶顯卡上的子着色器
語法格式:

SubShader
{
	[Tags]
	[CommonState]
	Passdef
	[Passdef...]
}

Tips:中括號([])表示可選
SubShader Tags
自着色器使用標籤來告訴渲染引擎何時以及如何進行對象渲染。
語法格式:

Tags{"TagName1" = "Value1" "TagName2"="Value2"...}

標籤基本上都是鍵值對,標籤的數量是沒有任何限制的。
SubShader的標籤用來確定渲染順序以及其他參數。
標籤分爲Unity識別標籤以及自定義標籤,自定義標籤可以使用Material.GetTag函數進行查詢,Unity識別標籤必須位於SubShader內部,而不是Pass內部。
Unity識別標籤:

標籤 描述
Queue 確定對象的繪製順序,決定其對象屬於哪個渲染隊列,這樣任何透明着色器都可以確保他們在所有不透明對象之後繪製,每個渲染隊列由整數索引表示,Unity中有五個預定義的渲染隊列:
Background:渲染隊列:1000,此渲染隊列在其他任何隊列之前繪製,通常用於天空和或背景等
Geometry:渲染隊列:2000,在不指定隊列的情況下,爲默認渲染隊列。用於大多數對象,不透明的幾何對象使用此隊列
AlphaTest:渲染隊列:2450,alpha測試幾何對象使用此隊列,他是一個獨立隊列,Geometry因爲在繪製完所有實體之後渲染經過alpha測試的對象會更有效
Transparent:渲染隊列:3000,此渲染隊列在Geometry和AlphaTest之後進行渲染,並按照從後到前的順序渲染,任何alpha混合(即不寫入深度緩衝區的着色器)都應該在此隊列進行渲染(如:玻璃,例子)
Overlay:渲染隊列:4000,此隊列用於疊加效果,最後渲染的對象應放在此隊列進行渲染(如鏡頭光暈)
在Unity中,高達2500(Geomery+500)的隊列,被認爲是不透明的,並且會優化對象的繪製順序以獲得最佳性能。而更高的渲染隊列被認爲是透明的,並按距離對對象進行排序,從最遠的開始進行渲染。SkyBox在所有的不透明和所有透明對象之間進行繪製
RenderType 將着色器分類爲若干定義組,例如,Opaque(不透明)着色器,Alpha-test着色器等。可以在使用替換着色器進行渲染時,或者在某些情況下生成相機的深度紋理進行使用,內置的RenderType有:
Opaque:不透明着色器,如Normal,Self illuminated,Reflective,terrain着色器等
Transparent:大多數半透明着色器,如Transparent,Particle,Font,terrain additive pass着色器等
TransparentCutout:蒙版透明着色器,如Transparent Cutout two pass vegetation着色器
Background:Skybox着色器
Overlay:GUITexture,Halo,Flare着色器
TreeOpaque:樹皮
TreeTransparentCutout:樹葉
TreeBillboard:廣告牌樹
Grass:草
GrassBillboard:廣告牌草
DisableBatching 在使用批處理時,某些着色器會不起做(主要是進行對象空間頂點邊形的着色器),這是因爲批處理將所有幾何體轉換爲世界空間,因此對象空間會丟失,DisableBatching用來表示該着色器是否支持批處理。
true:始終禁止此着色器的批處理
false:不禁用批處理,默認值
LODFading:當LOD fading 激活時,禁用批處理,主要用於樹
ForceNoShadowCasting 爲true時,那麼使用此着色器的對象將永遠不會投射陰影。例如,當使用着色器特換功能時
IgnoreProjector 如果爲true時,那麼使用此着色器的對象不會受到投影(Projectors)影響
CanUserSpriteAtlas 如果爲false時,將着色器用於Sprite時,將會導致將他們打入atlases時無法工作
PreviewType 設置材質屬性面板中預覽窗口顯示什麼模型,默認爲球體

Passdef
SubShader可以擁有多個Pass,並且可以設置所有通過共同擁有的任何狀態(語法中的[CommonState]部分)以及Pass特有的標籤。
當Unity選擇要渲染的子着色器時,會爲每個定義的Pass傳遞一次對象(可能多次,根據光的交互來確定)
Unity 提供了三種Pass,即Pass、UsePass、和GrabPass。
每個Pass都可以使用在SubShader中定義的任何語句,也就是說,可以將多個Pass使用的公共方法或屬性定義在SubShader中。

Pass
每個Pass塊會導致對象渲染一次,也就是說,如果有兩個pass都執行了,那麼這個物體會被渲染兩次。
語法格式:

Pass
{
	[Name and Tags]
	[RenderSetup]
}

[Name and Tags]:Pass可以定義name和任意數量的Tags,用於將pass的意圖傳遞給渲染引擎。
Pass Tag:
語法:

Tags{"TagName1" ="Value1" "TagName2" = "Value2"}

Pass 內部的標籤用於控制此通道在照明管道中的角色(環境光,頂點照明,像素點亮等)以及其他一些選項,注意Pass Tag必須位於Pass塊內,與SubShader Tags 區分開。
Pass Tags 有以下內容:

標籤 描述
LightMode 定義了Pass在照明管道中的角色,LightMode標記值可以能爲:
Always:始終渲染,沒有燈光
ForwardBase:用於正向渲染,環境光,主方向光,頂點/SH燈和光照貼圖
ForwardAdd:用於向前渲染,應用添加的每像素光,每個光通過一次
Deferred:用於延遲渲染,g-buffer渲染。
ShadowCaster:將對象深度渲染到陰影貼圖或深度紋理中。
MotionVectors:用於計算每個對象的運動矢量。
PrepassBase:用於舊版延遲光照,渲染法線和鏡面反射指數。
PrepassFinal:用於傳統延遲光照,通過組合紋理,光照和發射來渲染最終顏色。
Vertex:當對象未進行光照貼圖時,用於傳統的頂點渲染,應用所有頂點燈
VertexLMRGBM:在,在當lighttmap是在RGBM編碼平臺上時,對象進行光照貼圖時用於舊版VertexLit渲染(PC和控制檯)
VertexLM:在光照貼圖採用雙LDR編碼平臺上時,對象進行光照貼圖時用於舊版Vertex Lit渲染
PassFlags 渲染管道傳遞什麼數據給Pass,可以使用這個標籤來進行控制,值未空格分隔的標誌名稱,目前支持的標誌有:
OnlyDirectional:在ForwardBase傳遞類型中使用時,只有主方向和ambient/lightprobe數據纔會傳遞到着色器,意味着非重要關源的數據不會傳遞到當點光或球面諧波着色器變量中
RequireOptions 只有在滿足某些外部條件時,纔會被渲染,值時一個空格分隔選項的字符串,目前有:
ShoftVegetation:在Quality Settings中設置Soft Vegetation 時纔會渲染

[RenderSetup]:
設置圖形硬件的各種狀態,例如,是否打開Alpha混合,是否使用深度測試等。
剔除和深度測試
剔除時一種優化操作,它會將觀察者看不到的面不進行渲染。
深度測試確保僅渲染在場景中繪製最近的面。
Cull:設置多邊形剔除模式,用於控制多邊形的哪一邊應該被剔除。

語法 Cull Back|Front|Off
Back 背面剔除(默認)
Front 正面剔除
OFF 禁用剔除,繪製所有面

ZTEST:設置深度緩衝測試模式,就是如何進行深度測試,默認爲LEqual。

語法 ZTest Less|Greater|LEqual|GEqual|Equal|NotEqual|Always
Less 小於
Greater 大於
LEqual 小於等於
GEqual 大於等於
Equal 等於
NotEqual 不等於
Always 總是寫入

ZWrite:設置深度緩衝區寫入模式,用於控制是否將此對象的像素寫入深度緩衝區,如果繪製不透明對象,應該設置爲On,如果繪製半透明效果,應該設置爲Off。

語法 ZWrite On|Off
On 開啓深度寫入(默認)
Off 關閉深度寫入

Offset:設置Z緩衝深度偏移。

語法 Offset Factor,Units
Factor 因子,相對於多邊形的x、y縮放最大z斜率
Units 單位,縮放最小可分辨深度緩衝值
每一個Fragment的深度值都會增加 offset=(mfactor)+(runits)的偏移量,m是多邊形的深度斜率中最大值,r是能產生在窗口座標系的深度值中可分辨的差異最小值,一個大於0的offset會把模型往後推,小於0的offset會把模型拉近。資料
深度:該像素點在3D世界中距離攝像機的距離,離攝像機越遠值(Z值)越大。
深度緩存:存儲者準備要繪製在屏幕上的像素點的深度值。開啓深度寫入後,在繪製每個像素之前,會把該像素的深度值和深度緩存中的值進行比較,如果新像素深度值<=(根據設置的ZTest模式進行比較,默認爲<=)深度緩存深度值,則新像素會替換原像素,否則會丟棄顏色值和深度(未通過深度測試)。
深度測試:默認就是將要繪製的新像素與深度緩衝區中對應位置的z值根據設置的模式進行比較,默認爲<=,結果爲true,則替換原有深度,並在顏色緩衝中替換顏色,否則丟棄該像素的顏色和深度。

Blending(混合)
在所有着色器執行完並且所有紋理都已應用之後,像素將被寫入到屏幕,Blend命令會控制他們如何與已存在內容進行組合

語法
Blend Off 關閉混合(默認)
Blend SrcFactor DstFactor 配置並啓用混合,生成的顏色乘以ScrFactor,屏幕上已有的顏色乘以DstFactor,兩者相加
Blend SrcFactor DstFactor,ScrFactorA DstFactorA 與上面相同,但使用不同的因子來混合alpha通道
BlendOp Op 不將混合顏色添加到一起,對它們執行不同的操作
BlendOp OpColor,OpAlpha 與上面相同,但對顏色(RGB)和aplha(A)使用不同的混合操作

在使用多渲染目標(MRT)進行渲染時,上面的語法爲所有的渲染目標設置相同的混合模式,下面的語法可以爲各個渲染目標設置不同的混合模式。其中N爲渲染目標索引(0-7)。此功能適用於大多數現代API/GPU(DX11/12,GLCORE,METAL,PS4)

語法
Blend N SrcFactor DstFactor
Blend N SrcFactor DstFactor,ScrFactorA DstFactorA
BlendOp N Op
BlendOp N OpColor,OpAlpha
混合操作
Add 原+目標
Sub 原-目標
RevSub 目標-原
Min 從原和目標中選擇最小的
Max 從原和目標中選擇最大的
LogicalClear 邏輯運算:清除(0) 僅限DX11.1
LogicalSet 邏輯運算:設置(1) 僅限DX11.1
LogicalCopy 邏輯運算:複製 僅限DX11.1
LogicalCopyInverted 邏輯運算:複製並反轉(!s) 僅限DX11.1
LogicalNoop 邏輯運算:Noop(d) 僅限DX11.1
Logicalnvert 邏輯運算:反轉(!d) 僅限DX11.1
LogicalAnd 邏輯運算:和(s&d) 僅限DX11.1
LogicalNand 邏輯運算:Nand(s&d) 僅限DX11.1
LogicalOr 邏輯運算:或(s豎d) 僅限DX11.1
LogicalNor 邏輯運算:Nor(sd)僅限DX11.1
LogicalXor 邏輯運算:Xor(s^d) 僅限DX11.1
LogicalEquiv 邏輯運算:等價!(s^D) 僅限DX11.1 僅限DX11.1
LogicalAndReverse 邏輯運算:反轉和(s&!d) 僅限DX11.1
LogicalAndInverted 邏輯運算:反轉和(! s&d) 僅限DX11.1
LogicalOrReverse 邏輯運算:反轉或(s豎!d) 僅限DX11.1
LogicalOrInverted 邏輯運算:反轉或(! s豎d) 僅限DX11.1
豎 代表 |

Blend Factors(混合因素)
以下所有屬性對Blend命令中的SrcFactor和DstFactor都有效,Source指的時計算除的顏色,Destination是屏幕上已有的顏色。如果BlendOp使用邏輯運算,則忽略混合因子

One 乘以顏色值(1.0,1.0,1.0,1.0)
Zero 乘以顏色值(0,0,0,0)
SrcColor 乘以Source顏色值
SrcAlpha 乘以Source的alpha值
DstColro 乘以Destination顏色值
DstAlpha 乘以Destination的alpha值
OneMinusSrcColor 乘以(1-Source顏色的值)
OneMinusSrcAlpha 乘以(1-Source的alpha值)
OneMinusDstColor 乘以(1-Destination的顏色值)
OneMinusDstAlpha 乘以(1-Destination的alpha值)

常見的混合類型:

傳統透明度 Blend SrcAlpha OneMinusSrcAlpha
預乘透明度 Blend One OneMinusSrcAlpha
疊加 Blend One One
軟疊加 Blend OneMinusDstColor One
正片疊底 Blend DstColor Zero
Blend DstColor SrcColor

AlphaToMask On:打開alpha-to-coverage,在使用MSAA(多重採樣反走樣)時,alpha-to-coverage會根據像素Shader結果alpha值修改多重採樣覆蓋率。通常用於比常規alpah-test更小的輪廓,例如,對植被和其他經過alpha測試的着色器非常有用。

Stencil Test(模板測試)
模板緩衝區可以爲屏幕上的每個像素點保存一個無符號整數值(通常是每像素8位整數),通過一些比較來改變當前像素區域模板緩衝的值,從而改變深度關係。
語法格式:

Stencil
{
	[Command]
	[Command...]
}

Command 內容包含:
Ref:參考值,當參數允許賦值時,會把參考值賦給當前像素。
語法:

Ref value

ReadMask:8位掩碼,取值範圍0-255,對當前參考值和已有值進行mask操作,默認值255,一般不用。
語法:

ReadMask readMask

WriteMask:8位掩碼,取值0-255,寫入Mask時使用,與其他寫掩碼一樣,它指定模板緩衝區的哪些位將受寫入影響(0不會影響任何位,也不會寫入0),默認值255.
語法:

WriteMask writeMask

Comp:比較方法,那Ref值與當前像素緩存上的值進行比較,默認值always

語法 Comp Greater|GEqual|Less|LEqual|Equal|NotEqual|Aways|Never
Greater 大於
GEqual 大於等於
Less 小於
LEqual 小於等於
Equal 等於
NotEqual 不等於
Always 永遠通過
Never 永遠不通過

Pass:當模板測試與深度測試都通過時,如何進行處理
Fail:當模板測試與深度測試都失敗時,如何進行處理
ZFail:當模板測試通過而深度測試失敗時,如何進行處理
Pass,Fail,ZFail 都屬於Stencil操作,參數一樣。

語法:Pass Pass stencilOperation
語法:Fail Fail stencilOperation
語法:ZFail ZFail stencilOperation
Keep 保持(不把參考值賦值上去,直接不管)
Zero 歸零
Replace 替換(參考值替代原有值)
IncrSat 值增加1,如果到255,就不再增加
DecrSat 值減少1,如果到0,就不再減
Invert 反轉所有位,如1就會變成254
IncrWrap 值增加1,如果到255,則變爲0
DecrWrap 值減少1,如果到0,則變爲255
Comp,Pass,Fail和ZFail將用於前面的幾何體,除非指定了Cull Front,這種情況下,它時面向後面的幾何體,可以通過定義CompFront,PassFront,
FailFront,ZFailFront以及CompBack,PassBack,FailBack,ZFailBack來明確指定雙面模板狀態。
在延遲渲染路徑中,模板功能在某種程度上受到限制,因爲在基本傳遞和光照傳遞期間,模板緩衝區在用於其他目的,在這兩個階段中,着色器中定義的模塊狀
態將本忽略,並且僅在最終傳遞期間考慮。因此,不可能基於模板測試來屏蔽這些對象,但他們仍然可以修改緩衝區內容,以邊在後續幀中呈現的對象使用。在
延遲路徑之後的向前渲染路徑中渲染的對象將再次正常設置其模板狀態。
延遲渲染路徑使用模板緩衝區的三個最高爲,最多四個最高爲,取決於場景中使用的光淹模層數,可以使用WriteMask Clear 或使用
Camera.clearStencilAfterLightingPass情節模板緩衝區(光照通過後)。

Name(Pass名稱)
設置當前Pass的名稱,以便UsePass命令引用。注意,在Unity內部會將name變爲大寫
語法:

Name “PassName”

Legacy Lighting(遺留照明)
頂點光照是爲每個頂點計算的標準Direct3D/OpenGL光照模型,使用Lighting On 指令可以打開,受Material,ColorMaterial和SeparateSpecular命令的影響。

在頂點/片段着色器中,Materal和Lighting 命令是不起作用的。

任何幾何體渲染的第一個效果就是"頂點着色和光照",在頂點級別上進行運算,並計算在應用紋理之前使用的基色。
Color:將對象設置爲純色。可以是括號中的4個RGBA顏色值,或方括號中的顏色屬性名稱。
語法:

Color (r,g,b,a)|[att name]

Linght:開啓或關閉照明,如果關閉了照明會直接從Color中獲取顏色。
語法:

LightingOn|Off

Material:定義對象的材質屬性。如果未開啓Lighting,則此模塊是不生效的(Lighting On 此模塊纔會其作用)。

語法: Material {Material Block}
Diffuse 漫反射顏色,也是對象的基本色
Ambient 環境色,對象在Lighting Window中設置的環境光照射時所具有的顏色
Specular 高光顏色
Shininess 高管銳度,介於0-1之間,達到1時,會得到一個微小的亮點
Emission 自發顏色
計算公式 Ambient*Ambient Intensity+(Light Color * Diffuse + Light Color * Specular)+emission
Ambient Intensity 值獲取的是在Lighting Window中設置的值

SeparateSpecular:開啓後,光高不受紋理影響,僅在Lighting On時生效。
語法:

SeparateSpecular On|Off

ColorMaterial:使用頂點顏色體態設置中的顏色

語法 ColorMaterial AmbientAndDiffuse|Emission
AmbientAndDiffuse 替換漫反射值和環境光
Emission 替換自發光

Legacy Texture(遺留紋理)
在計算頂點燈光之後,就會應用紋理。
在使用頂點/片段着色器時,SetTexture 命令無法使用
在Pass中,可以使用多個SetTexture命令,所有的命令將按照順序的方式進行應用,就像圖層一樣。注意,SetTexture命令必須放在Pass的末尾處

語法 SetTexture [AttributeName] {Texture Block}
AttributeName 必須時定義的紋理屬性名稱
Texture Block 控制紋理的應用方式,主要有combine和constantcolor兩個命令
combine 合併控制
combine src1*src2:src1與src2相乘,結果比任以輸入更暗
combine src1+src2:src1加上src2,結果更亮
combine src1 - src2:src1減去src2
combine src1 lerp(src2) src3:使用src2的alpha在src3和src1之間進行插值,當alpha爲1時使用src1,當alpha爲0時,使用src3
combine src1*src2+src3:將src1和src2的alpha分量相乘,然後添加src3
所有的src屬性都可以是previous,constant,primary或texutre之一,Previous:前一個SetTexture的結果,Primary:光照計算的結果或綁定的頂點顏色,texture:SetTexture中指定的紋理,Constant:使用ConstantColor指定的顏色
ConstantColor 定義在combine中使用的常量顏色,可以設置4位數得顏色(例如:(1,1,1,1))或者方括號內得顏色屬性名(例如:[name])
如果SeparateSpecular鏡面顏色的計算將在組合後進行計算,同時也是VertexLit着色的默認行爲。
執行頂點/片段着色器的現代顯卡(shader model2.0或移動端OpenGL ES 2.0),通常支持所有的SetTexutre模式和至少4個紋理階段(其中許多支持8個),如果是非常就得硬件(2003年之前PC,或移動設備使用iphone3GS之前),可能只支持兩個。

Legacy Alpha(遺留 透明度測試)
alpha測試是拒絕像素寫入屏幕得最後機會。在計算出最終輸出顏色之後,顏色可以選擇性得將alpha值與固定值進行比較,如果測試失敗,則不會將像素寫入顯示器(僅渲染alpha值在特定範圍內得像素)。

使用頂點/片段着色器時,AlphaTest命令無效,大多數平臺可以使用HLSL clip()函數完成alpha測試。

語法:

AlphaTest Off

語法 AlphaTest comparison AlphaValue
AlphaValue 測試值,可以是0-1得浮點數,或float或range屬性的變量應用(例如:[name])
comparison 比較符,與alphavalue進行比較,通過則渲染,否則不渲染
Greater:大於
GEqual:大於等於
Less:小於
LEqual:小於等於
Equal:等於
NotEqual:不等於
Always:總是渲染,等價於AlphaTest Off
Never:不渲染任何像素

Legacy Fog(遺留 霧)
根據與相機的距離,霧化將產生的像素的顏色向下混合爲恆定的顏色。霧化不會修改混合像素的alpha值,只會修改RGB值。

語法 Fog {Fog Commands}
Commands 包含的指令如下:
Mode Mode Off|Global|Linear|Exp|Exp2
定義霧的模式,默認爲全局,根據“渲染設置”中是否啓用了霧,會將其轉換爲“Off”或“Exp2”
Color Color ColorValue
設置霧的顏色
Density Density FloatValue
設置霧的密度(指數)
Range FloatValue,FloatValue
設置線性霧的近距離和遠距離
默認霧的設置基於Lighting Window中的設置。
如果使用頂點/片段着色器,Fog 指令依然有作用,當平臺上沒有霧功能,Untiy將在運行時修補着色器以支持所有請求的霧模式。

Legacy BingdChannels(遺留 綁定通道)
該指令可以指定頂點數據如何映射到圖形硬件。默認情況下,Unity會自動計算綁定,但是在某些情況下,需要使用自定義綁定。

在頂點/片段着色器中無法使用,由頂點/片段着色器輸入來進行控制。
語法 BindChannels{Bind “source”,target}
source 可以是以下之一:
Vertex:頂點位置
Normal:頂點法線
Tangent:頂點切線
Texcoord:主UV座標
Texcoord1:輔UV座標
Color:頂點顏色
Target 可以是以下之一:
Vertex:頂點位置
Normal:頂點法線
Tangent:頂點切線
Texcoord0,Texcoord1,…:相應紋理階段的紋理座標
Texcoord:所有紋理階段的紋理座標
Color:頂點顏色
Untiy對那些source可以映射到target做了一些限制,source和目標必須匹配。比如Bind “Vertex”,vertex或Bind“texcoord”,texcoord

UsePass
使用UsePass可以使用現由的Pass通道,以減少代碼重複。
語法:

UsePass "Path/NAME"

注意:Pass名稱必須是大寫

GrabPass
GrabPass 是一種特殊的渲染通道,它可以抓取屏幕中的對象繪製到紋理當中去,以便執行更高級的圖像效果。
語法:

語法1 GrabPass{}
將當前屏幕內容抓取到紋理中,而可以通過_GrabTexture名稱進一步傳遞紋理。注意:這種形式的抓取過程將爲每個使用它的對象執行屏幕抓取操作
語法2 GrabPass{“_TextureName”}
將當前屏幕內容抓取到紋理中,但對於使用給定紋理名稱的第一對象僅執行一次。當場景中有多個對象使用GrabPass時,這是一種更高效的方法。可使用“_TextureName”獲取紋理
GrabPass可以使用Name和Tags命令。

FallBack
如果沒有任何SubShader可以在當前硬件上運行,會嘗試使用指定的默認着色器進行渲染。
語法:

Fallback "name"

CustomEditor
可以爲着色器定義編輯顯示。Unity將尋找一個使用此名稱擴展的ShaderGUI類。
語法:

CustomEditor "name"

Category指令
可以將任何命令進行邏輯分組,形成一個fen類(Category),例如,一個着色器可能有多個子着色器,並且每個着色器都需要關閉霧、設置Blend等,可使用Category:

Shader "example"
{
	Fog{Mode Off}
	Blend One One
	SubShader
	{
		//...
	}
	SubShader
	{
		//...
	}
	//...
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章