原文地址:https://en.wikipedia.org/wiki/Deferred_shading
在3D計算機圖形學領域,
deferred shading 是一種
屏幕空間着色技術。它被稱為Deferred,是因為實際上在第一次pass中的頂點和像素着色器中沒有執行着色:相反,着色是“deferred(延遲)”到第二個pass中執行。
在deferred着色器的第一次pass中,只收集着色計算所需的數據。每個表面的位置、法線和材質,然后使用“render to texture”技術渲染到幾何緩沖(G-buffer)中。在這之后,像素着色器使用屏幕空間中紋理緩沖區的信息計算每個像素的直接和間接光照。
Deferred着色的主要優點是場景幾何與光照的分離。只需要一個幾何Pass,而每一個燈光只計算它實際影響的像素。這樣就可以在不影響性能的情況下渲染場景中的多個燈光。這種方法還有其他一些優點。這些優點可能包括更簡單地管理復雜的光照資源、易於管理其他復雜的着色器資源、簡化軟件渲染管線。
缺點
Deferred渲染的一個關鍵缺點是無法處理算法中的透明,雖然這個問題是Z-buffer場景中的一個常見問題,它往往通過延遲和排序來處理渲染場景透明的部分。深度剝離可用於實現Deferred渲染中的
順序無關透明度,但是要以額外的批處理和g-buffer大小為代價。支持DireactX 10或更高版本的現代硬件通常能夠以足夠快的速度執行批處理,以保持足夠的幀率去實現交互。當采用順序無關的透明度時(通常用於消費級應用程序),Deferred着色的效率並不低於使用相同技術的Forward着色。
另一個嚴重的缺點是使用多個材質的困難。雖然可以使用多個不同的材質,但是需要在G-buffer中存儲更多的數據,數據已經相當大了並且消耗了大量的內存帶寬。
另一個相當嚴重的缺點是,由於光照階段和幾何階段的分離,硬件
抗鋸齒不再產生正確的結果,因為插值子樣本將導致無意義的位置、法線和切線屬性。克服這一限制的常用技術之一是在最終圖像上使用
邊緣檢測,然后在邊緣上使用模糊,然而,最近開發了更先進的后處理邊緣平滑技術,比如
MLAA(在《KillZone 3》和《Dragon Age II》中使用),FXAA(用於《Crysis 2》、《FEAR 3》、《Duke Nukem Forever》),
SRAA,
DLAA(用於《Star Wars:The Force Unileashed II》),和MSAA(在《孤島危機2》中用作默認的反鋸齒解決方案)。雖然它不是一種邊緣平滑技術,但
Temporal anti-aliasing(在Halo Reach和虛幻引擎中使用)也可以幫助邊緣平滑外觀。DirectX引入了允許着色器訪問多重采樣渲染目標中的單個樣本的特性(10.1的深度緩沖區),讓使用這個API的用戶在Deferred着色器中訪問硬件抗鋸齒。這些特性還允許它們正確地將HDR亮度映射應用到抗鋸齒邊緣,在API的早期版本中,任何抗鋸齒的優勢都已經丟失了。
Deferred lighting
Deferred Lighting(也被稱為Light Pre-Pass)是對Deferred Shading的一種修改。在Deferred shading中這個技術使用了三個Pass,而不是兩個Pass。在第一遍pass場景幾何圖形時,只將計算每像素光照(輻射度)所需的屬性寫入G-buffer中。屏幕空間,“Deferred”Pass只輸出漫反射和高光光照數據,所以必須在場景上進行第二遍Pass,以讀取照明數據並輸出最終的像素着色。Deferred lighting的明顯優勢是大大減少了G-buffer的大小。明顯的代價是需要渲染場景幾何兩次而不是一次。另一個額外的成本是在Deferred lighting中的Deferred pass必須分別輸出漫反射和鏡面輻射,而Deferred shading中的Deferred pass只需要輸出單個的組合輻射值。
由於減小了G-buffer的大小,這種技術可以克服Deferred shading的一個嚴重缺點——多材質。另一個可以解決的問題是MSAA。Deferred lighting可以在DirectX9硬件上與MSAA一起使用。
Deferred lighting在商業游戲中的應用
這種技術在視頻游戲中的使用越來越多了,因為它可以使用大量的動態燈光,減少了需要的着色器指令的復雜性。一些使用了Deferred lighting的例子有:
- Alan Wake
- Assassin's Creed III
- BioShock Infinite
- Blur
- Brink
- Crackdown and Crackdown 2
- Crysis 2
- Dead Space
- Deus Ex: Human Revolution
- Dragon's Dogma
- Guild Wars 2
- Halo: Reach
- inFamous and inFamous 2
- LittleBigPlanet
- Metal Gear Solid V: Ground Zeroes
- Metal Gear Solid V: The Phantom Pain
- Shift 2 UNLEASHED
- Red Dead Redemption
- Resistance series
- Rochard
- StarCraft II
- Uncharted and Uncharted 2
- Vanquish
Deferred shading在商業游戲中的應用
與Deferred lighting相比,由於內存大小和帶寬要求較高,這種技術並不是很流行。特別是在第7代主機上,圖形內存大小和帶寬是有限的,常常是瓶頸。
- Amnesia: The Dark Descent
- Battlefield 3
- Dota 2
- Dungeons
- Digital Combat Simulator (DCS) World 2.5
- Grand Theft Auto IV
- Killzone 2 and Killzone 3
- Mafia II
- Miner Wars 2081
- Metro 2033
- Rift
- Shrek
- Splinter Cell: Conviction
- The S.T.A.L.K.E.R. game series: Shadow of Chernobyl, Clear Sky and Call of Pripyat
- Tabula Rasa
- Trine
- Trine 2
- Viva Pinata
具有Deferred shading技術的游戲引擎
- AnvilNext
- Chrome Engine
- CryEngine 3
- Fox Engine
- Frostbite 2
- GameStart
- Haemimont Games Engine (HGE)
- I-Novae
- MT Framework
- Rockstar Advanced Game Engine
- Source
- Torque 3D
- Unity
- Unreal Engine 4
- Vision
歷史
Deferred shading的概念最初是由Michael Deering和他的同事於1988年發表的一篇名為《
The triangle processor and normal vector shader: a VLSI system for high performance graphics》論文中提出的。雖然文中從未使用“Deferred”一詞,但介紹了一個關鍵的概念。 each pixel is shaded only once after depth resolution。我們今天所知道的Deferred shading,使用g-buffer,是由Saito和Takahashi在1990年的一片論文中介紹的,雖然他們也不使用“Deferred”這個詞。第一個使用Deferred shading的視頻游戲是《怪物史萊克》,這是2001年推出的xbox游戲。大約在2004年,商業圖形硬件開始出現。這種技術后來在視頻游戲等應用程序中流行起來,最終在2008年至2010年成為主流。
