原文地址: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年成为主流。