Unity3d 着色器語法(Shader)

本文永久地址:http://www.omuying.com/article/27.aspx,【文章轉載請註明出處!】

Shader "name" { [Properties] Subshaders [Fallback] } 定義了一個着色器。着色器擁有一個 Properties 的列表。着色器包含一個子着色器的列表(SubShaders)。並且至少包含一個(SubShader)。當加載一個着色器時,Unity 將遍歷這個列表,獲取第一個能被用戶機器支持的着色器。如果沒有子着色器被支持,Unity 將嘗試使用降級 Shader(Fallback )。

一、着色器文件中的 Properties 塊定義了這些參數:

1、name ("display name", Range (min, max)) = number:定義浮點數範圍屬性。
2、name ("display name", Color) = (number,number,number,number):定義顏色屬性。
3、name ("display name", 2D) = "name" { options }:定義2D紋理屬性。
4、name ("display name", Rect) = "name" { options }:定義長方形(非2次方)紋理屬性。
5、name ("display name", Cube) = "name" { options }:定義立方貼圖紋理屬性。
6、name ("display name", Float) = number:定義浮點數屬性。
7、name ("display name", Vector) = (number,number,number,number):定義一個四元素的容器(Vector4)屬性。

二、Subshader { [Tags] [CommonState] Passdef [Passdef ...] } 通過可選標籤,通用狀態和一個Pass 定義的列表構成了子着色器。

三、Pass { [Name and Tags] [RenderSetup] [TextureSetup] } 基本通道命令包含一個可選的渲染設置命令的列表和可選的被使用的紋理的列表。

四、Name and tags 名稱和標籤:一個通道能定義它的 Name 和任意數量的Tags(用於向渲染引擎傳遞通道的意圖的名稱/值的字符串)。

五、Render Setup 渲染設置:通道設定顯示硬件的各種狀態。這些命令如下:

1、Material { Material Block }:定義一個使用頂點光照管線的材質。
2、Lighting On | Off:開啓或關閉頂點光照。
3、Cull Back | Front | Off: 設置多邊形剔除模式。
4、ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always):設置深度測試模式。
5、ZWrite On | Off:設置深度寫模式。
6、Fog { Fog Block }:設置霧參數。
7、AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue:開啓 alpha 測試。
8、Blend SourceBlendMode DestBlendMode:設置 alpha 混合模式。
9、Color Color value:設置當頂點光照關閉時所使用的顏色。
10、ColorMask RGB | A | 0 | any combination of R, G, B, A:設置顏色寫遮罩。設置爲0將關閉所有顏色通道的渲染。
11、Offset OffsetFactor , OffsetUnits:設置深度偏移。
12、SeparateSpecular On | Off:開啓或關閉頂點光照相關的平行高光顏色.
13、ColorMaterial AmbientAndDiffuse | Emission:當計算頂點光照時使用每頂點顏色。

六、Texture Setup 紋理設置:在完成渲染設定後,你能指定一定數量的紋理和當使用 SetTexture 命令時所採用的混合模式:

1、SetTexture texture property { [Combine options] }:紋理設置 配置了 固定函數多紋理管線,當自定義fragment shaders 被使用時,將忽略這個設置。
2、Per-pixel Lighting:每像素光照。每像素光照管線通過多次通道渲染對象來完成。Unity渲染對象一次來獲取陰影色和任何頂點光照。然後再在額外的並行通道中渲染出每像素光照的效果。
3、Per-vertex Lighting:每頂點光照。每頂點光照是標準的Direct3D/OpenGL光照模式,通過計算每個頂點的光照來完成。Lighting on命令開啓光照。光照被材質塊,顏色材質和平行高光命令所影響。

七、有幾個特殊的通道能用於反覆利用普通功能或是實現幾種高端的特效:

1、UsePass:包含來自其他着色器的通道。
2、GrabPass:捕獲屏幕到一個紋理,通常使用在靠後的通道中。

