解析全局光照Global Illumination Explained

前言:Global Illumination全局光照技术是实时渲染的必然发展方向。我参考了一些研究成果,琢磨了一下,让更多的人可以理解这项“古老”的技术。

Front Line

虽然说,如今的GPU速度已经非常之快,并行浮点计算能力已经相当的强大,但是由于很多人依旧使用传统的Phong局部光照模型对场景进行Shading处理,所以成像效果上还远远不能够与离线渲染的图像相比。如让我们目瞪口呆的Unreal Engine3,技术规格依旧是48bit Color Phong HDR。虽然人们已经开始普遍的使用Shading Language,但是光栅化、对屏幕空间差值的操作依旧没有变化。这一点不同于Pixar RenderMan。重要的原因就是,无法精确的从物理上模拟光线在场景中的交互过程。对于PC机平台来说,由于硬件性能的限制,实时光线跟踪还是不现实的事情,但是我相信未来人们一定可以在PC机平台上置身于可以和电影画面媲美的场景中交互、游戏。

经典全局光照模型的公式如下:

场景的每一个物体,既有可能是发光体(萤火虫、火把),也有可能是接受光线的物体(举火把的人)。意义等同于,物体的每个点都可能会互相影响。让我们想象,有一个模型S由许多个三角形组成,以每个顶点Vertex为中心,以这点的向量Normal为法向量,构造一个半径为1的半球体Normalized Hemisphere。这样的做法类似于Ambient Occlusion的步骤。当我们从y发出一条光线以ωi的方向入射的时候,函数h返回光线与模型的第一个交点。这里可以进行并行优化。θi是指ωi和Normal的夹角,cosθi将射入的辐射光线投影到Normalized Hemisphere上。模型上每一个点y的辐射度L等于,这个点本身的辐射度Le与反射的辐射度之和。可以使用在半球上取一些点采样,进行测试,或者使用更精确不过更加耗时的Monte Carlo采样法。我们也可以简单的把上面的积分式写成这样的简单式子:

fr是BRDF函数,表现了模型表面的颜色光泽等特性。一般来说这个函数的计算依赖于辐射的入射方向ωi,辐射的反射方向ωr,以及y。为了简化BRDF的表达,我们将公式简化如下,这样表面将只存在各向同性漫反射:

pd(y)是相应位置的漫反射贴图数值。我个人觉得大家如果不知道如何实现BRDF,可以参考GPU Gems1上的那篇《Spatial BRDFs》一文。

现在我们有了4个量,(S, fr, Le,Ψ),最后一个是什么呢?这是处理微平面反射向量集合的函数,可以从理论上分析得到。此时,再试图分解这个公式已经没有多少意义,不如直接用一个近似模型简化:

我们直接使用这个公式得到,穿过像素Pmn光的平均辐射度值 —— 我们知道“摄象机”上有一个个像素,把yf想象为一个针孔,ωyf := P – yf作为方向,XPmn是像素特征函数,δ是Kronecker Delta函数。(是什么东西……)

Alexander Keller在他的《Instant Radiosity》中展现了一种算法,目的是为了快速计算光照特性实现实时渲染。想象场景由有限多的虚拟光源组成。对于像素Pmn,我们计算通过这个像素的平均辐射度:

最后一项TmnL决定了最少有一条辐射光线通过像素Pmn。当场景中有M个光源的时候,我们可以简单的进行累加:

对于最右边的求和式,

  Li是辐射度,Pi是第i个光源的位置。Tmn的数值可以用普通图形卡计算得到,直接计算当场景中只有一个光源存在时每个像素的亮度数值。这个算法的最大好处就是在性能和质量上可以寻求平衡,通过控制采样点数和光源数目,也就是控制多通道渲染的次数。

Behind the Enemy

Monte Carlo方法的大名想必大家都听说过。它需要一个随机数发生器,而且这个发生器对统计结果得质量来说非常重要。这里省略了详细的推导过程,大家可以看原文[1]。

首先想象从光源发出N个粒子,从光源开始,赋予初始的辐射强度Le,射向场景,p-bar≈||Tfd||约等于场景的平均反射率。这些虚拟的光子不断地反射折射,不断地点亮,直到自己强度为0。伪代码如下:

其中,入射方向可以使用下列公式计算得出:

这种方法的思路被用于目前大部分的Monte Carlo光线跟踪渲染引擎中,比如赫赫有名的Mental Ray,而且可以同时使用GPU与CPU进行加速渲染,缺点是多次累计填充率极高。

Continue Fighting

可以看我的那篇斯图加特大学光线投射引擎的分析文章。

Conclusion

事实上,正如[2]中所说,实时光线跟踪还需要克服下面几点难点:

Parallesim并行:无论是何种方法,为了在有限计算能力下得到最大的性能提升,并行处理都是必须的。这一点在GPU上得到充分表现,而CPU上的并行计算依赖于有经验的设计和出色的算法。

Efficiency效率:我们需要在画质和速度中追求一个平衡点,找到最适合的采样数目,避免额外的而对画质的提升没有帮助的计算。

Independence From Geometry独立于几何体:事实上这才是真正我们需要关注的,毫无疑问,体渲染光线投射在实现上更加的有效,可是它只能处理Volumn Texture,体积大处理速度慢来源少;传统的模型体积小来源广泛,优化分割算法成熟,但是却更适合光栅化处理,速度更快,效果也不差。而且真实的场景中,Raytracer应该无论是Volumn Textures和Indexed Models都可以一视同仁的处理。

