KlayGE 4.0中Deferred Rendering的改进(四):GI的神话
转载请注明出处为KlayGE游戏引擎
上一篇解决了透明物体的渲染问题;本文将挑战另一个实时渲染的神话,实时全局光照(GI)。
实时全动态GI
目前direct lighting在游戏中日趋成熟,比较前卫的游戏引擎已经不满足于diect lighting的效果了,逐渐开始尝试indirect lighting。早期的方法有通过离线渲染light map来实现静态场景、静态光源的GI。接着出现了PRT,可以处理静态场景、动态光源。CE3用了Light Propagation Volumes的方法,不需要预计算,可以产生动态场景、动态光源的diffuse GI。不过其速度和质量确实不敢恭维。难道就不能有全动态场景、全动态光源、diffuse和specular通吃的实时GI方法吗?有!Multiresolution splatting for indirect illumination(MRSII)前来救驾。
在KlayGE 3.12中,团队成员atyuwen就已经实现了MRSII。经过半年多的改进,这种GI方法已经融入了新的Deferred Rendering框架中,并且性能也得到了很大的提升。下面就让我们来看看这种神奇的GI。
MRSII的渲染流程如下(感谢vanish整理了此流程图):
首先,G-Buffer需要做mipmap,接着在每一层检测深度和法线的间断点,把那些间断点在stencil buffer中标记出来,得到了这样的stencil buffer:
和之前的stencil规则一样,最高位是1表示忽略。所以灰色的pixel是可以忽略掉的,黑色的是需要计算光照的。可以看出黑色所占的面积并不大,绝大部分pixel都被略过了。
另外,还需要生成一个Reflective shadow map。和shadow map类似,RSM也是从光源视角渲染一遍场景。除了深度以外,RSM还需要保存normal和flux信息。把RSM采样出一些点,比如256个,作为 虚拟点光源(VPL)。目前KlayGE里面用的是均匀采样的方式,以后将改成importance sampling的方式提高VPL分布效率。
最后,每个VPL都可以根据BRDF生成一个light volume。用这些light volume去照亮G-Buffer的每一层。初始的light volume是个半球,在它的vertex阶段会根据各方向反射的亮度拉出某些顶点,生成一个奇怪形状的light volume。这个阶段因为涉及到大量的填充和计算,非常耗时,但因为stencil test是打开的,绝大部分pixel都会被挡掉,真正参与计算的pixel数远远少于G-Buffer的总pixel数,GI因此得到明显的加速。经过 测试,在目前的场景下,如果只用一层G-Buffer(也就是不用multiresolution),速度只有用三层的一半。如果大于三层,速度已经没有 提高了。所以默认就选了三层G-Buffer。
在生成每一层的indirect lighting结果之后,还需要做一个特殊的插值upsampling,才能得到光滑的结果。这个插值在MRSII的原paper中有描述,这里就不累赘了。
如果只是用一般的最近点插值或者双线插值,结果会有很多悲催的锯齿:
最后,把indirect lighting加到direct lighting中,继续做下一步的shading pass。最终结果如下:
比较只有direct lighting的结果,可以看到右边和地面被照亮了:
用了MRSII后,对于512×512的RSM、256个VPL、三层G-Buffer的情况下,GI在GTX480上只需要1.09ms、在 9800GT上需要4.3ms。目前还有不少性能空间可以挖掘,我预计在同质量的情况下,最终能达到在GTX480上0.5ms、9800GT上 2.5ms的速度。
这套GI的框架不但可以做这样的反射型indirect lighting,也可以做caustics这样的高频反光,也可以处理sub-surface scattering等材质效果。在KlayGE以后的版本中,MRSII将会得到持续的发展。
本篇详细讲解了实时GI的做法,下一篇是关于post process的改进。
KlayGE 4.0中Deferred Rendering的改进(四):GI的神话相关推荐
- KlayGE 4.0中Deferred Rendering的改进(五)完结篇:Post process
转载请注明出处为KlayGE游戏引擎 上一篇分析了KlayGE中实现实时全动态GI的方法,本篇是这个系列的完结篇,主要讲流水线的最后一段:Post process. Post process 在Kla ...
- Android 8.0学习(31)---Android 8.0 中的 ART 功能改进
Android 8.0 中的 ART 功能改进 在 Android 8.0 版本中,Android Runtime (ART) 有了极大改进.下面的列表总结了设备制造商可以在 ART 中获得的增强功能 ...
- net应用程序中发生了未经处理的异常怎么办_介绍一些在.NET Core 3.0中引入的诊断改进工具...
编者按:即使.NET Core3.1.5已经发布,在进行.NET Core的性能诊断时,我们有时依然不知该从何处下手,那这篇介绍.NET Core3.0中引入的诊断工具,或许能为我们提供参考. 在.N ...
- Swift 4.0 中对 Dictionary 的改进(转载)
Swift 4 发布已经有一段时间了,不知道大家有没有切换到 4.0 版本. 这次 4.0 更新给我最大的感受就是没有了前几次升级的跳跃式变化. 不用为了更新语言版本,完全推翻已有的项目,这也是 Sw ...
- 【Elasticsearch】Elasticsearch 6.0中节省空间的改进
1.概述 翻译:Space Saving Improvements in Elasticsearch 6.0 Elasticsearch 6.0提供了两项重大改进,以帮助最小化索引存储大小.关于改进的 ...
- 探讨ASP.NET2.0中的Web控件改进技术
全面探讨ASP.NET 2.0中的Web控件改进技术之概述(一) ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这 ...
- 探讨ASP.NET2.0的Web控件改进之概述
作者: 朱先忠编译 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩:但是,你是否了解到有关定制Web控件开发方面的重 ...
- ASP.NET 2.0 中改进的缓存功能
摘要:本文中,Stephen Walther 将重点介绍 ASP.NET 2.0 中新增的缓存功能,以及如何使用这些新功能改进 ASP.NET 应用程序的性能和可扩展性.(本文包含一些指向英文站点的链 ...
- 延迟渲染(Deferred Rendering)
什么是延迟渲染?( Deferred Rendering) 在计算机图形学中,延迟渲染( Deferred Rendering) ,即延迟着色(Deferred Shading),是将着色计算延迟到深 ...
最新文章
- java resultset wasnull_Java Spring – RowMapper ResultSet – 整数/空值
- tail -f 和 -F 的用法
- 官方宣布:谷歌开发者中国网站正式发布!
- MATLAB 与 Excel 接口
- 腐蚀函数cvErode 和 膨胀函数cvDilate
- 使用路由和远程访问服务为Hyper-V中虚拟机实现NAT上网
- 鸭子类型duck typing(动态)
- CentOS 7安装MongoDB
- 红帽--RHCE你需要知道的些事情
- 1.Ubuntu Server下搭建LAMP环境
- udhcpc 和 udhcpd
- 微信公众号怎么集赞服务器,微信公众号分享集赞吸粉方案,人人可复制
- 移动网购掀起新一轮掘金潮 电商群启战略布局(转)
- 2020第六届上海市大学生网安大赛Misc|writeup
- 系统运维工程师面试的11大热门问题
- roce流量抓包 linux,roce性能测试方法
- 离职“招黑”的6种行为,最后一个太惹人反感!
- c语言编译kbhit出现问题,在VC++中运行出现error C2065: 'kbhit' : undeclared identifier,什么意思?怎么调试?...
- 遭遇Backdoor.Gpigeon.2007.ca,Trojan-PSW.Win32.QQRob.lg,Backdoor.Win32.Agent.bcn等3
- TMS320F28379D——时钟系统
热门文章
- java程序_Java程序员必备----Java命令大全
- mysql mydump还原_用mydump对所有数据库进行备份,还原具体案例
- c语言尖括号 注释,关于C语言include尖括号和双引号的对话
- 知道坐标matlab三维作图,已知点坐标,要求根据坐标作出三维曲面图
- 怎样用MATLAB画二次函数曲线,MATLAB 二次函数的画图.doc
- 2023年考研之路或将更难
- Hive | 加载数据后,出现字段显示为 NULL的问题
- python 解压zip文件_Python 解压缩文件详解
- TCP粘包和拆包原因
- Python Threading 多线程编程