UnityShader基礎整理

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 blending
  • Blend One OneMinusSrcAlpha
    premultiplied alpha blending
  • Blend One One
    additive
  • Blend SrcAlpha One
    additive blending
  • Blend OneMinusDstColor One
    soft additive
  • Blend DstColor Zero
    multiplicative
  • Blend DstColor SrcColor
    2x multiplicative
  • Blend Zero SrcAlpha
    multiplicative blending for attenuation by the fragment’s alpha

片段着色器中計算出來的顏色稱之爲 “源顏色”,幀緩存中對應的像素已經存在的顏色叫做“目標顏色”

混合公式
float4 result = SrcFactor * fragment_output + DstFactor * pixel_color;

  • Zero
    0

  • One
    1

  • SrcColor
    源顏色

  • SrcAlpha
    源alpha

  • DstColor
    目標顏色

  • DstAlpha
    目標Alpha

  • OneMinusSrcColor
    (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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章