Unity渲染管線基礎整理
渲染管線
管線流程圖
Unity Shader中的Tags
Queue:
Tag | value |
---|---|
Background | 1000 |
Geometry | 2000 |
AlphaTest | 2450 |
Transparent | 3000 |
Overlay | 4000 |
相同Queue的物體,unity會根據物體與攝像機的距離來決定渲染順序
RenderType:
- Opaque: 用於大多數着色器(法線着色器、自發光着色器、反射着色器以及地形的着色器)。
- Transparent:用於半透明着色器(透明着色器、粒子着色器、字體着色器、地形額外通道的着色器)。
- TransparentCutout: 蒙皮透明着色器(Transparent Cutout,兩個通道的植被着色器)。
- Background: Skybox shaders. 天空盒着色器。
- Overlay: GUITexture, Halo, Flare shaders. 光暈着色器、閃光着色器。
- TreeOpaque: terrain engine tree bark. 地形引擎中的樹皮。
- TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的樹葉。
- TreeBillboard: terrain engine billboarded trees. 地形引擎中的廣告牌樹。
- Grass: terrain engine grass. 地形引擎中的草。
- GrassBillboard: terrain engine billboarded grass. 地形引擎何中的廣告牌草。
IgnoreProjector
值爲”true”時,表示不接受Projector組件的投影
ForceNoShadowCasting
值爲”true”時,表示不接受陰影。
LightMode
對應PlayerSetting的或Camera中設置的RenderPath使用
Deferred Lighting 會準確如實地渲染光照和陰影,移動設備是不支持的。
Forward Rendering 是一種基於shader的渲染路徑。它支持每個像素的光照及平行光(directional light)的實時陰影
Vertex Lit 最低光照精確度的渲染路徑,不支持實時陰影
- ForwardBase 只對1個有效燈光執行一次
- ForwardAdd 對除了ForwardBase用的那個燈光外的所有有效燈光都執行1次,所以會被執行多次
- Always 永遠都渲染,但不處理光照
- ShadowCaster 渲染產生陰影的物體
- ShadowCollector 收集物體陰影到屏幕座標Buff裏
深度測試和深度緩衝區
ZBuff:深度緩衝
深度緩衝區
ZTest:深度測試
ZTest 可取值爲:
- Greater
- GEqual
- Less
- LEqual
- Equal
- NotEqual
- Always
- Never
- Off
默認是 LEqual,ZTest Off 等同於 ZTest Always。
ZWrite:深度寫入
ZWrite 可取值爲:On , Off,
默認是 On。
Alpha測試
AlphaTest
1.頂點或片元
clip (o.Alpha - _Cutoff);
2.固定管線
AlphaTest comparison AlphaValue
- Greater
- GEqual
- Less
- LEqual
- Equal
- NotEqual
- Always
- Never
混合
Blend SrcAlpha OneMinusSrcAlpha
alpha blendingBlend One OneMinusSrcAlpha
premultiplied alpha blendingBlend One One
additiveBlend SrcAlpha One
additive blendingBlend OneMinusDstColor One
soft additiveBlend DstColor Zero
multiplicativeBlend DstColor SrcColor
2x multiplicativeBlend Zero SrcAlpha
multiplicative blending for attenuation by the fragment’s alpha
片段着色器中計算出來的顏色稱之爲 “源顏色”,幀緩存中對應的像素已經存在的顏色叫做“目標顏色”
混合公式
float4 result = SrcFactor * fragment_output + DstFactor * pixel_color;
Zero
0One
1SrcColor
源顏色SrcAlpha
源alphaDstColor
目標顏色DstAlpha
目標AlphaOneMinusSrcColor
(1-源顏色)OneMinusSrcAlpha
(1-源Alpha)OneMinusDstColor
(1-目標顏色)OneMinusDstAlpha
(1-目標Alpha)
模版測試和模版緩衝區
在渲染的過程中,可以用模版緩衝區中的一個值與一個預先設定的參考值相比較,根據比較的結果來決定是否更新相應的像素點的顏色值。這個比較的過程被稱爲模板測試。模板測試發生在透明度測試(alpha test)之後,深度測試(depth test)之前。如果模板測試通過,則相應的像素點更新,否則不更新
stencil{
Ref referenceValue //參考值
ReadMask readMask
WriteMask writeMask
Comp comparisonFunction
Pass stencilOperation
Fail stencilOperation
ZFail stencilOperation
}
stencil完整語法
測試公式
if(referenceValue&readMask comparisonFunction stencilBufferValue&readMask)
通過像素
else
拋棄像素
- comparisonFunction
comparisonFunction | 通過測試條件 |
---|---|
Greater | buffvalue > referenceValue |
GEqual | buffvalue >= referenceValue |
Less | buffvalue < referenceValue |
LEqual | buffvalue <= referenceValue |
Equal | buffvalue == referenceValue |
NotEqual | buffvalue != referenceValue |
Always | 總是能 |
Never | 總不能 |
* stencilOperation
stencilOperation | 功能 |
---|---|
Keep | buffvalue 不變 |
Zero | buffvalue 值變爲0 |
Replace | buffvalue = referenceValue |
IncrSat | buffvalue ++ 超過255不溢出 |
DecrSat | buffvalue – 超過0不溢出 |
Invert | buffvalue 按位取反 |
IncrWrap | buffvalue ++ 超過255溢出爲0 |
DecrWrap | buffvalue – 超過0溢出爲255 |