Surface Shader 筆記
3.Buffer and Queue
==== Buffer ====
Frame Buffer
機算機的內存結構,用於保存螢幕上出現的每個像素的顏色訊息
Depth Buffer (Z Buffer)
大小和 Frame Buffer一樣,但儲存的是每個像素的深度訊息 (離畫面的遠近)
在像素添加至 Frame Buffer之前會先經過檢查,此像素是否在 Depth Buffer有值
如果有就代表繪製的像素重疊,於是必需將 Frame Buffer的像素替換成深度較淺的那個像素 (離畫面近),並更新 Depth Buffer
在 SubShader中可以使用 ZWrite Off關閉 Depth Buffer的訊息寫入
或在 SubShader pass struct中使用 ZWrite On, ColorMask啟用半透明 Depth Buffer寫入
註: ZWrite, ColorMask 都為非 CG語法
G - Buffer
幾何緩衝區,會在"延遲渲染" 中使用
Stencil Buffer
模板緩衝區,用於進一步控制從場景到 Frame Buffer的像素,可以做出遮罩類的效果
類似Depth Buffer,但可以將所有類型放置緩衝區中,不只有深度
在 SubShader Stencil { } 中
使用 Ref + 數字,在 Stencil Buffer寫入數值,如: 1, 2, -1
使用 Comp + 條件,對 Stencil Buffer中的內容進行判斷,如: 總是 (always), 不等於 (notequal)
使用 Pass + 行為,在判斷後做出行為,如: 替換(replace), Keep(保持)
可以使用屬性,如: Ref [屬性], Comp [屬性], Pass [屬性]
註: 非CG語法
==== Rendering ====
Unity的實體幾何 (Geomentry) 是從前到後渲染的 (先畫近在畫遠)
如果 Depth Buffer已經有值,就會直接忽略新的像素訊息
這樣做可以避免重覆將像素寫入 Frame Buffer
正向渲染 Forward Rendering
可以渲染半透明物件
渲染單個對象
Geometry => VertexShader => Geometry Shader => Fragment Shader Lighting =>
[Frame Buffer]
渲染多個對象,每個對象都需要計算環境中所有光線
Geometry => VertexShader => Geometry Shader => Fragment Shader Lighting
Geometry => VertexShader => Geometry Shader => Fragment Shader Lighting
Geometry => VertexShader => Geometry Shader => Fragment Shader Lighting
All => [Frame Buffer]
延遲渲染 Deferred Rendering
渲染單個對象
Geometry => VertexShader => Geometry Shader => Fragment Shader =>
[G-Buffer] => Lighting => [Frame Buffer]
渲染多個對象,照明計算只會進行一次
Geometry => VertexShader => Geometry Shader => Fragment Shader
Geometry => VertexShader => Geometry Shader => Fragment Shader
Geometry => VertexShader => Geometry Shader => Fragment Shader
All => [G-Buffer] => Lighting => [Frame Buffer]
預設情況,Unity使用的是 Forward Rendering
可以在 Edit > Project Settings > Graphics > Rendering Path 設定選染管道
==== Render Queues ====
通過使用選染列隊控制目標的繪製順序
預設列隊
Background => Geomentry => AlphaTest => Transparent => Overlay
註: 半透明渲染需要先有與物件後方不透明物件重疊的像素顏色,才能夠進行顏色混合,所以順序得在 Geomentry之後
指定 Render Queue Tag
Tags { "Queue" = "Geometry" }
Tags { "Queue" = Transparent" }
也可以再加上自定數值
Tags { "Queue" = "Geometry + 100" }
註: 非 CG語法
在 Inspector裡 Renderer Queue可以直接輸入想要的值,不被預設列隊限制
今天在玩 Into the Breath