小屋創作

巴哈姆特 APP

專屬 ACG 勇者的廣闊世界

以 APP 瀏覽

日誌2020-07-02 17:20

【筆記】Surface Shader - 3.Buffer and Queue

作者:is樂小呈

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 [屬性]
文檔: https://docs.unity3d.com/Manual/SL-Stencil.html
註: 非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
這遊戲也太棒,難怪 GMTK會一直提到它


21

1

LINE 分享

相關創作

【初級救護員筆記】01-前言與基本人體系統(上)

【初級救護員筆記】04-病人評估(上)

【筆記】Vertex Shader - 3. Lighting

留言

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】