文刀秋二,NVIDIA图形工程师

李林根、tcq、张志勇 等人赞同

这几个算法都是基于Prefilter场景中的信息存到一个Spatial的数据结构中,然后利用这个数据结构来再做渲染的。

Light Propagation Volume最早被Crytek发明(不过发明人现在在NVIDIA),它的做法简单总结是先生成一些虚拟的点光源来近似间接光照。每个点光源都要渲染一个reflective shadow map,然后将shadow map的光照信息注入到一个专门用球谐系数形式保存光照的volume 3D纹理里面,然后在纹理内部将最初的光照传递分散开来,渲染的时候直接从这个volume texture里读取要着色的点位置的颜色作为间接光照。这个方法可以达到不错的间接漫反射。缺点第一是volume texture太费显存,第二是基于体素化之后的光照信息也会有“格子”样的artifact,而且也是非常耗费计算的一个技术,因为每一个虚拟点光源都要渲染一个reflective shadow map。

Sparse Voxel Octree GI(又叫Voxel Cone Tracing)和VXGI都是NVIDIA的技术,VXGI就是SVOGI最终产品化后的名字,我个人其实更喜欢之前GiWorks的叫法- -。他们的做法是首先需要把整个场景体素化,然后把体素化的场景保存在一个三维的数据结构里。接着把直接光照通过用Reflective Shadow Map或者直接注入的方式把光照信息写到这个三维的数据结构里去,注入的时候需要。在渲染时得到像素的位置和法线信息之后就类似像光线追踪一样追踪一些Cone,追踪的时候要从体素化后并且又直接光照信息的数据结构里读取光照信息,然后得到光照作用在当前像素上。SVO和VXGI唯一的区别就是数据结构的不同。SVO是用的是Sparse Voxel Octree,遍历这种数据结构很麻烦也很慢。所以VXGI使用了Clip Map. Clip Map就是类似mip map的一种存储方式,只不过在最低LOD的几个level只保存了中心的信息,在算法里Map的中心当然是你的相机视点,也就是说离视点越远的地方场景的体素信息越粗糙。VXGI因为可以调整追踪的Cone的角度的大小,可以通过追踪非常细的Cone来近似Glossy的反射。VXGI的问题当然第一是在于每一帧都要做场景体素化(当然可以只体素化动态的部分)比较费时间,而且3d的文理会费比较多的显存,而且和LPV一样基于场景体素化的精度决定了光照的精度,所以也会有漏光等artifact存在。贴一个VXGI的文档:http://on-demand.gputechconf.com/gtc/2012/presentations/SB134-Voxel-Cone-Tracing-Octree-Real-Time-Illumination.pdf
这个网页有一些简单的介绍和demo视频: https://developer.nvidia.com/vxgi 不过需要翻墙可能。
不过值得一提的是NVIDIA的Maxwell GPU的架构的一些feature可以非常好的支持和加速VXGI的体素化等步骤。

总的来说这些算法都是将场景和光照信息通过某种prefilter的方式保存然后渲染的时候reconstruct回来的尝试。中间具体如何filter和reconstruct我认为现在都不能说是最佳的和精确的,还有探索的空间。同时它们也都是很expensive的技术,所以暂时并不普及。我这里的介绍也比较high level, 许多细节感兴趣还得自己看paper和code。

贴一些去年我参与的VXGI Demo的图片,在SIGGRAPH 2014上展示过:

UE4中早就实现了LPV,可以在Console中打开:https://docs.unrealengine.com/latest/INT/Engine/Rendering/LightingAndShadows/LightPropagationVolumes/index.html
我们组也已经把VXGI以库的形式整合到UE4中,并且还有在继续维护和开发VXGI:https://github.com/NvPhysX/UnrealEngine

补充一下引擎在默认的情况下是不实用他们做GI的。一般来说对于静态场景,烘培的光照贴图就能有非常好的效果了,不值得去付出这么大的额外计算时刻维护一个庞大的数据结构。如果你有非常多的动态物体,又有很多破碎等效果,VXGI在性能和效果上都是优于LPV的选择。

编辑于 2015-06-23 10 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

赞同4 反对,不会显示你的姓名

叛逆者,KlayGE创始人

没有人、fanye、Wu Fan 等人赞同

ue4原本是有svogi的,并且比原作者的实现快了8-20倍。但即便如此,性能和内存需求仍然不能满足console,睡觉PS4/Xbox one的机能都那么差呢。当时Tim Sweeney是拍着桌子抱怨的,说这TM至少得高5倍的GFlops才行,老子不玩了,删掉svo,爱咋咋地。

LPV基本已经没有存在的必要了。性能和效果都不如后者。

发布于 2015-06-29 3 条评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

赞同0 反对,不会显示你的姓名

逍遥剑客,鹅厂里的猿类

离线计算总是需要的,你不能逼玩家升级硬件不是
发布于 2015-06-22 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

赞同0 反对,不会显示你的姓名

陶仁贤,引擎布道者

Nvidia做的UE4的 VXGI效率已经不错了,可以试试看
发布于 2015-07-19 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

赞同0 反对,不会显示你的姓名

侯烁

lpv的想法是快速生成点云然后用点云做间接光照,缺点是生成点云太费和物理上的不自然
vxgl=svogi,物理上合理,就是体素化动态物体太费+对传统管线改造太大希望nvidia专卖出套api做这个
发布于 2015-07-05 添加评论 感谢

