主題

【Shader 學習筆記】簡單了解Forward Render / Deferred Render Path

趴趴鼠Loading | 2021-04-05 16:04:36 | 巴幣 1116 | 人氣 153

前言:
新生活運動實施中,
晚上1點上床睡覺,早上9點起床。
起床-下午:讀書
下午-晚上:做專案
晚上-睡前:創作 or 讀書 or 做專案
大腦只能有程式、星爆、英日文。
沒做到我就要請朋友喝飲料了。


可以直接看Notion筆記: 連結


讀之前看到教授加博士先生的推薦文章:DOOM Eternal - Graphics Study,才看第一頁衍伸的學習就夠我做一次筆記了。

第一段《With Id Tech 7, the engine has moved away from OpenGL and is entirely built with a Vulkan backend allowing them to make better use of current generation GPU features, bindless resources in particular.》 提到該引擎由OpenGL改成Vulkan。

Vulkan跟OpenGL一樣是圖型底層API,但能有更好的硬體控制權、效能(能並列任務)。

感覺又是個大坑,這方面之後再做研究。


第二段
《Doom 2016 was mostly forward rendered with a thin G-Buffer for screen space reflections. 》
出現了,forward render 和G-Buffer。
在Unity使用URP時都會先創建個Forward Render 設定集,但一直都不知道甚麼是forward render。

一個幾何形渲染通常會經過:[1][2]
  1. Vertex Shader (單個頂點,不知道點線面的資訊)
  2. Tessellation Shader (曲面細分,增加更多面數細節,使模型套用displacement等資訊能更圓滑 [3])
  3. Geometry Shader ( 知道並負責編輯點線面的資訊)
  4. Fragment Shader (畫面上每個像素)
  5. Frame Buffer


Forward Render [1]:
  • 常見的Render Path。
  • 光的數量和複雜度成線性增長,所以Unity只考慮重要程度最大的4個光源(預設)。
  • 在Vertex shader 或 fragment shader計算光源。
  • 若一個1920*1080解析度的畫面有1000個頂點的模型、n個光源,則逐點光複雜度為1000n; 逐像素光則是1920*1080*n。頂點數量<像素數量,盡量使用逐頂點光。 (?
  • 在這裡我有個疑問,若在1024*768的解析度上有10個100萬vertex的模型,請問該使用哪個shader計算光源?
逐頂點光Shader

逐像素光Shader,註解掉的地方是逐頂點光的程式碼



Deferred Render (延遲渲染)
  • 光照處理延遲到clip space  screen space(2D)再進行。
  • 需要G-Buffer儲存每個像素的Position、Normal、Diffuse和其他材質資訊,產生紋理圖。
  • 優勢: 將光源數目與物體數目複雜度完全分開。(Light Culling [4]:只處理在範圍內的光線)。
  • 劣勢: G-Buffer消耗顯卡內存多、存取耗費頻寬大。
優化方式(1): Light Pre-Pass:
  • G-Buffer只儲存Z值、Normal。 (縮小G-Buffer數據結構)。
  • 在Fragment shader利用G-Buffer先計算出Light properties,進行alpha-blend後存入LightBuffer。
  • 最後結果送給Forward Render輸出。
  • 優點是每個物體能使用不同效果的Shader進行渲染。

優化方式(2): Tile-Based Deferred Render:
  • 將螢幕分成許多小區塊(tile),一個個處理後重組。一般Tile 是32*32像素[4]。
  • 常用於手機遊戲,因為手機內存小、快速,所以《By splitting the render target into tiles just small enough to fit in this memory, and processing those one at a time, we minimise the amount of interaction with the slower main memory。》[5] (英文比較好懂XD)
  • 透過Depth值剔除掉被遮擋的Tile,減省運算。(只適用不透明渲染) [4]



其他/問題:
SH :球諧光照(Spherical Harmonic Lighting)
Unity手冊下面有介紹,有空再研究。 其他文章

Forward+
[1]下面提到的Forward+不知道跟Unity目前的Forward Render差在哪?

看不懂的公式:
[1]下面這些公式看不懂....該怎麼識字





參考:

創作回應

教授加博士先生
在備註:所以設置光源時,不論是在deferred/forward/啥各種變體,  大原則是,下圖左右看起來效果一樣,但請以右圖為準。減少range影響範圍。https://1.bp.blogspot.com/-Ea7wRDw6blw/YEocPFZy83I/AAAAAAAAAjg/gM9tQx4j5bMkVKZlfb4Zn7fOEfMR7WH5wCLcBGAsYHQ/s1747/014.PNG
2021-04-05 18:58:29
教授加博士先生
再備註: 「光照處理延遲到clip space (2D)再進行。」這打錯了,pixel shader是screen space。 VS出來後projection matrix就是clip space。=>硬體clipping 剪裁=>硬體對SV_Position perspective divide (/w), NDC space [0, 1]=> 硬體 rasterization 根據解系度=> screen space => pixel shader PS
2021-04-05 19:04:07
教授加博士先生
(抱歉打得有點亂XD 應該打成文章的[e8] [e38]
2021-04-05 19:06:42
趴趴鼠Loading
大感謝!! 花了點時間延伸學習
受教很多[e38]
2021-04-07 23:26:19
ays.
樓上好猛
2021-04-05 23:22:51
ays.
話說你真的好猛, 能看懂這些東西真的不簡單, 這些東西都是我研究所看 paper & 消化到現在, 大概才有點輪廓整個東西怎麼運作的QQ

(然後進了公司才發現大部分狀況都碰不到那麼細XD
2021-04-05 23:27:41
趴趴鼠Loading
興趣吧XD 小時候就很喜歡追根究底,不知不覺就越讀越深。
不過還是感謝社群大佬帶我入坑的![e38]
2021-04-07 23:28:47

相關創作

更多創作