前向渲染和延遲渲染

陈侠云發表於2024-04-12

光照計算總覽

光照計算

image

Render Path渲染路徑

它決定了一個shader是以怎樣的一種方式渲染燈光
image

Unity前向渲染

前向渲染預覽

Camera元件設定Rendering Path為Forward,其預設的渲染方式也是Forward
image
目前場景中有1個平行光,和5個點光燈,1個球體,一個地面,我們發現每個燈光都對每個物體渲染了1次
image
但我們可以注意到,有6個光源,每個物體卻只渲染了5次,而且右上角的點光源似乎有點粗糙,這是因為它和平行光都歸入了同一個Pass計算(ForwardBase),且該點光源是在頂點著色器中計算。其他點光源是在另一個Pass中計算(ForwardAdd)
該圖可以注意到第一次計算就把平行光和點光源一起計算出來了
image
image
為什麼1個點光源和平行光會合在一起計算,這是因為前向渲染燈光的消耗問題,我們引擎對光源的數量有限制,超出的燈光只能在頂點著色器中進行計算
image
超出燈光數量也有限制,最多4個燈,多了會發現渲染不出來
image

前向渲染規則

內光燈指其他平行光、點光源、聚光燈燈
image

Unity延遲渲染

延遲渲染預覽

Camera元件設定Rendering Path為Deferred
image
我們可以看到在DEFFERRED Pass中採用MRT(Multi Render Target)計算,預先生成4張圖(RT0 - RT1)。注意,是每個物體都要單獨做一次MRT計算
RT0:diffuse資訊(基本的BaseColor)
RT1:metallic資訊(金屬反射的顏色)
RT2:normal資訊(法線)
RT3:depth資訊(深度)
image
然後以燈光為單位,每個燈光再對場景單獨繪製一次。不像前向渲染,每個物體都要呼叫燈光一遍
image
可以看到,做法就是拿到先前算好的一系列RT圖示
image

前向渲染和延遲渲染對比

以上面舉例場景為例。
延遲渲染計算複雜度:2(場景中每個物體做MRT) + 5(每個燈光數量) + 1(Draw GL) = 8
前向渲染計算複雜度:2(場景中每個物體數量) * 5(每個燈光數量) = 10
延遲渲染計算量複雜度更少,但是延遲渲染每個物體都要生成跟螢幕相同尺寸的4張圖,對頻寬的佔用非常高,有些機型甚至不支援MRT。前向渲染則比較輕量化,如果燈光少的化,用前向渲染是挺好的

主方向燈判斷

image
一個場景中,只有一個主方向燈(或者指定數量的畫素燈),你可以把你希望是主方向燈(或者畫素燈)標記為Important,如果Auto的話,它則將把Intensity最大的燈,作為主方向燈(畫素燈)。

相關文章