八、頂點顏色和燈光(Color, Material, Lighting)是對任何已渲染過後的幾何體所添加的第一步效果。這個操作處在頂點級別,用於計算在紋理被應用之前被使用的基礎顏色。頂層命令控制是否採用固定函數光照,和一些控制選項,細節如下:

1、Color Color:設定對象的純色。顏色即可以是括號中的四值(RGBA),也可以是被方框包圍的顏色屬性名。
2、Material { Material Block }:材質塊被用於定義對象的材質屬性。
3、Lighting On | Off:定義材質塊中的設定是否有效,你必須使用 Lighting On 命令開啓光照,而顏色則通過 Color 命令直接給出。
4、SeparateSpecular On | Off:這個命令會添加高光光照到着色器通道的末尾,因此貼圖對高光沒有影響。只在光照開啓時有效。
5、ColorMaterial AmbientAndDiffuse | Emission:使用每頂點的顏色替代材質中的顏色集。AmbientAndDiffuse 替代材質的陰影光和漫反射值;Emission 替代材質中的光發射值。

九、Material Block 材質塊,包含材質如何和光線產生作用的設定。這些屬性都是可以被忽略的,默認爲值都被設定爲黑色(不產生作用):

1、Diffuse Color:漫反射顏色構成。這是對象的基本顏色。
2、Ambient Color:環境色顏色構成.這是當對象被RenderSettings. 中設定的環境色所照射時對象所表現的顏色。
3、Specular Color:對象反射高光的顏色。
4、Shininess Number:加亮時的光澤度,在0和1之間。0的時候你會發現更大的高亮也看起來像漫反射光照,1的時候你會獲得一個細微的亮斑。
5、Emission Color:自發光顏色,當不被任何光照所照到時,對象的顏色。
6、最終的計算效果是:Ambient * RenderSettings ambient setting + (Light Color * Diffuse + Light Color * Specular) + Emission。

十、剔除(Culling)是一種通過避免渲染背對觀察者的幾何體面來提高性能的優化措施。所有幾何體都包含正面和反面。剔除基於大多數對象都是封閉的事實;如果你有一個立方體,你不會看到背離你的那一面(總是隻有一面在你的前方),因此我們不需要繪製出背面。因此也被稱做背面剔除。另一個使得渲染看起來正確的是深度測試(Depth Testing)。深度測試確保只有場景內的對象的最靠近的表面參與繪製。

1、Cull Back(不繪製背離觀察者的幾何體面)| Front(不繪製面向觀察者的幾何體面,用於由內自外的旋轉對象) | Off(顯示所有面,用於特殊效果):控制幾何體的那一面會被剔除(不繪製) 
2、ZWrite On | Off:控制是否將來之對象的像素寫入深度緩衝(默認開啓),如果你正繪製純色物體,將此項打開。如果你正繪製半透明效果,關閉深度緩衝。
3、ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always:深度測試如何執行。缺省是LEqual (繪製和存在的對象一致或是在其中的對象;隱藏他們背後的對象)
4、Offset Factor , Units:允許你定義用兩個參數深度偏移。因子和單位。Factor 縮放Z的最大斜率,幾何體的X和Y也一樣,units縮放可計算的深度緩衝值。這允許你迫使一個幾何體繪製在另一個的上層,儘管他們實際上是在同一個位置。例如偏移0,-1使得靠近攝像機的幾何體忽略幾何體的斜率,而偏移-1,-1則會幾何體在一個幾乎擦過的角度被觀察使看起來更近些。

十一、紋理(Texturing)在基本的頂點光照被計算後被應用。在着色器中通過 SetTexture 命令來完成。SetTexture 命令在片面程序被使用時不會生效;這種模式下像素操作被完全描述在着色器中。材質貼圖可以用來做老風格的混合器效果。你能在一個通道中使用多個SetTexture 命令 - 所有紋理被順序的應用,如同繪畫程序中的層一樣。SetTexture 命令必須放置在通道的末尾。

