原文地址: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. rsync 数据备份+cron+mailx案例

    大家都知道数据非常重要的,需要经常备份,如果备份了,但无法恢复还原,那就证明你备份的很失败,所有当我们备份了数据需要检查是否备份完整,是否可用可恢复.以下为一个企业案例: 某公司里有一台Web服务器, ...

  2. 向kindle传送文件

    自从有了kindle以后,只要不是pdf的电子书,基本上都用kindle来看了,毕竟水墨屏还是很护眼的,但是这就带来了向kindle传输文件的问题 绝大部分的电子书用邮件推送就可以解决了,但是还有一些 ...

  3. 阿里云朱照远: AI打开新视界 8K时代已来!

    2018年4月11-12日,2018亚太CDN峰会在北京隆重召开,大会由亚太CDN领袖论坛.电视云论坛.短视频论坛.视频云论坛.新技术论坛.运营商论坛.国际云论坛等7大部分组成.在亚太CDN领袖峰会上 ...

  4. 使用C#获取Windows Phone手机的各种数据(转)

    转自:http://www.sum16.com/desinger/use-c-sharp-get-windows-phone-information.html 使用C#获取Windows Phone手 ...

  5. October 28th, 2017 Week 43rd Saturday

    All I ever wanted was a single thing worth fighting for. 我想要的只不过是一件能让我奋不顾身的事业. Stop complaining the ...

  6. sed和awk学习整理

    Awk和Sed的基本使用 可以用大至相同的方式调用sed 和awk .命令行讲法是:command [options] script filename几乎和所有的unlx程序一样,sed和awk都可以 ...

  7. libcurl.dll 7.60.0静态库包含openssl/zlib

    最近做个QT的小程序需要使用LIBCURL支持HTTPS,结果查资料发现官方默认的是不支持的,需要手动重新编译,编译的时候加入SSL支持. 看着就好麻烦的样子, 找了一圈,还真有现成的,但是现在写程序 ...

  8. 【洛谷】【单调栈】P4333 [COI2007] Patrik

    --接上一篇题解,[洛谷][单调栈]P1823音乐会的等待 关于题目大意在上一篇题解里已经说清楚了,这里不再多阐述 想看题目->戳这里 [算法分析:] 在对元素a进行判断时,如果它与栈顶元素相等 ...

  9. 《阿里巴巴 Java 开发手册》划重点!

    [强制]小数类型为 decimal,禁止使用 float 和 double. 说明:float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不 正确的结果.如果存储的数 ...

  10. Elasticsearch学习笔记1

    Json (JavaScript Object Notation),即JavaScript对象标记法,当前十分流行和常见的互联网数据传输格式,尤其是在前端领域.Json是一种用于数据交换的文本格式,目 ...