1. 程式人生 > >Unity Shader 屬性及標籤

Unity Shader 屬性及標籤

一、渲染流水線

應用階段、幾何階段、光柵化階段
1、應用階段(cpu實現)
(1)把資料載入到視訊記憶體中 例如:頂點的位置資訊、法線方向、頂點顏色、紋理座標
(2)設定渲染狀態
(3)呼叫DrawCall
2、幾何階段(gpu實現)
(1)頂點著色器:實現頂點的空間變換、頂點著色等 <完全可程式設計>
(2)曲面著色器:可選著色器,用於細分圖元
(3)幾何著色器:可選著色器,被用於執行圖元的著色操作,或者被用於產生更多的圖元
(4)裁剪:將不在攝像機視野內的頂點裁減掉,並剔除某些三角形的面片 <可配置> 例如:可以使用自定義的裁剪平面來配置裁剪區域,也可以通過指令控制裁剪 三角圖元的正面或者背面
(5)螢幕對映:負責把每個圖元的座標轉化到螢幕座標中
3、光柵化階段(gpu實現)
(1)三角形設定:計算三角網格資料,得到三角網格對畫素的覆蓋情況,即計算三角形每條邊上的畫素座標
(2)三角形遍歷:檢查每個畫素是否被一個三角形覆蓋,如果覆蓋的話,生成一個片元
(3)片元著色器:完成重要的渲染技術 <完全可程式設計>
(4)逐片元操作:決定片元的可見性 <可配置>(模板測試、深度測試等 注:將深度測試提到片元著色器之前的技術成為Early-Z技術)
4、渲染繪圖管線流程(3D物體=>2D圖片)
(1)頂點變化:通過一系列的座標系轉換,將模型的頂點在攝像機前進行位移,並最終投影到攝像機的投影螢幕上。 這一階段包括頂點的座標變換、逐頂點霧化、材質屬性和光照屬性處理。
(2)面處理:面的的組裝、擷取和剔除(背面剔除、視錐剔除、遮擋剔除)
(3)光柵化:將以向量為基本結構的面轉換成一個個點陣形式的畫素
(4)畫素處理:對每個畫素區域進行著色、對畫素貼上貼圖、形成最終的畫面

二、Sharder 基本結構

1、屬性 Properties
屬性名字(“在檢視面板中顯示的名字”,屬性型別)=預設值

_Int("Int",int) = 1
_Float("Float",float) = 1.0
_Range("Range",range(0.0,1.0)) = 0.1
_Color("Color",color) = (1,1,1,1)
_Vector("Vector",vector) = (1,1,1,1)
_2DTexture1("2DTexture1",2D) = "White"{}
_Rect("Rect",rect) = ""{}
_3DTexture("3DTuxture"
,3D) = ""{} _Cube("Cube",cube) = ""{}

2、SubShader
(1)Tags
A、Queue
Background 1000 這個佇列被最先渲染。它被用於skyboxes等。
Geometry 2000 是這是預設的渲染佇列。它被用於絕大多數物件。不透明幾何體使用該佇列。
AlphaTest 2450 通道檢查的幾何體使用該佇列。它和Geometry佇列不同,對於在所有立體物體繪製後渲染的通道檢查的物件,它更有效。
Transparent 3000 該渲染佇列在Geometry和AlphaTest佇列後被渲染。任何通道混合的(也就是說,那些不寫入深度快取的Shaders)物件使用該佇列, 例如玻璃和粒子效果。
Overlay 4000 該渲染佇列是為覆蓋物效果服務的。任何最後被渲染的物件使用該佇列,例如鏡頭光暈。

B、RenderType(unity內建的<也可以自定義>)
Opaque 用於大多數著色器(法線著色器、自發光著色器、反射著色器以及地形的著色器)。
Transparent 用於半透明著色器(透明著色器、粒子著色器、字型著色器、地形額外通道的著色器)。
TransparentCutout 用於透明帶鏤空著色器
Background 天空盒著色器。
Overlay GUITexture, Halo(光暈), Flare shaders.光暈著色器、閃光著色器。
TreeOpaque 地形引擎中的樹皮
TreeTransparentCutout 地形引擎中的樹葉。
TreeBillboard 地形引擎中的廣告牌樹。
Grass 地形引擎中的草。
GrassBillboard 地形引擎何中的廣告牌草。
注:RenderType標籤將shaders分類為多個預定義組,Unity可以在執行時替換符合特定RenderType的所有Shader。Shader更換是在指令碼使用 Camera.RenderWithShader 或 Camera.SetReplacementShader 函式來完成的。這兩個函式均以一個shader和一個replacementTag作為引數。

