原文地址:https://en.wikipedia.org/wiki/Deferred_shading

在3D计算机图形学领域,deferred shading 是一种屏幕空间着色技术。它被称为Deferred,是因为实际上在第一次pass中的顶点和像素着色器中没有执行着色:相反,着色是“deferred(延迟)”到第二个pass中执行。
在deferred着色器的第一次pass中,只收集着色计算所需的数据。每个表面的位置、法线和材质,然后使用“render to texture”技术渲染到几何缓冲(G-buffer)中。在这之后,像素着色器使用屏幕空间中纹理缓冲区的信息计算每个像素的直接和间接光照。
SSDO(Screen space directional occlusion)可以作为deferred着色管线的一部分,给阴影和互反射提供方向。
 

优点


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的例子有:

Deferred shading在商业游戏中的应用


与Deferred lighting相比,由于内存大小和带宽要求较高,这种技术并不是很流行。特别是在第7代主机上,图形内存大小和带宽是有限的,常常是瓶颈。

具有Deferred shading技术的游戏引擎


历史


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年成为主流。

Deferred Shading 延迟着色(翻译)的更多相关文章

  1. Deferred shading rendering path翻译

    Overview 概述 When using deferred shading, there is no limit on the number of lights that can affect a ...

  2. Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)【转】

    Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置:   http://blog.csdn.net ...

  3. Deferred Shading延迟渲染

    Deferred Shading 传统的渲染过程通常为:1)绘制Mesh:2)指定材质:3)处理光照效果:4)输出.传统的过程Mesh越多,光照处理越费时,多光源时就更慢了. 延迟渲染的步骤:1)Pa ...

  4. Unity的Deferred Shading

    什么是Deferred Shading Unity自身除了支持前向渲染之外,还支持延迟渲染.Unity的rendering path可以通过Edit/Project Settings中的Graphic ...

  5. WebGL之延迟着色

    什么是延迟着色(Deferred Shading)?它是相对于正常使用的正向着色(Forward Shading)而言的,正向着色的工作模式:遍历光源,获取光照条件,接着遍历物体,获取物体的几何数据, ...

  6. D3D Deferred Shading

    在3D图形计算中,deferred shading是一个基于屏幕空间的着色技术.之所以被称为deferred shading,是因为我们将场景的光照计算与渲染"deferred"到 ...

  7. opengl deferred shading

    原文地址:http://www.verydemo.com/demo_c284_i6147.html 一.Deferred shading技术简介 Deferred shading是这样一种技术:将光照 ...

  8. 如何在Unity中分别实现Flat Shading(平面着色)、Gouraud Shading(高洛德着色)、Phong Shading(冯氏着色)

    写在前面: 先说一下为什么决定写这篇文章,我也是这两年开始学习3D物体的光照还有着色方式的,对这个特别感兴趣,在Wiki还有NVIDIA官网看了相关资料后,基本掌握了渲染物体时的渲染管道(The re ...

  9. 引擎设计跟踪(九.14.3.2) Deferred shading的后续实现和优化

    最近完成了deferred shading和spot light的支持, 并作了一部分优化. 之前forward shading也只支持方向光, 现在也支持了点光源和探照光. 对于forward sh ...

随机推荐

  1. 【爬坑】MySQL 无法启动

    [说明] 启动 MySQL 的时候出现以下错误 [解决] 在网上查到了遇到相关问题的人的解决方法,参考连接 Mysql启动报错 原因是 MySQL 服务没启动,开启就好了. 最后分析之所以服务没开启, ...

  2. java读写properties配置文件不改变属性的顺序和注释

    先贴代码 import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java ...

  3. PAT B1017 A除以B (20 分)

    本题要求计算 /,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数 Q 和余数 R,使得 A=B×Q+R成立. 输入格式: 输入在一行中依次给出 A 和 B,中间以 1 ...

  4. OpenGL笔记(四) API参考

    常见API glActiveTexture 选择活动纹理单元 glAttachShader 将一个着色器对象绑定到一个程序对象 void glAttachShader(GLuint program, ...

  5. 理解ASP.NET的IDataReader

    理解ASP.NET的IDataReader ADO.NET DataReader对象可以从数据库中检索只读.只进的数据流.因为每次在内存中的数据只有一行,所以使用DataReader可提高应用程序的性 ...

  6. Fiddler抓包调试前端脚本代码

    0.写在前面的话 之前看了阮一峰老师关于互联网协议入门的博客,受益匪浅,接着再去体会了下HTTP协议,就想着看实际网络访问中的那些HTTP请求头和响应是什么样的.Chrome的调试工具的Network ...

  7. 降阶法计算行列式方法有个地方有Bug(原文也已更正,此为更正后部分)

    今天用此函数做方程求解时发现有误,特此更正: /// <summary> /// 降阶法计算行列式 /// </summary> /// <param name=&quo ...

  8. docker 端口映射错误解决方法

    今天搞了半天shipyard,在网页上打开时无法显示容器和镜像,最后发现是docker端口映射错误,由于防火墙未关闭: 4月 12 18:51:29 localhost firewalld[757]: ...

  9. 笔记:UITextView内容垂直居中方法

    - (void)contentSizeToFit { //先判断一下有没有文字(没文字就没必要设置居中了) ) { //textView的contentSize属性 CGSize contentSiz ...

  10. 使用redis

    通过 Nuget获取包StackExchange.Redis 写数据: ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(&quo ...