十二、SetTexture [TexturePropertyName] { Texture Block }:分配一個紋理,TextureName 必須定義爲一個紋理屬性。如何應用紋理被定義在 TextrueBlock 中。紋理塊控制紋理如何被應用。在紋理塊中能執行3種命令:合併,矩陣和不變色。

十三、紋理塊合併(Combine)命令:

1、combine src1 * src2:將源1和源2的元素相乘。結果會比單獨輸出任何一個都要暗。
2、combine src1 + src2:將將源1和源2的元素相加。結果會比單獨輸出任何一個都要亮。
3、combine src1 - src2:源1減去源2。
4、combine src1 +- src2:先相加,然後減去0.5(添加了一個符號)。
5、combine src1 lerp (src2) src3:使用源2的透明度通道值在源3和源1中進行差值,注意差值是反向的:當透明度值是1是使用源1,透明度爲0時使用源3。
6、combine src1 * src2 + src3:源1和源2的透明度相乘,然後加上源3。
7、combine src1 * src2 +- src3:源1和源2的透明度相乘,然後和源3做符號加。
8、combine src1 * src2 - src3:源1和源2的透明度相乘,然後和源3相減。
所有源屬性都可以是 Previous(上一次 SetTexture 的結果)、Constant(被 ConstantColor 定義的顏色)、 Primary(來自光照計算的顏色或是當它綁定時的頂點顏色)、Texture(在 SetTexture 中被定義的紋理的顏色)其中的一個。

十四、紋理塊不變色(ConstantColor)命令:

1、ConstantColor color:定義在combine命令中能被使用的不變顏色。

十五、紋理塊矩陣(Matrix)命令:

1、matrix [MatrixPropertyName]:使用給定矩陣變換紋理座標。

十六、霧(Fog)參數用於霧命令控制。霧化是通過混合已生成的像素的顏色和基於到鏡頭的距離來確定的一個不變色來完成。霧化不會改變已經混合的像素的透明度值,只是改變RGB值。

十七、Fog { Fog Commands }:在大括號中設定霧命令的內容

1、Mode Off | Global | Linear | Exp | Exp2:定義霧模式。缺省是全局的,依據霧在渲染設定中是否打開確定可從無變化到平方值。
2、Color ColorValue:設定霧的顏色。
3、Density FloatValue:以指數的方式 設定霧的密度。
4、Range FloatValue , FloatValue:爲 linear 的霧設定遠近距離。

十八、透明度測試(Alpha testing)是阻止像素被寫到屏幕的最後機會。 在最終渲染出的顏色被計算出來之後,可選擇通過將顏色的透明度值和一個固定值比較。如果比較的結果失敗,像素將不會被寫到顯示輸出中。

1、AlphaTest Off:渲染所有像素(缺省)。
2、AlphaTest Greater(大於)| GEqual(大於等於)| Less(小於)| LEqual(小於等於)| Equal(等於)| NotEqual(不等於)| Always(渲染所有像素)| Never(不渲染任何像素) AlphaValue(一個範圍在0到1之間的浮點值。也可以是一個指向浮點屬性或是範圍屬性的索引,在後一種情況下需要使用標準的方括號寫法標註索引名字,如([變量名])):設定透明度測試只渲染在某一確定範圍內的透明度值的像素。

十九、混合(Blending)被用於製作透明物體。當圖像被渲染時,所有着色器被執行以後,所有貼圖被應用後,像素將被寫到屏幕。通過 Blend 命令控制和已有的圖像合併:

1、Blend Off:關閉混合。
2、Blend SrcFactor DstFactor: 配置並啓動混合。產生的顏色被乘以 SrcFactor,已存在於屏幕的顏色乘以 DstFactor,並且兩者將被疊加在一起。
3、Blend SrcFactor DstFactor, SrcFactorA DstFactorA:同上,但是使用不同的要素來混合 alpha 通道。
4、BlendOp Min | Max | Sub | RevSub:不是添加混合顏色在一起,而是對它們做不同的操作。