C、DisableBatching 是否進行批處理
當使用繪製呼叫批處理 Draw Call Batching 時,一些 shaders(主要是做物件空間頂點變形的shader)不工作 - 這是因為批處理將所有幾何轉換為世界空間,因此“物件空間”丟失。

DisableBatching標籤可以用來消除這個問題。 有三個可能的值:
“True”(始終禁用此著色器的批處理)
“False”(不禁用批處理; 這是預設值)
“LODFading”(當LOD衰減活動時禁用批處理;主要用於樹)。

D、ForceNoShadowCasting 是否強制不生成陰影
如果給出了ForceNoShadowCasting標籤並且值為“True”,則使用此subshader渲染的物件將永遠不會投射陰影。 當你在透明物件上使用shader替換,並且你不會繼承來自另一個subshader的陰影傳遞時,這是最有用的。

E、IgnoreProjector 是否忽略投影器投影 如果給定IgnoreProjector標記並且值為“True”,則使用此shader的物件不會受到投影機的影響。 這對半透明象最有用,因為暫時沒有對他們產生投影的比較合適的辦法,那麼直接忽略掉就行了。

F、CanUseSpriteAtlas 是否可以用於精靈圖集 將sprite的sharder效果應用於整個圖集 應該設定為false

G、PreviewType 指material 在inspector預覽應如何顯示材質。 預設情況下,材質顯示為球體,但PreviewType也可以設定為“Plane”
(顯示為2D)或“Skybox”(將顯示為天空盒)。

(2)RenderSetup
A: Cull 設定剔除模式 CullBack、CullFront、CullOff(剔除背面、剔除正面、剔除關閉)
B: ZTest 設定深度測試時使用的函式 ZTest Less/Greater/LEqual/GEqual/Equal/NotEqual/Always
C:ZWrite 設定深度寫入 ZWrite On/Off
D: Blend 設定混合模式 Blend Off /Blend srcFactor targetFactor(Alpha混合)等(命令很多)
E: Lighting 設定光照開關 Lighting On/Off
F:SeparateSpecular 設定高光開關 SeparateSpecular On/Off
G:Fog{} 霧效 Mode Off | Global | Linear | Exp | Exp2 (霧效開關)

(3)Pass語義塊(注意P一定要大寫)

A:Name:
可以在Pass塊中定義該Pass塊的名稱 Name “PassName” 通過這個名稱 可以使用ShaderLab的UsePass命令直接使用其他Unity Shader中的Pass
例如:UsePass “MyShader/PASSNAME” (注:unity 內部會把Pass的名稱轉換成大寫字母表示)

B:Tags:
***LightMode:渲染型別
a:Always 總是渲染,不應用光照。
b:ForwardBase 用於正向渲染,環境主要方向燈和定點光/SH 等的應用
c:ForwardAdd 用於正向渲染,附加的畫素光被應用,每個光照一個pass
d:Deferred 用於延遲光照,渲染法線/鏡面指數。lor function)。
e:ShadowCaster 用於延遲光照,通過結合紋理,光照和自發光渲染最終顏色
f:PrepassBase 用於頂點光照渲染,當物體沒有光照對映時,所有頂點光照被應用
g:PrepassFinal 用於頂點光照渲染,當物體有光照對映的時候使用頂點光照渲染。在平臺上光照對映是 RGBM 編碼
h:Vertex 用於頂點光照渲染,當物體有光照對映的時候使用頂點光照渲染。在平臺上光照對映是double-LDR 編碼(移動平臺,及老式臺式CPU)
i:VertexLMRGBM 將物體當做陰影產生者來渲染
g:VertexLM 為了正向渲染物件的路徑,將物件的陰影收集到螢幕空間緩衝區中。

***RequireOptions:指定當滿足某些條件是才渲染該Pass塊 SoftVegetation

(3)Pass可用的渲染指令
a:Material{} 材質
b:Lighting 光照
c:Cull 裁剪
d:ZTest 深度測試
e:ZWrite 深度快取寫入
f:Fog{} 霧效
g:AlphaTest alpha測試
h:Blend alpha混合
i:Color 顏色
k:ColorMask 顏色遮罩
l:Offset 深度偏移
m:SeparateSpecular 高光顏色
n:ColorMaterial 顏色集