渲染通道又稱渲染路徑(Rendering Path),而渲染通道則是定義shader中的pass最終要透過何種管道渲染照明和陰影
這些Pass會透過Pass Tag來定義使用的渲染通道
而Unity有的渲染路徑有以下幾種
Forward Rendering : 正向渲染
Deferred Shading : 延遲渲染
legacy Deferred Lighting : 傳統延遲光照渲染
legacy Vertex Lit : 傳統點光照渲染
Legacy的渲染模式已經被Unity淘汰了,這邊就著重介紹Forward跟Deferred兩種渲染模式
目前主流的遊戲和圖形渲染引擎,包括底層的API(如DirectX和OpenGL)都開始支持現代的圖形渲染管線。現代的渲染管線也稱為可編程管線(Programmable Pipeline),簡單點說就是將以前固定管線寫死的部分(比如頂點的處理,像素顏色的處理等等)變成在GPU上可以進行用戶自定義編程的部分,好處就是用戶可以自由發揮的空間增大,缺點就是必須用戶自己實現很多功能。
※右圖為一般遊戲渲染的流程
正向渲染是多數引擎預設使用的渲染技術,給圖形渲染硬體提供幾何圖形資料,最後轉換並分割為片段或畫素,在傳遞到螢幕之前進行最終渲染。它是線性的,幾何圖形一個一個的傳遞到管線中以產生最終影象。
※如右圖所示
正向渲染對一個物件會在多個通道上進行渲染,並且渲染取決於影響物體的光源。光源本身也會根據其設定和強度在進行正向渲染的時候進行不同的處理。
在Unity中正向渲染對一個物件會在多個通道上進行渲染,並且渲染取決於影響物體的光源。光源本身也會根據其設定和強度在進行正向渲染的時候進行不同的處理。
影響每個物件的一些數量的最亮的光源以完全每個畫素光照模式渲染。然而,每個頂點最多計算4個點光源。其他光源被計算成球面諧波(Spherical Harmonics)
一個光源是否進行Per-Pixel光照主要依靠以下幾點:
當光源的渲染模式被渲染成Not Important,則光源是進行Per-Vertex計算或者SH
最亮的直光源是總是Per-Pixel
光源渲染模式設定為Important總是Per-Pixel光照
如果在Quality Setting裡面設定的光源數量在上述設定中超過了,那麼超過的光源按照亮度的順序Per-Pixel的渲染。
Foward的好處在於少量光源的狀況下可以更快速的渲染場景,且支援抗拒齒與透明度的功能。
但Forward和Deferred的最大差別在於處理光源的數量差距,如上述說明Forward在處理光照的流程是依直線的,也就是說Forward rendering的渲染演算法複雜度 可以估算為(num_geometry_fragment * num_lights) ,這會大量的消耗資源,所以通常會用LightMap或多光源組合來優化場景。
如果場景需要大量實時光的話就必須使用Deferred渲染。
延遲渲染就是將所有Fragment的步驟做延遲,最後統一處理,要做到這個功能就需要用到G-Buffer來處理。
G-Buffer主要用到儲存每個像素對應的Position、Normal、Diffuse....etc,然後根據這些信息做光照處理後合成圖檔顯示到螢幕上。
※如右圖所示
右圖為Forward和Deferred渲染的直觀上的差距。
還有實際渲染上的流程。
延遲渲染最大的優點是可以處理大量動態光源,這對他的效能開銷較小。
但是缺點也同樣明顯,剛提的G-Buffer對於老式型號的顯卡來說,可能成受不了這麼大的頻寬,再來顯卡也必要要有能夠支援多目標渲染的功能。
另外Deferred Rendering無法使用抗拒齒和透明貼圖,除非另外調整渲染通道。