Rendering Equation
如上图,我们对比一下同一个场景中,有无participating media的区别,右侧没有时,采样空间是场景的整个表面O(N^2),而在左侧,采样空间是场景中任意一点O(N^3),这反应了VRE的计算量。
积分求解
该公式告诉我们,L是直射光,1次反弹,2次反弹,N次反弹等所有光路的累加,路径越短,贡献通常越大,也告诉我们,如果要针对公式2采样时,尽可能采样贡献大的,对应下图:
可见,Monte Carlo求解积分的思路是简单的,但光路本身会反弹,bounce,所以求解该高维积分也是异常复杂的,昂贵的计算量往往很难达到real time的要求,而rasterization本质上是一种近似解,只考虑了较短路径对应的光路的贡献(从相机到物体到光源这样一个路径为3,1次反弹光路),而不考虑其他光路的贡献,以此来获取较好的性能,自然效果上略有不足。如下对比ambient occlusion效果,可以看到,ray tracing的更为细腻,效果上自然逼真.
Light Transport常用算法
以相机为起点,构建一条光路,这种思路是Path tracing,但问题是我们不太容易和光源相交。
这时,我们引入Next event estimator的策略,主动和光源相交,确保能够构建一条完整的光路,但这里也有问题,如果遇到一个玻璃球,因为要满足折射率(fresnel,费马定理),这种情况下很难找到光源。
这种情况下,如果我们从光源出发,则比较容易构建光路,我们称为light tracing,但如右图,这种SDS的组合,无论是path tracing还是light tracing都很难搞定
这时,有一种方式成为photon mapping,光源会发射photon,通常用一个kd tree来记录photon在diffuse表面的分布强度,这时,我们从相机处构建光路,在diffuse处查询周边的photon,用一个kernel函数来近似获取该点的radiance(上图中半圆处),从而解决这种问题。但photon mapping本身是以近似解来替代该点的真实radiance,所以是biased,但通过不断缩小半球的半径提高准确度,所以当photon无限多时,能够收敛到真实的radiance值,因此可以保证一致性,consistency。
这里,还有两种更为复杂的光路算法,一个是BDPT:
该算法是path tracing + light tracing的综合,如上图,构建该光路时有四种策略(可能),s表示从光源出发的路径对应的点数,t表示相机对应路径的点数,BDPT通过一个方法,判断四种可能的路径的好坏,按照各自的权重来计算不同策略的贡献。这里我们需要保证光路的能量守恒,主要是refraction和shading normal。
另一个则是MLT,基于Markov,当我找到了一条光路时,则基于该光路做微调,从而很可能找到另一条可行的光路。该算法是Metropolis-Hastings算法在light transport中的应用。
Importance sampling techniques
Variance reduction techniques
刚刚介绍了IS以及常见的策略,IS本质上也是属于variance reduction的一种。我们再进一步,除了重要性采样,还有其他的方式来降低variance。这里还有两个常用的策略。
Control variable。当我们已知g(x),或该函数具有较小的方差时,我们不需要直接计算f(x),而是获取两者之间的差,这种方式下获取f(x)时,方差也会较小。
Gradient-Domain Rendering就是基于这种思路,我们获取较为粗糙的渲染结果,然后把计算量集中在像素变化比较大的区域(高频)区域,获取最终的渲染效果。这样,我们在渲染时,计算的是每个像素和周围像素之间的差别,pixel-based gradient。
另一个则是stratification,如何提供一种较好的随机算法。这里,我们要区分random和discrepancy之间的区别。
Advanced light transport
另外一个问题,IS,Random这些方面的优化,都可以通过接口来封装,我们可以在同一个渲染器中调用不同的采样技术来优化效果,但不同的light transport算法策略差别比较大,特别是photon mapping和其他路径算法差异较大,在实际应用中,我们不知道哪些场景适用哪类算法,甚至一个场景中不同的区域适合不同的light transport算法,所以,人们希望能够将BDPT和photon mapping算法兼容,统一成一种light transport,满足各类场景,本质上,这也是一种MIS策略,将Photon mapping归为一种采样技术。
该思路也扩展到volume rendering中‘Unifying Points, Beams, and Paths in Volumetric Light Transport Simulation’
前面提到的MLT,是一种基于MCMC的light transport,基于Markov Chain的correlated path,样本之间不再独立,而是有关联。它的特别点在于用户可以自己设计策略,从一条光路x1转移到光路x2,前提是保证该转移满足细致平稳条件detailed balance,目标是提高转移的接受率acceptance。如果其他光路算法都不能很好的解决一些特殊场景和需求时,我们可以通过MLT使用一些自定义的渲染机制,来满足特定的要求。
比如所有物体的材质都是specular,构建一条光路的难度大大增加,因为要满足光线的折射率。该算法构建一个在切空间 tangent space下满足反射率和折射率的constraint function,保证在移动某一点的情况下始终满足该约束条件,这样,当我们移动起点或终点时,对应x1或x7,可以同步其他点的delta,保证C始终为零,约束条件始终成立。该算法实现了在该特定复杂场景下构建有效光路,下图移动红点时。
另外,我们计算一条光路的gradient,可以把该gradient当作重力方向,然后随机赋给该光路一个初始动量,这样,当上升时,动量变小,势能变大,下降时则相反,整体的energy不变,通过这一机制,则可以大大提高MLT采样的接受率。该算法称为Hessian-Hamiltonian MC,属于MLT的一种。因为该算法要计算Hessian,二阶导数,计算量过大,还有一种基于Langevin MC,基于布朗运动,避免计算Hessian矩阵,算是前者的简化版。两者都是利用gradient进行local exploration,提高接受率的一种策略。
参考内容太多,每一个点涉及的技术细节也很多,也很难给出具体的参考,给出一些入门材料,希望你能够感受到渲染的乐趣和魅力。
Rendering tutorial 1\~4
http://games-cn.org/previouswebinar-ppt/
真实图形渲染科研入门
https://www.bilibili.com/video/BV1my4y1z76s?p=3
作者:Peter6
原文链接:https://mp.weixin.qq.com/s/bGXcYo2S-MTjifNGmQoNhg
微信公众号:
推荐阅读
更多GPU及渲染技术干货请关注Arm Mali GPU技术专栏。