原文地址: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. Android分区

    1. Android 分区: 2. Android各个分区的作用: 2.1 modem分区 实现手机必需的通信功能,大家通常所的刷RADIO就是刷写modem分区,在所有适配的ROM中这部分是不动,否 ...

  2. fedora安装字体

    #fedora安装新字体 将自己现有的字体复制到/usr/share/fonts/自己起个名字/ 例如我要安装下载的苹果苹方字体 #cp 我这个文件夹的地址/* /usr/share/fonts/Pi ...

  3. 记录一次向TiDB数据库导入数据的例子

    导出数据 今天从Mysql的某个库中导出一个表大概有20分钟吧,等了一会终于导出成功了.查看一下文件的大小: [tidb@:vg_adn_CkhsTest ~]$du -h ./creative_ou ...

  4. 团队作业7——第二次项目冲刺(Beta版本)day1

    项目成员:  曾海明(组长):201421122036 于波(组员):201421122058 蓝朝浩(组员):201421122048 王珏 (组员):201421122057 叶赐红(组员):20 ...

  5. 翻译:使用红外传感器与Arduino进行简单动作与手势检测

    译注:昨天看 Adruino 的 Twitter 推了这篇项目,第一眼就觉得非常有趣,翻译给大家看看.文中的红外传感器比较高级,和淘宝上5块钱的那种只能输出0和1的不一样, TPA81 是可以输出温度 ...

  6. 实现统计 android手机 CPU使用率

    # -*- coding:utf-8 -*- ''' Created on Sep 10, 2018 @author: SaShuangYiBing ''' import subprocess imp ...

  7. IE8 input X 去掉文本框的叉叉和密码输入框的眼睛图标

    从IE 10开始,type="text" 的 input 在用户输入内容后,会自动产生一个小叉叉(X),方便用户点击清除已经输入的文本 对于type="password& ...

  8. 快速数论变换(NTT)

    刚学完FFT,干脆把NTT也学了算了 (一)预备知识 关于原根,这里说得蛮详细的百度百科 为什么使用原根呢?为什么原根可以替代\(\omega_{n}\)呢?想知道为什么就看here NTT用到的各种 ...

  9. 矩阵dp

    矩阵dp 这里是矩阵dp,不是矩阵乘法优化dp. 矩阵上的dp好像也没什么特殊的?大概有一个套路就是从上向下,从左向右进行dp吧. 首先第一道题好像不是矩阵dp... 1005 矩阵取数游戏:http ...

  10. 或许因为缺少默认route配置而导致的的ping超慢,甚至timeout

    内网有台dell r620 做测试用: 4个网口都插了 网线,通过小交换直接连在中心路由的第3个口上: 安装了kvm,有virbr0   :但还没装其它的虚拟机. ping 外网域名 ,IP地址 都超 ...