延遲渲染路徑

2021-10-08 09:43:52 字數 2229 閱讀 6233

此頁面將詳細介紹延遲渲染路徑。參見 wikipedia: 延遲渲染以獲取介紹性的技術概述。

當使用延遲渲染時,在單個gameobject物體上起作用的燈光的數量就沒有限制。所有的燈光都是逐畫素計算的,這意味著它們都能正確地與法線貼圖互動。除此之外,所有的燈光都能擁有剪影和陰影。

延遲渲染的乙個優勢就是處理光照的開銷是與燈光照亮的畫素數量成正比。這由場景裡的燈光的體積所決定,而跟它照亮了多少個gameobject無關。因此,可以通過保持小體積的燈光來提高效能。延遲渲染還擁有高度一致和可**的行為。每個燈光的影響都是逐畫素計算的,因此不存在燈光在大的三角形上計算的故障。

它也有劣勢,延遲渲染不支援抗鋸齒,不能處理半透明的gameobject(這些物體使用前向渲染路徑渲染)。它也不支援mesh renderer的receive shadows標記,剔除遮罩只有有限的支援。你最多只能使用4個剔除遮罩。這就是說,剔除遮罩必須至少包含所有的層級,除去其中的任意4個層級,因此32個層級中的28個層級都必須被設定。否則你將會獲得圖形瑕疵。

顯示卡要有多重渲染目標(mrt)功能,要支援shader model 3.0(或以上),要支援深度渲染紋理。大部分於2023年之後生產的pc顯示卡都支援延遲渲染,包括geforce 8***或更新的顯示卡,radeon x2400或更新的顯示卡,intel g45或更新的顯示卡。

在移動端,所有執行opengl es 3.0或以上的裝置都支援延遲渲染。

注意:當使用正交投影時,將會不支援延遲渲染。如果某個相機的投影模式設定成正交,那麼它將會回退到前向渲染模式。

在延遲渲染模式下,渲染實時燈光的開銷是與燈光照亮的畫素數量成正比的,跟場景複雜度無關。因此小範圍的點光源或者聚光燈的開銷是很低的。如果它們被場景裡的gameobject全部或者部分遮擋,那麼開銷會更低。

當然,擁有陰影的燈光比沒有陰影的燈光開銷要大一些。在延遲渲染模式下,對於每個陰影投射的燈光,投射陰影的gameobject仍然需要渲染一次或者更多次。而且應用陰影的光照著色器比不開陰影的有更大的開銷。

那些不支援延遲渲染的物體將會在延遲渲染結束後使用前向渲染路徑來渲染。

幾何緩衝區(g-buffer)裡的預設的渲染目標(rt0 ~ rt4)的布局如下方列表所示。資料型別分布在每個渲染目標的多個通道上。圓括號裡標註了所使用的通道。

因此預設的g-buffer布局占用 160 bits/pixel(非hdr)或者 192 bits/pixel(hdr)。

如果使用陰影遮罩或者距離陰影遮罩模式,那麼還將會使用到第五個渲染目標:

因此g-buffer布局就是 192 bits/pixel(非hdr)或者224 bits/pixel(hdr)。

如果硬體不支援同時使用5個渲染目標,那麼使用陰影遮罩的物體將會回退到前向渲染路徑。當相機沒有使用hdr時,自發光+光照緩衝區(rt3)採用對數編碼來提供比常規argb32紋理更大的動態範圍。

注意:當相機啟用了hdr渲染,不會建立單獨的渲染目標用於自發光+光照緩衝區(rt3),而是相機本身的渲染目標(也就是傳遞給影象特效的渲染目標)直接當作rt3使用。

g-buffer pass渲染每個gameobject一次。漫反射和高光顏色、表面粗糙度、世界座標系法線以及自發光+環境光+反射+光照貼圖這些都會渲染進g-buffer紋理裡面。這些g-buffer紋理被設定成全域性的著色器屬性以方便後續的著色器訪問(名字為 cameragbuffertexture0 … cameragbuffertexture3)

光照pass根據g-buffer和深度計算光照。光照是在螢幕空間計算的,因此處理耗時與場景複雜度無關。光照結果將會新增到自發光緩衝區。

點燈和聚光燈的作用範圍如果沒有與相機的近截面相交,那麼它們將會以3d形狀渲染,渲染時開啟深度緩衝區,檢測與場景的遮擋順序。這就使得部分或者完全遮擋的點燈和聚光燈的渲染開銷非常小。方向光和作用範圍與相機的近截面相交的點燈/聚光燈將以全屏的四邊形渲染。

如果燈光開啟了陰影,那麼陰影將會在此pass進行渲染和應用。請注意,陰影是有代價的。陰影投射將會被用到,並且將會應用乙個更加複雜的光照著色器。

可用的光照模型只有standard。如果你需要乙個不一樣的光照模型,那麼你需要乙個修改版的lighting pass著色器。具體步驟為:

複製內建著色器zip包裡的 internal-deferredshading.shader 檔案,並加以修改。

在assets目錄裡建立resources資料夾,並將修改過的著色器放進去。

開啟graphics設定面板(edit > project settings > graphics),改變 「deferred」 下拉列表為 「custom shader」。

選擇你自定義的著色器。

Unity中的前向渲染路徑和延遲渲染路徑

渲染路徑核心 光照處理。unity中光照 逐頂點 逐畫素 球諧光照。逐畫素光照 按照每個畫素的顏色被計算,看起來比較平滑 逐頂點光照 每個頂點上做光照,其他地方插值,效果粗糙。但是逐畫素光照中,每個光源會使每個光源光照範圍內的物體增加乙個渲染批次。延遲渲染可以解決逐畫素光照對光源造成的效能影響。延遲...

延遲渲染 Deferred Rendering

在計算機圖形學中,延遲渲染 deferred rendering 即延遲著色 deferred shading 是將著色計算延遲到深度測試之後進行處理的一種渲染方法。延遲著色技術的最大的優勢就是將光源的數目和場景中物體的數目在複雜度層面上完全分開,能夠在渲染擁有成百上千光源的場景的同時依然保持很高的...

shader 延遲渲染

正向渲染 forward rendering 或稱正向著色 forward shading 是渲染物體的一種非常直接的方式,在場景中我們根據所有光源照亮乙個物體,之後再渲染下乙個物體,以此 類推。傳統的正向渲染思路是,先進行著色,再進行深度測試。其的主要缺點就是光照計算跟場景 複雜度和光源個數有很大...