我相信会有越来越多的程序依赖或者逐渐采用全局光照技术,从GPU Gems1/2中的静态/动态遮挡算法的进化,到NVIDIA OpenGL SDK 10里Render To 3D Texture的展示,还有采用Volumn Rendering技术的新一代游戏的出现,全局光照技术将应用的越拉越广泛。

相关技术文档下载

[1]Alexander Keller Instant Radiosity

[2]Wald et al. Realtime Ray Tracing and its use for Interactive Global Illumination

以后我会详细的收集相关技术文章给大家打包下载

有几本书我很感兴趣,不知道什么地方有的下载,麻烦直到的朋友告诉我一声

Programming Mental Ray和Realtime Rendering

谢谢啦

全局光照技术解析Global Illumination Explained相关推荐

  1. 实时全局光照(Real-time Global Illumination)与Reflective Shadow Maps(RSM)

    文章目录 1 概述 1.1 什么是全局光照(GI)? 1.2 光照模型处理间接光照的方法 1.3 实时全局光照的思想 2 GI的主要问题 3 方法一:Reflective Shadow Maps(RS ...

  2. Godot 4.0中的基于有向距离场SDF(Signed Distance Field)的实时全局光照技术

    原文地址 Godot官网 <Godot 4.0 gets SDF based real-time global illumination> 作者 Juan Linietsky 6月28日 ...

  3. [sig16]《使命召唤》中的全局光照技术

    Treyarch是<使命召唤:黑色行动>系列的开发商,使命召唤系列的成功不必细说,treyarch也是一个在技术上很有探索的公司,在<使命召唤:黑色行动>1中率先使用基于物理的 ...

  4. [gdc12]《孤岛惊魂3》的全局光照技术

    http://www.gdcvault.com/play/1015326/Deferred-Radiance-Transfer-Volumes-Global gdc12年的,farcry3使用的全局光 ...

  5. Unity 5 中的全局光照技术详解

    简介 全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常有挑战性,付出的代价也高,正因为如此,现代游戏会先一定程度的预先处理这些计算,而非游戏执行时实时运算. ...

  6. 全局光照技术:Precomputed Radiance Transfer

    1. 介绍 物体在不同光照下的表现不同,PRT(Precomputed Radiance Transfer)是一 个计算物体在不同光照下表现的方法.光线在一个环境中,会经历反射,折射, 散射,甚至还会 ...

  7. 【技术美术图形部分】PBR全局光照:理论知识补充

    写在前面 最近做东西的流程是这样的,想实现一个风格化森林小场景,场景体现的主体是风格化树和交互草 --> 于是用了两天时间学SpeedTree做树模型 --> 用了两天时间SD做了树干贴图 ...

  8. (中文详解篇)smallpt: 99行代码完成全局光照Path Tracing

    目录 0. 什么是SmallPT Features 1. 光线追踪需要了解知识 1.1 什么是全局光照? 1.2 渲染方程 2. SmallPT代码分析 2.1 代码块1 2.2 代码块2 2.2.1 ...

  9. NVIDIA的黑科技3:VXGI体素全局光照

    每一个行业都有自己的"圣杯",例如能源方面的核聚变.医药方面的癌症特效药以及空间探索方面的超光速推进力. 任何领域中"圣杯"的定义都是难以实现和代价高昂的,或者 ...

最新文章

  1. 还找不到想要的文章吗?公众号搜索方法大全
  2. 基于“飞桨”的深度学习智能车
  3. 转Python 标准库 urllib2 的使用细节
  4. linux内核地址映射,Linux内核设备驱动地址映射笔记整理
  5. 灰度图像阈值化分割常见方法总结及VC实现
  6. Windows下通过FTP自动备份数据到服务器并删除指定天数前的备份
  7. bootstrap 模态框满屏_如何设置Bootstrap模态框modal的高度和宽度?
  8. myeclispe快捷键一\(≧▽≦)/终于也收藏了
  9. UVA - 572 Oil Deposits
  10. VS2017打开低版本的VS MVC架构的项目的时候需要修改的地方
  11. Luogu2257 YY的GCD
  12. 教师工作量管理系统设计_教育培训机构为什么一定要用管理系统?
  13. 移远EC20开发环境搭建
  14. NVivo的节点矩阵
  15. linux内核显卡驱动架构,Linux N卡驱动年终盘点:干得漂亮
  16. 在网页中实现:手势解锁密码
  17. 写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket
  18. 在nuxt中使用swiper轮播
  19. 【Web技术】1391- 页面可视化搭建工具前生今世
  20. 了解黑帽白帽灰帽之间的区别?

热门文章

  1. python game_Python游戏
  2. 雅克德罗机器人_什么腕表配饰值得买 带货明星们都已经帮你选好了
  3. python求数字平均值_Python简单计算数组元素平均值的方法示例
  4. 6_机器翻译与Seq2Seq模型
  5. mvp模式 php,Hyper-V - 增强会话模式
  6. Django讲课笔记08:定义商城的数据模型
  7. Java案例:Swing版记事本
  8. 【BZOJ1415】【codevs1784】聪聪与可可,概率DP
  9. stm32定时2通道3映射_stm32学习笔记之问题总结
  10. visualmap超过范围改变颜色_高动态范围(High-Dynamic Range,简称HDR)