分享

收藏 • 没有帮助 •

举报

• 作者保留权利

匿名用户

说句题外的,CryEngine最新的版本也支持SVOGI了,按文档里说法在比较低的精度下可以在X1上跑到4ms~5ms
Voxel-Based Global Illumination
官方开发者论坛上的人贴的测试效果图

不过这个feature只做了一半,还不支持动态物体……

pv,svogi,vxgi,各自的优缺点在哪,ue4还有可能把svogi加进去吗相关推荐

  1. linux下磁盘管理之利器 lvm使用介绍

    点评:LVM(Logical Volume Manager)是一个应用于Linux的内核的逻辑卷管理器,是Linux环境下对磁盘进行分区管理的一种机制 一.LVM 简介 LVM(Logical Vol ...

  2. linux vg lv pv

    = pv由物理卷或者分区组成   pv可以组成一个或者多个vg     vg可以分成多个lv 方便扩展 pvs vgs lvs 可以查看当前存在的pv vg lv 我的centos硬盘20g 使用了一 ...

  3. 【ML】逻辑回归适用场景-原理-优缺点汇总:

    所以文档都用来做笔记,便于翻阅复习,如有侵权,联系我哈,可删除~~ 什么是逻辑回归: LR是linear regression还是logistics regression呐? 两者的区别:线性回归的预 ...

  4. 逻辑卷管理器:PV、PE、VG、LV

    LVM:Logical Volume Manager,逻辑卷管理器. 重点:可以弹性的调整文件系统的容量,而不在于性能和数据安全上面,因此如果强调性能和备份,那么直接使用raid即可,不需要用到LVM ...

  5. 怎样评价推荐系统的结果质量?

    本文由作者 达观数据 于社区发布 推荐系统是互联网发展至今最常见也重要的技术之一.如今各类APP.网站.小程序等所有提供内容的地方,背后都有推荐系统在发挥作用. 开发好一套真正优秀的推荐系统非常有价值 ...

  6. C++秋招春招面试总结

    1.1指针和引用 (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来 的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int ...

  7. linux系统运维面试2000多题

    技术问题 1. IDC机房的域名怎么维护的 2. 怎么根据nagios报警做出调整的 3. nagios的状态还有怎么添加监控服务 4. 怎么监控CPU的状态 5. 从时候接linux的?都用过哪些系 ...

  8. 远程字典服务Redis,感谢B站黑马程序员,多多三连

    目录 1.数据存储的解决方案(电商场景) 2.远程字典服务Redis介绍 2.1 基本操作 2.2 数据存储类型 3.数据类型 3.1 string 3.1.1 string类型数据基本操作 3.1. ...

  9. linux小知识总结

    Linux开机启动过程 上电自检,引导装载程序,内核初始化,启动systemd所有进程之父. 真机-centos8.2,虚拟机-centos7.9 8.2支持podman 操作命令 lsblk 查看分 ...

最新文章

  1. 每日一皮:一个名字打败对手的经典案例...
  2. android6.0 百度地图,Android百度地图SDK 导航SDK2.0结合定位SDK6.0.5的导航参数设置方法...
  3. Anaconda:Anaconda安装图文教程及其tensorflow安装、运行、测试之最强详细攻略
  4. 2018-07-10 为Chrome和火狐浏览器编写扩展
  5. computational science education project
  6. 久等了!支付宝集五福活动官宣: 今年又有新玩法
  7. 什么是Protocol Buffers / protobuf / protobuffer?一种服务器和客户端的消息交互方式
  8. 【Unity开源项目精选】Entitas:Unity DOTS的先行者
  9. MySQL Create Table创建表
  10. Sophos 修复严重的防火墙 RCE 漏洞
  11. 各数据类型的取值范围及占用字节数。。
  12. Ionic开发App中重要的部分
  13. hdoj1297Children‘s Queue(递推+大数加法)
  14. office2016 + visio2016
  15. VTP协议原理及配置
  16. 数据可视化,2022的春运地图
  17. 进度条程序详解(Linux)
  18. 如何避免音频爆音/杂响?音频爆音常见的解决办法
  19. PLC与运动控制器有什么不同?为什么运动控制器比PLC好?
  20. CSS-Sprite(雪碧图)

热门文章

  1. 在哪里买铁甲格斗机器人_铁甲雄心Ⅱ火了 优必选“超变铁甲”掀起闯关赢免单热潮...
  2. 天不知道地知道你不知道我知道谜底_冷门还免费!宝鸡这几个小众红叶观赏地,资深老司机都不一定知道...
  3. 下标要求数组或指针类型_算法一看就懂之「 数组与链表 」
  4. linux 日志面试题,Linux运维 | 面试题
  5. vue 多个回调_Vue 进阶面试必问,异步更新机制和 nextTick 原理
  6. python实现两个接口的依赖关系
  7. 动态规划经典题目_动态规划经典题目:鸡蛋掉落(附视频讲解)
  8. ssd目标检测训练自己的数据_目标检测Tensorflow object detection API之训练自己的数据集...
  9. 私有静态成员变量,在多线程环境,别的线程会修改当前线程的变量值
  10. 无心剑中译柒歌《爱的回音》