Deferred Shading(延迟渲染)
1) 计算几何多边形(也就是Mesh)。
2) 决定表面材质特性,例如法线、双向反射分布函数(bidirectional reflectance distribution function, BRDF)等等。
3) 计算入射光照。
4) 计算光照对表面的影响,并最终显示。
1) 计算每个几何体受那些光影响耗费了CPU的时间,更坏的是,这是个O(n*m)的操作。
2) Shader经常需要超过一次以上的Pass来渲染光照,渲染n个灯光,对于复杂的Shader,可能需要O(n)次运算。
3) 增加新的光照模型和新的光源类型,可能需要改变所有Effect的源文件。
4) Shader很快就将达到或者超出SM2的指令限制。
2) 不必要再为几何体的受光提供附加的Pass了,这样就节省了Draw Call和状态切换的数量。
3) 在增加新的光源类型和光照模型时,材质的Shader不需要做出任何改变。
4) 材质Shader不产生光照,这样就节省了计算额外的几何体的指令数。
延迟渲染需要显卡提供MRT的支持,且利用了不断增加的存储器的带宽——这也就意味着我们可能得对玩家所使用的硬件提出更高的要求。因此我们既实现了前向渲染,也实现了延迟渲染。我们优化了前向渲染管道,并在此基础上完成了延迟渲染管道。
1) Geometry阶段:将本帧所有的几何信息光栅化到G-buffer。包括位置,法线,贴图等。
2) Lighting阶段:以G-buffer作为输入(位置,法线)进行逐像素的光照计算,将diffuse lighting和specular lighting 结果分别保存在两张RT上作为lighting buffer。
3) Composition阶段:将G-buffer中的贴图buffer和lighting buffer融合,得到渲染结果。
MRT中必须的信息:position(depth), normal, diffuse(texture)
可能需要的信息:specular, power, emissive, ao, material id
这些信息需要在这4个RT上用合理格式,合理的组织。这里还可以就存储空间和shader的复杂性做折衷。如只保存depth,然后在光照时计算position,以及用球面坐标保存法线。以目前的资料得出的结论是应该尽可能地pack数据,减少内存占用,多出来的若干条shader指令不会明显影响性能。
优化:
1.光源包围体的视锥剔除,遮挡剔除。
2.光源包围体投影后很小时剔除;若干个靠的比较近的小光源合并成一个较大的光源
3.光源包围体的backfaceculling
4.屏幕空间中没有被光源照到的,或者被更近的物体遮挡住的像素不需要光照计算,因此可以逐像素的深度剔除。有两种方法:a.使用正确的stencillightvolume。类似shadowvolume的方案,将渲染lightvolume的正反两面,得到正确的stencilmask,然后光照计算时使用stencilbuffer。这种方法可以得到正确的结果,但是需要渲染每盏灯时频繁改变renderstate,可能会带来一定性能上的损失。b.使用ztest,可以得到“一定程度上正确”的结果。
方向光和聚光灯可以使用基本的Shadow Map投影(正交投影,透视投影),点光源会复杂一些,需要使用Cube Shadow Map,由于较老的硬件不支持在不同纹理之间插值,使得不同纹理之间会有接缝(见[6] P171),在DX10中才支持Cube Map纹理之间的插值。
2) Shader可以访问深度和其他像素信息。
3) 每个象素对每个光源仅运行一次。也就是说,那些被遮挡的像素是不会被光照计算到的。
4) 材质和光照的Shader完全分开。
1) 较高的显存带宽占用
3) 无硬件反锯齿的支持
2) 在合适的Filter作用下,精确的边缘检测可以减少几何体边缘的锯齿。虽然这些方法并不像硬件全场景反锯齿那样精确,但是仍然可以以假乱真。
3) 对不透明物体采用延迟渲染,透明物体采用正向渲染,可以解决Alpha Blend的问题(Unity3D采用这种解决方案)。
PS:对某个具体项目的说明,包括其中的一些优化见资料[1],GPU GEMS2和3中都有这个引擎延迟渲染的文章,值得一看。
Deferred Shading(延迟渲染)的更多相关文章
- Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)【转】
Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置: http://blog.csdn.net ...
- Deferred Shading延迟渲染
Deferred Shading 传统的渲染过程通常为:1)绘制Mesh:2)指定材质:3)处理光照效果:4)输出.传统的过程Mesh越多,光照处理越费时,多光源时就更慢了. 延迟渲染的步骤:1)Pa ...
- Deferred Shading 延迟着色(翻译)
原文地址:https://en.wikipedia.org/wiki/Deferred_shading 在3D计算机图形学领域,deferred shading 是一种屏幕空间着色技术.它被称为Def ...
- opengl deferred shading
原文地址:http://www.verydemo.com/demo_c284_i6147.html 一.Deferred shading技术简介 Deferred shading是这样一种技术:将光照 ...
- Unity5 的新旧延迟渲染Deferred Lighting Rendering Path
unity5 的render path ,比4的区别就是使用的新的deferred rendering,之前的4的deferred rendering(其实是light prepass)也被保留了下来 ...
- Deferred shading rendering path翻译
Overview 概述 When using deferred shading, there is no limit on the number of lights that can affect a ...
- Unity的Deferred Shading
什么是Deferred Shading Unity自身除了支持前向渲染之外,还支持延迟渲染.Unity的rendering path可以通过Edit/Project Settings中的Graphic ...
- DirectX11 With Windows SDK--36 延迟渲染基础
前言 随着图形硬件变得越来越通用和可编程化,采用实时3D图形渲染的应用程序已经开始探索传统渲染管线的替代方案,以避免其缺点.其中一项最流行的技术就是所谓的延迟渲染.这项技术主要是为了支持大量的动态灯光 ...
- DirectX11 With Windows SDK--37 延迟渲染:光源剔除
前言 在上一章,我们主要介绍了如何使用延迟渲染,以及如何对G-Buffer进行一系列优化.而在这一章里,我们将从光源入手,讨论如何对大量的动态光源进行剔除,从而获得显著的性能提升. 在此之前假定读者已 ...
随机推荐
- hdu 4606 简单计算几何+floyd+最小路径覆盖
思路:将所有的直线的两个端点和城市混在一起,将能直接到达的两个点连线,求一次floyd最短路径.二分枚举bag容量,然后按给的要先后占领的城市由前向后,把能到一步到达的建一条边.然后求一次最小路径覆盖 ...
- JQuery Mobile页面加载处理
在弄移动Web时采用了JQueryMobile框架. 奇怪的是 在使用页面加载 时 事件无效 我尝试了两种方法: $(document).ready(function(){ //do events } ...
- Mysql增加主键或者更改表的列为主键的sql语句
...
- Oracle 一些操作
Achivelog ============================ alter system set db_recovery_file_dest='F:\ORACLE\recovery_ar ...
- 第四十四篇、iOS开发中git添加.gitignore文件
.gitignore文件可以直接使用https://github.com/github/gitignore 1.在项目中设置忽略文件(1)将从github上荡下来的对应的.gitignore文件(Sw ...
- Cocos2d-x开发实例介绍帧动画使用
下面我们通过一个实例介绍一下帧动画的使用,这个实例如下图所示,点击Go按钮开始播放动画,这时候播放按钮标题变为Stop,点击Stop按钮可以停止播放动画. 下面我们再看看具体的程序代码,首先看一下看H ...
- C++转到C#历程零基础知识(持续增加)
1.命名空间.类和源文件的关系:几个源文件用同一个命名空间时候,那么这几个源文件中的各个类之间的调用时可行的.他不会根据你的源文件分离而分开,因为最终编译后生成的是dll,这里来看你的几个源文件是没有 ...
- docker & nodejs & mongodb
Nodejs 应用简单的访问Mongodb 部署至Docker 1.本地简单的写能运行起来的一个nodejs (demo可写的更简单 一个post一个get即可) schemas user.js v ...
- [GeekBand] 探讨C++新标准之新语法——C++ 11~14
一. 可变参数模板(Variadic Templates) 在C++11中,出现了参数数目可变的模板,这部分在之前C++高级编程的时候就有学习到. 其实,在C中就有类似的设定.最常用的printf() ...
- Android 源码编译及常见错误及解决方法
最近要往arm开发板上移植android系统,大大小小的问题遇到了太多太多,都是泪啊.本人初接触嵌入式开发,对问题的根源不是太了解,不过好在每解决一个问题,便记录一下.话不多说,正式罗列问题: hos ...