二十、以下所有屬性對SrcFactor或DstFactor都可用。Source 指的是被計算的顏色,Destination 是已經在屏幕上的顏色。

1、One:值爲1,使用此設置來讓源(Source)或是目標顏色(Destination)完全的通過。
2、Zero:值爲0,使用此設置來刪除源(Source)或目標值(Destination)。
3、SrcColor:此階段的值是乘以源顏色(Source)的值。
4、SrcAlpha:此階段的值是乘以源(Source)alpha 的值。
5、DstColor:此階段的值是乘以幀緩衝區源顏色(Source)的值。
6、DstAlpha:此階段的值是乘以幀緩衝區源(Source)alpha 的值。
7、OneMinusSrcColor:此階段的值是乘以(1 - 源顏色(Source))。
8、OneMinusSrcAlpha:此階段的值是乘以(1 - 源(Source)alpha)。
9、OneMinusDstColor:此階段的值是乘以(1 - 目標顏色(Destination))。
10、OneMinusDstAlpha:此階段的值是乘以(1 - 目標(Destination)alpha)。

二十一、Tags { "TagName1" = "Value1" "TagName2" = "Value2" }:指定TagName1 的值爲 Value1 ,TagName2 的值爲 Value2 你可以指定很多你喜歡的標籤。通過使用標籤(Pass Tags)來告訴渲染引擎在什麼時候該如何渲染他們所期望的效果。

二十二、LightMode 標籤定義了光照點中的 Pass 任務。可選值如下:

1、Always:總是渲染。沒有光照應用。
2、ForwardBase:用於正向渲染,環境主要方向燈和定點光/SH 等的應用。
3、ForwardAdd:用於正向渲染,附加的像素光被應用,每個光照一個 pass。
4、PrepassBase:用於延遲光照,渲染法線/鏡面指數。
5、PrepassFinal:用於延遲光照,通過結合紋理,光照和自發光渲染最終顏色。
6、Vertex:用於頂點光照渲染,當物體沒有光照映射時,所有頂點光照被應用。
7、VertexLMRGBM:用於頂點光照渲染,當物體有光照映射的時候使用頂點光照渲染。在平臺上光照映射是 RGBM 編碼。
8、VertexLM:用於頂點光照渲染,當物體有光照映射的時候使用頂點光照渲染。在平臺上光照映射是double-LDR 編碼(移動平臺,及老式臺式CPU)。
9、ShadowCaster:將物體當做陰影產生者來渲染。
10、ShadowCollector:爲了正向渲染對象的路徑,將對象的陰影收集到屏幕空間緩衝區中。

二十三、Name "PassName":爲當前通道命名 PassName。一個通道能被賦予一個名字以便UsePass 命令能索引到它。

二十四、BindChannels { Bind "source", target }:允許你指定頂點數據如何映射到顯卡中。

二十五、Source 可以是下面其中一個:

1、Vertex: vertex position 頂點:頂點的位置。
2、Normal: vertex normal 法線:頂點的法線。
3、Tangent: vertex tangent 切線:頂點的切線。
4、Texcoord: primary UV coordinate 主要的UV座標。
5、Texcoord1: secondary UV coordinate 次要的UV座標。
6、Color: per-vertex color 顏色:每個頂點顏色。

二十六、Target 可以是下面其中的一個:

1、Vertex: vertex position 頂點:頂點的位置。
2、Normal: vertex normal 法線:頂點的法線。
3、Tangent: vertex tangent 切線:頂點的切線。
4、Texcoord0, Texcoord1, ...: texture coordinates for corresponding texture stage 各個紋理處理階段的紋理座標。
5、Texcoord: texture coordinates for all texture stages 所有紋理處理階段的紋理座標。
6、Color: vertex color 顏色:頂點顏色。

發佈了54 篇原創文章 · 獲贊 13 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章