一.Tags(標簽)
通過使用tags來告訴渲染引擎在什么時候該如何渲染他們所期望的效果。注意的是,SubShader和Pass兩個地方的Tags的不同.
除了內置標簽被統一,你可以使用你自己的標簽和使用Material.GetTag函數查詢它們。
1.)SubShader Tags
1.”Queue”標簽。定義渲染順序。預制的值為
(1)”Background”。值為1000。
(2)”Geometry”。值為2000。大部分物體在這個隊列。不透明的物體也在這里。這個隊列內部的物體的渲染順序會有進一步的優化(應該是從近到遠,early-z test可以剔除不需經過FS處理的片元)。
(3)”AlphaTest”。值為2450。已進行AlphaTest的物體在這個隊列。 物體都是按空間位置的從遠到近進行渲染。
(4)”Transparent”。值為3000。透明物體。
(5)”Overlay”。值為4000。比如鏡頭光暈。
(6)用戶可以定義任意值,比如”Queue”=”Geometry+10”
天空盒在所有不透明物體和所有透明物體之間渲染.實體先前往后,透明先后往前
- “RenderType”標簽。Unity可以運行時替換符合特定RenderType的所有Shader。Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。Unity內置的RenderType包括:
(1)”Opaque”:絕大部分不透明的物體都使用這個;
(2)”Transparent”:絕大部分透明的物體、包括粒子特效都使用這個;
(3)”Background”:天空盒都使用這個;
(4)”Overlay”:GUI、鏡頭光暈都使用這個;
(5)還有其他可參考Rendering with Replaced Shaders;用戶也可以定義任意自己的RenderType字符串。
3.”ForceNoShadowCasting”,值為”true”時,表示不接受陰影。
4.”IgnoreProjector”,值為”true”時,表示不接受Projector組件的投影。 - "DisableBatching "="True" 關閉了批處理
https://docs.unity3d.com/Manual/SL-SubShaderTags.html
2.)Pass Tags
LightMode 標簽定義了光照觀點中的pass的任務。查閱render pipeline了解更多細節。這些標簽很少手動使用。常用的shader 需要與光照進行互動的Shader寫成表面著色器 然后在去關聯那些細節
除最重要的ForwardBase、ForwardAdd外,這里需額外提醒的Tag取值可包括:
1.Always,永遠都渲染,但不處理光照。
2.ShadowCaster,用于渲染產生陰影的物體。
3.ShadowCollector,用于收集物體陰影到屏幕坐標Buff里。
二.Alpha Test (透明度測試)
Clip(float4 x) 任何給定參數的任何一個分量是負數,舍棄像素
void Clip(float4 x)
{
if(any(x<0))
discard
}
三.Blend(混合)
Blend Off: Turn off blending (this is the default)
Blend SrcFactor DstFactor: 開啟混合,并設定混合因子,源顏色 * SrcFactor + 目標顏色 * DstFactor
Blend SrcFactor DstFactor, SrcFactorA DstFactorA: 和上面的類似,只是使用了不同的混合因子來混合透明通道
BlendOp Op: 取代加,可以選擇不同的混合方式
BlendOp OpColor, OpAlpha: Same as above, but use different blend operation for color (RGB) and alpha (A) channels.
Blend factors 混合因子總共有十種可選類型
One 值為1,使用此因子來讓幀緩沖區源顏色或是目標顏色完全的通過。
zero 值為0,使用此因子來刪除幀緩沖區源顏色或目標顏色的值。
SrcColor 使用此因子為將當前值乘以幀緩沖區源顏色的值
SrcAlpha 使用此因子為將當前值乘以幀緩沖區源顏色Alpha的值。
DstColor 使用此因子為將當前值乘以幀緩沖區目標顏色的值。
DstAlpha 使用此因子為將當前值乘以幀緩沖區目標顏色Alpha分量的值。 OneMinusSrcColor 使用此因子為將當前值乘以(1 -幀緩沖區源顏色值) OneMinusSrcAlpha 使用此因子為將當前值乘以(1 -幀緩沖區源顏色Alpha分量的值) OneMinusDstColor 使用此因子為將當前值乘以(1 –目標顏色值)
OneMinusDstAlpha 使用此因子為將當前值乘以(1 –目標Alpha分量的值)
Blend operations :
Add Add source and destination together.
Sub a - b
RevSub b - a
Min Use the smaller of source and destination.
Max Use the larger of source and destination.
例如:BlendOp Min
https://docs.unity3d.com/Manual/SL-Blend.html
三.ZTest 和ZWrite(深度測試和深度寫入)
ZWrite On | Off 默認是打開狀態,假如深度測試通過,則可以把當前像素的z值寫入深度緩沖,當然也可以不寫入(ZWrite Off).
ZTest ,深度測試;LEqual ,小于等于.即 當前像素的深度值 <= 深度緩沖區,深度測試通過.
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always , ZTest Off 等同于 ZTest Always。Never 像素總是不通過
四.Stencil Buffer&Stencil Test(模板緩沖和模板測試)
stencil與顏色緩沖區和深度緩沖區類似,模板緩沖區可以為屏幕上的每個像素點保存一個無符號整數值(通常的話是個8位整數)。這個值的具體意義視程序的具體應用而定。在渲染的過程中,可以用這個值與一個預先設定的參考值相比較,根據比較的結果來決定是否更新相應的像素點的顏色值。這個比較的過程被稱為模板測試。模板測試發生在透明度測試(alpha test)之后,深度測試(depth test)之前
每個片元都需要通過模板測試和深度測試,才能顯示到屏幕上.
stencil{
Ref referenceValue //設定參考值referenceValue,這個值將用來與模板緩沖中的值進行比較。referenceValue是一個取值范圍位0-255的整數。
ReadMask readMask //設定掩碼值
WriteMask writeMask //寫入模板緩沖時進行掩碼操作
Comp comparisonFunction
Pass stencilOperation
Fail stencilOperation
ZFail stencilOperation
}
if(referenceValue&readMask comparisonFunction stencilBufferValue&readMask)
通過片元
Comp,Pass,Fail 和ZFail將會應用給背面消隱的幾何體(只渲染前面的幾何體),除非Cull Front被指定,在這種情況下就是正面消隱的幾何體(只渲染背面的幾何體)。你也可以精確的指定雙面的模板狀態通過定義CompFront,PassFront,FailFront,ZFailFront(當模型為front-facing geometry使用)和ComBack,PassBack,FailBack,ZFailBack(當模型為back-facing geometry使用)
1.comparisonFunction
Less | Greater | LEqual | GEqual | Equal | NotEqual | Always 和深度測試類似
2.stencilOperation
Keep 保留當前緩沖中的內容,即stencilBufferValue不變。
Zero 將0寫入緩沖,即stencilBufferValue值變為0。
Replace 將參考值寫入緩沖,即將referenceValue賦值給stencilBufferValue。
IncrSat stencilBufferValue加1,如果stencilBufferValue超過255了,那么保留為255,即不大于255。
DecrSat stencilBufferValue減1,如果stencilBufferValue超過為0,那么保留為0,即不小于0。
Invert 將當前模板緩沖值(stencilBufferValue)按位取反
IncrWrap 當前緩沖的值加1,如果緩沖值超過255了,那么變成0,(然后繼續自增)。
DecrWrap 當前緩沖的值減1,如果緩沖值已經為0,那么變成255,(然后繼續自減) 。