Talk about light transport methods

丁斐
• 阅读 3933

最近又再次回顾了iliyan GeorgeV的light transport course,感觉对于算法背后的思想方法和数学原理又有了很多的启发和思考,因此写下来权当记录。

渲染问题的本质是解渲染方程,实际上也就是解光场在场景中与材质表面相互作用的结果和分布,用数学上的话来说实际上也就是解一个光的路径积分的问题,蒙特卡洛方法去解决也就是朝场景发射光线,然后与表面相互作用,如果击中光源就得到辐射值,最后取均值。这种方法的核心问题在于当光场复杂场景复杂时,盲目而均匀发射的光线样本很难打中光源而成为有效样本(反弹的深度达到了限制,或者能量被吸收干净),造成最终结果的噪声很大。所有的light transport方法的目的就是去把握这个复杂而且未知(在你开始渲染之前你没法知道)光分布的重要性,从而更有效的发射样本解决问题。

光场分布的复杂性是不言而喻的,不仅光源可以分很多种,数目也可以很多,材质表面的复杂属性也可能导致光的分布被改变,最典型的就是焦散。light transport方法解决的问题有点类似先有鸡还是先有蛋的问题,只有当你渲染完成之后你才能知道这个高维函数真实的样子,但是你又必须了解这个函数的样子从而去根据他的形状在强的地方多发射些样本。

这类问题实际上在科学计算领域比较常见,因此现有的很多方法都是借鉴了科学计算中的方法,大体来说可以分成两类,一类属于经典蒙特卡洛方法,另一类是mcmc,也就是利用了markov chain monte carlo。当然以后肯定还有更多的算法和更多学科之间的交叉出现。

先来看最简单的path tracing,前面已经提到过,path tracing是向场景中发射光线并希望他能够顺利打中光源产生贡献,这种方法一般在科研领域叫做implicit sampling(光源并不一定能被击中)问题在于这种方法收敛速度很慢,一个很常见的改进就是所谓的explicit sampling,也就是在每一个光线与物体表面交到的点进行一次与光源的连接尝试,如果没有遮挡(科研上一般把这种光线称为shadow ray)就把这两种结果按照MIS的方式结合(之前的文章说到过,这是一种结合两种采样方法的方式)。这样的改进实际上增加了有效样本的概率(利用了光源的信息)因此提高了收敛速度。

Talk about light transport methods

Bidirectional path tracing:刚才所说的方法实际上在复杂场景中,或者存在着caustic路径的场景中依然是效果很差的,想象一个主要用间接照明照亮的场景,上面的两种方法都很难得到击中光源的样本。不过shadow ray的思想实际上启发了BDPT的算法,如果我们从光源和摄像机都发射光线,并且在它们每前进一步的时候都尝试去用shadow ray连接两个端点,那么我们找到有效的光的采样方法的概率就增大了很多。
Talk about light transport methods

如图所示,实际上我们可以想象这所有的对光路径采样方式的集合构成了一个空间(也就是所谓的path space)但是在这个路径空间中由于场景的复杂性我们没法知道哪种方法是最好的,哪种方法又几乎打不中光源,因此最保险的方法就是每种都进行一次尝试,然后把所有的结果结合起来,这也就是bidirectional的核心思想了。

BDPT已经是一个非常鲁棒的算法,能够应对大部分的复杂光照和场景,不过如果你细心的话肯定会想到如果这所有的采样方式都很差怎么办?那这种情况下BDPT的效果不是与Path tracing一样糟糕么?很遗憾,这种场景真的存在。

考虑一个阳光照耀下的水池的光路:

Talk about light transport methods

然后尝试着用我们的connection的方法去连接路径中的每个节点,我们会发现,每一种连接都没法进行,因为纯镜面和diffuse之间没法进行shadow ray 连接(或者说连接总是失败)而从光源发出的光没法打中我们理论上无限小的相机,于是我们唯一的希望只能靠从摄像机发出的光线,希望他能随机打中光源(没有更好的采样方式了)那么如果光源体积很小的情况下,情况就会很糟,收敛速度就会狠惨不忍赌,这也就是科研文章常提到的SDS路径。

Vertex Connection and merging: 对于上面的问题一种很明显的思路就是既然我们的连接失败,那把连接的条件放宽可不可以呢?但是放宽的连接条件怎么去精确近似纯镜面呢?这样的方法真的可以有,最近提出的VCM方法就是这个思路:

Talk about light transport methods

图中的x1和x2之间的连接是很困难的,因为一个是纯镜面,一个是diffuse,但是假如现在我们从x1发射光线得到交点x2‘并且对于一定半径内的x2 x2’我们把他当成一个vertex,那么我们得到有效采样方法的概率自然就大很多。

换个角度看图的右边,我们会发现这种方法与另一种统计有偏的渲染方法photon mapping有类似之处,VCM把左边类似BD的方法叫做vertex connection, 右边类似photon mapping 的方法叫做vertex merging,而VCM等于是再次在两种方法之间做了一个结合(MIS)在Vertex connection效果好的地方用connection,而在Vertex connection失效的地方用merging.

那么对于merging造成的偏差,VCM采用的是逐步缩小merging的半径来达到最终的一个统计无偏结果。

实际上merging的优势并不是在于他的采样方法比传统方法效率高,而在于他能够重用大量的light path,通过查找photon map的方法用同样的光线实现巨大量的样本收集(空间换时间)。这些实现细节具体可以参阅论文。

