转载请注明出处为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的神话相关推荐

  1. KlayGE 4.0中Deferred Rendering的改进(五)完结篇:Post process

    转载请注明出处为KlayGE游戏引擎 上一篇分析了KlayGE中实现实时全动态GI的方法,本篇是这个系列的完结篇,主要讲流水线的最后一段:Post process. Post process 在Kla ...

  2. Android 8.0学习(31)---Android 8.0 中的 ART 功能改进

    Android 8.0 中的 ART 功能改进 在 Android 8.0 版本中,Android Runtime (ART) 有了极大改进.下面的列表总结了设备制造商可以在 ART 中获得的增强功能 ...

  3. net应用程序中发生了未经处理的异常怎么办_介绍一些在.NET Core 3.0中引入的诊断改进工具...

    编者按:即使.NET Core3.1.5已经发布,在进行.NET Core的性能诊断时,我们有时依然不知该从何处下手,那这篇介绍.NET Core3.0中引入的诊断工具,或许能为我们提供参考. 在.N ...

  4. Swift 4.0 中对 Dictionary 的改进(转载)

    Swift 4 发布已经有一段时间了,不知道大家有没有切换到 4.0 版本. 这次 4.0 更新给我最大的感受就是没有了前几次升级的跳跃式变化. 不用为了更新语言版本,完全推翻已有的项目,这也是 Sw ...

  5. 【Elasticsearch】Elasticsearch 6.0中节省空间的改进

    1.概述 翻译:Space Saving Improvements in Elasticsearch 6.0 Elasticsearch 6.0提供了两项重大改进,以帮助最小化索引存储大小.关于改进的 ...

  6. 探讨ASP.NET2.0中的Web控件改进技术

    全面探讨ASP.NET 2.0中的Web控件改进技术之概述(一) ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这 ...

  7. 探讨ASP.NET2.0的Web控件改进之概述

    作者: 朱先忠编译 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩:但是,你是否了解到有关定制Web控件开发方面的重 ...

  8. ASP.NET 2.0 中改进的缓存功能

    摘要:本文中,Stephen Walther 将重点介绍 ASP.NET 2.0 中新增的缓存功能,以及如何使用这些新功能改进 ASP.NET 应用程序的性能和可扩展性.(本文包含一些指向英文站点的链 ...

  9. 延迟渲染(Deferred Rendering)

    什么是延迟渲染?( Deferred Rendering) 在计算机图形学中,延迟渲染( Deferred Rendering) ,即延迟着色(Deferred Shading),是将着色计算延迟到深 ...

最新文章

  1. java resultset wasnull_Java Spring – RowMapper ResultSet – 整数/空值
  2. tail -f 和 -F 的用法
  3. 官方宣布:谷歌开发者中国网站正式发布!
  4. MATLAB 与 Excel 接口
  5. 腐蚀函数cvErode 和 膨胀函数cvDilate
  6. 使用路由和远程访问服务为Hyper-V中虚拟机实现NAT上网
  7. 鸭子类型duck typing(动态)
  8. CentOS 7安装MongoDB
  9. 红帽--RHCE你需要知道的些事情
  10. 1.Ubuntu Server下搭建LAMP环境
  11. udhcpc 和 udhcpd
  12. 微信公众号怎么集赞服务器,微信公众号分享集赞吸粉方案,人人可复制
  13. 移动网购掀起新一轮掘金潮 电商群启战略布局(转)
  14. 2020第六届上海市大学生网安大赛Misc|writeup
  15. 系统运维工程师面试的11大热门问题
  16. roce流量抓包 linux,roce性能测试方法
  17. 离职“招黑”的6种行为,最后一个太惹人反感!
  18. c语言编译kbhit出现问题,在VC++中运行出现error C2065: 'kbhit' : undeclared identifier,什么意思?怎么调试?...
  19. 遭遇Backdoor.Gpigeon.2007.ca,Trojan-PSW.Win32.QQRob.lg,Backdoor.Win32.Agent.bcn等3
  20. TMS320F28379D——时钟系统

热门文章

  1. java程序_Java程序员必备----Java命令大全
  2. mysql mydump还原_用mydump对所有数据库进行备份,还原具体案例
  3. c语言尖括号 注释,关于C语言include尖括号和双引号的对话
  4. 知道坐标matlab三维作图,已知点坐标,要求根据坐标作出三维曲面图
  5. 怎样用MATLAB画二次函数曲线,MATLAB 二次函数的画图.doc
  6. 2023年考研之路或将更难
  7. Hive | 加载数据后,出现字段显示为 NULL的问题
  8. python 解压zip文件_Python 解压缩文件详解
  9. TCP粘包和拆包原因
  10. Python Threading 多线程编程