VCM能很好处理SDS路径问题,在各种场景中的适应性都比较好。但是我们也看到从PT到BD到VCM算法实现的复杂性越来越高,VCM还需要巨量内存支持photon map,所以工业界基本上还停留在PT的阶段(因为它足够快,适应性强)如何找到这些高级算法和实际生产的结合点,还很值得研究。

从以上的论述中可以看出传统蒙特卡洛方法的特点:暴力搜索每一种可能的采样方法,尽量避免完全靠随机采样去击中目标,如果我们把思路扩展到机器学习和优化理论上的话,就会发现这些方法都是力图求一个local的最优解,换句话说,这些方法找到的有效路径往往是local最优的,如果跳出这个local的限制,每次都尝试去寻找全局最优的采样方式呢?MLT就是把metropolis hasting 算法应用在light transport中的一种算法,下一篇再说把。。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
2020低代码平台进展跟踪
前言去年已经做过一次低代码平台的分享和调研,当时看到OutSystems时感觉变革可能要来了,但到现在还是没有太大的变化。但最近看到低代码的平台又有不少新的报道和消息,作为重点跟踪的技术,今年有必要再进行一次进展跟踪。先总体的说一下,从泛用性和实用性上来讲,OutSystems仍然是一骑绝尘,而且还在持续的完善细节。国内的平台更多的面向一个领域来解
Wesley13 Wesley13
3年前
Java本地缓存框架系列
Caffeine是一个基于Java8的高性能本地缓存框架,其结构和GuavaCache基本一样,api也一样,基本上很容易就能替换。Caffeine实际上就是在GuavaCache的基础上,利用了一些Java8的新特性,提高了某些场景下的性能效率。这一章节我们会从Caffeine的使用引入,并提出一些问题,之后分析其源代码解
Stella981 Stella981
3年前
Laravel、Yii、ThinkPHP性能测试
主流PHP框架性能非权威测试作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情。用ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期代码解耦是个让人头疼的事情。不过很多第三方功能不需要自己写,众多大牛已经给铺好路了。用Laravel的话,传说写起来很爽扩展性也够,但是学习成
Stella981 Stella981
3年前
Nginx的负载均衡
上篇blog讲述了加权轮询算法的原理、以及负载均衡模块中使用的数据结构,接着我们来看看加权轮询算法的具体实现。 指令的解析函数 如果upstream配置块中没有指定使用哪种负载均衡算法,那么默认使用加权轮询。也就是说使用加权轮询算法,并不需要特定的指令,因此也不需要实现指令的解析函数。而实际上,和其它负载均衡算法不同(比如ip\_ha
Wesley13 Wesley13
3年前
Unity中的基础光照
渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算。光照模型就是用于决定在一个像素上进行怎样的光照计算。一、光源  在实时渲染中我们通常把光源当做一个没有体积的点。  1.1辐照度  在光学里,使用辐照度(irradiance)来量化光。对于平行光来说,它的辐照度可以通过计算在垂直于光的方向的单位面积上单位时
Wesley13 Wesley13
3年前
CNN中常用的四种卷积详解
卷积现在可能是深度学习中最重要的概念。正是靠着卷积和卷积神经网络,深度学习才超越了几乎其他所有的机器学习手段。这期我们一起学习下深度学习中常见的卷积有哪些?1\.一般卷积卷积在数学上用通俗的话来说就是输入矩阵与卷积核(卷积核也是矩阵)进行对应元素相乘并求和,所以一次卷积的结果的输出是一个数,最后对整个输入输入矩阵进行遍历,
Stella981 Stella981
3年前
Qt5中表格处理大数据量
在Qt中如果是普通项目,GUI处理展现的数据量不大,一般用QTableWidget,QTreeWidget这样的控件就满足了,但是如果数据量行数达到了几万行,那么Widget的展示性能就偏差了。Qt中提供了一种Model/View的编程方式来处理数据,也就是展示层和数据层分离,这样就解耦了。一旦Model的状态改变,它会自动渲染到View控件。这样的机制
Easter79 Easter79
3年前
Sql Server之旅——第一站 那些给我们带来福利的系统视图
本来想这个系列写点什么好呢,后来想想大家作为程序员,用的最多的莫过于数据库了,但是事实上很多像我这样工作在一线的码农,对sql都一知半解,别谈优化和对数据库底层的认识了,我也是这样。。。一:那些系统视图1\.系统视图是干什么呢?从名字上看就知道,系统视图嘛?猜的不错的话,就是存放一些sqlserver系统的一些信息,
Stella981 Stella981
3年前
Python数据分析必备学习路线与技术
即便在同一领域里,从软件开发转向算法,也不是一件很容易的事情。我经历过这种转型,期间迷茫过、浮躁过。后来发现,光看书不行,把每日所学记录下来,感觉学的比较快。通过记录,驱动我思考,帮助我了解哪些是真懂,哪些是理解不透的。后来,几乎每两天就将每日所学,总结成一篇原创技术文,发在公众号里,现在已经有260多篇了。也很幸运,成功转方向。
公孙晃 公孙晃
1年前
C4D插件:阿诺德Arnold渲染器 (R20-2024版本合集) v4.6.5.1
是一款由SolidAngle开发的高级3D渲染软件,它为用户提供了高品质的图像渲染和动画制作工具。该插件在电影、电视、广告和游戏制作等领域得到广泛应用。Arnold插件具有以下特点和功能:快速且高效:Arnold采用了先进的渲染算法,能够快速渲染复杂场景。