写在前面
好久没有写文章。。不知道这次的文章能不能把想说的都表达完全。鄙人消失了快几个月了吧。。因为各种各样的原因也没有时间写下这些文字(这篇文章也是用零散时间东拼西凑出来的,望大家不要嫌弃)。
我的b站~求个关注三连~https://space.bilibili.com/198377617/?share_source=copy_link&share_medium=iphone&bbid=Y84C1A87238831C048E09014BFC2D3B481AF&ts=1587578403
本次想聊聊的是PathTracing用在Realtime渲染中的可行性与BSSRDF相关的问题。大概分为两个部分,第一部分以介绍经验为主,第二部分以鄙人最近做的一个实验为主(数学上的推导较多),希望能够和各位一起交流渲染的学习经验。
另,本文中渲染器用的是VULKAN 的API,严格来说,是从我的体素渲染器中分离的一个小分支(原本是想Raytrace SVO的来着,尴于时间不足)
使用了Compute和光栅化的Pipeline,ComputeShader进行PathTracing,光栅化全屏做后期处理。Shader总共一千多行,运行程序不含封装部分600行。
这里是目录(文章太多,目录已经不好整理了,想看之前虚幻系列的文章的话点我的头像可以查看噢)
本文结构:
一、PathTracing
二、实时PathTracing
三、BSSRDF的简介
四、BSSRDF在球面上的重要性采样的探索
一、PathTracing

何为PathTracing?顾名思义,既是路径的追踪,对光线的追踪。
本质上,PathTracing也是一种对渲染方程的求解。
这里只考虑单向的路径追踪。
按照鄙人的理解,其重要部分为:
1.与场景求交
2.获取表面属性
3.根据表面属性生成新的射线
4.累积各种路径上的能量
通常的流程如下:
1.从眼睛出发,射出一条射线(若不考虑DOF,这条射线的位置是属于特定像素区域内的,可以是随机覆盖该像素,也可以是根据某种分布进行覆盖,各有特点)
而射线方向则是当前射线位置减去相机位置
2.射线与场景求交,得到新位置
累积
3.根据
4.重复步骤2到3,直到射线遮蔽累积量已经过小,或者反弹次数过多
5.得到最终的Radiance,输出至屏幕
(这里使用了一个遮蔽累积量这词,是为了方便理解而创造的)
因为使用的是蒙特卡洛的算法,求的只是一个理论上无偏的近似解,但是可以看到图中有噪点。噪点的成因,直观表现为积分过程中,每个样本之间的方差
当然,为了减少方差,这里有许多方法可以使用,如ImportanceSampling(重要性采样),MIS(Multi-,多重重要性采样),RussianRoulette(俄罗斯转盘),还有一些高级一点的如可以逼近未知分布的Metropolis(本文只使用了重要性采样与多重重要性采样)。方法思想很多,从逼近真实光线分布到复用光线路径,最后的目的都是为了使用最少的路径来获取最接近正确结果的结果。
二、实时PathTracing
其实说是实时PathTracing,更准确来说应该是对未来的展望。本文中使用的渲染器,如果将分辨率调至720p以下,每帧每像素5采样(5spp),对于光路不复杂的材质(塑料,金属,玻璃),结合Temporal Filter能勉强达到能看的实时渲染。

可以看到大部分噪点都是由次表面散射的珠子提供的
当然,本文的渲染器在求交上面也偷了懒,目前只支持球和无限大的平面进行求交,而实际应用中,使用三角形来表示场景,将可能用到KDTree,BVH等的加速算法来进行求交,但是尽管如此,求交速度也会慢很多,这也是PathTracing不能实时化的原因之一。


(这是Peter and Karl's GPU path tracer,一个我在网上浏览资料时看到光线追踪器。这是一个使用CUDA可支持三角形和其他类型表达场景的光线追踪器(但是效率比较低,对比截图可以看得出来,驱动也很容易停止响应o(-`д´- 。)對,沒錯,每次截圖,就是一次驅動的崩潰)
当然还有许多许多在这方面做得很好的渲染器,鄙人就不一一列举出来。
当然除此之外还有一个思路,就是图像的去噪。这方面在这几年研究也变得更多。
1、Spatiotemporal Variance-Guided Filter(SVGF)


这是一个结合了光栅化与PathTracing的渲染有偏(虽然说最后还是理论上可以收敛到无偏的,如果直接光照也由PathTracing提供,而且静止时间足够长)的方案。简单介绍一下,SVGF需要用到光栅化提供的GBuffer的信息,来重构空间信息。使用PathTracing来获取间接光照信息(此时含噪点)。将像素颜色分为Albedo(GBuffer中获取)和Irradiance,对Irradiance进行空间上的滤波(周围像素将根据空间信息加权),进行亮度上的滤波(根据周围像素的颜色的相似性进行加权)等等,以及对之前的帧样本进行叠加(类似TAA),从而达到“不浪费之前的样本”“不浪费周围的样本”的去噪效果。
详细见文章末尾论文处。
(同时这个降噪的思想也是接下来想要努力的方向,如果还能有时间的话
2.AI降噪

来自Optix 5.0 AI-Based Denoising
如今降噪结合AI,是一个蛮流行的研究方向。。本文也不再详细叙述。
三、BSSRDF的简介
假设已经了解了BRDF,BSDF等概念,那么理解BSSRDF应该不算太苦手。

我们现实中看到的物体,通常是这样的。次表面散射这一概念,也会随着带出来。光线先经过介质折射进入表面,然后在物体内部进行散射(吸收),再从某一点射出。为了加速这一模拟过程,BSSRDF这一概念被提出(实际上与现实中有差距,具体下文会提到)


简单地理解,BSSRDF描述的是这样一个事情:对于
因此对于每一个采样点,实际上需要求物体表面的所有点对他的贡献。其中BSSRDF被简单记叙为:
实际上通常
而eta则为介质的IOR(空气为1),F项为常见的Fresnel项
因为通常
因此在路径追踪中只需对
Rd函数也十分地复杂。他的积分形式(我懒得打了啦)没有解析解,因此通常使用他的近似算法来求解,如Dipole,DirectionalDipole等。。
而且使用原始函数或者Dipole的形式,需要输入的参数也十分复杂:

(那个Chicken,认真的吗(((( ;°Д°)))))
(而且实现也十分复杂,如果照着论文来做的话,因为参数太多了,很容易写错o(╥﹏╥)o在这里卡了好多好多天)
本文渲染器中使用的是一种Normalized Diffusion的算法(Approximate Reflectance Profiles for Efficient Subsurface Scattering)。
该算法的核心在于这个公式
其中d是控制该函数的一个玄学参数(下面会讲到)
这个公式形式也比原来的Rd简单了不少。而且据原论文,该公式乘以

使用Normalized Diffusion的渲染结果,可以看到噪点依然明显(@´_`@)
然后鄙人就有了一个大胆的想法(以下内容均为实验内容,未经允许严禁转发)
四、BSSRDF在球面上的重要性采样的探索
所需工具:Wolfram,Excel,计算器
首先使用该公式
s为scaling factor
又已知
而
(来自Optical Monitoring of Fresh and Processed Agricultural Crops(我也不知道为什么是这个奇怪的名字))
而
从而得到d的近似解,
可以看到参数被简化了许多。而鄙人想做的事情,正是拟合出
1.求出d的常用范围
使用Wolram将Rd画出来,可以发现函数形状较d的变化会比较大
n取1~2(通常物体的Reflective Index),散射距离从1取到500:

可以发现d的取值大概分布在0.1~0.5(实际上IOR的值会大于1.2,通常为1.3,因此前面一部分骤变的曲线被舍去了)
2.根据d的取值可能拟合多条曲线
使用Excel进行运算:

得到不同的d时,r对应的

3.拟合k、b
根据不同的d值,我们得到了不同的k,b值。
新建表格,对k,b值进行拟合:



实际上,运气很好的是,在选取的d的范围之内,k,b的值均为单调的(事实上再过一点点就会呈现下降趋势,不过对于选取的区域来说已经足够精确了)
又可以得到关系式:
得到完整的拟合曲线为:
4.细节处理与归一化处理
由于该函数在0处无定义,因此使用分段的形式:
(其中R为当前球的半径,因为2R为可采样的最大距离,因此需要进行截断处理,minr为自由选择的一个不等于0的极小的数,小于minr的函数值将会变得平稳,从而防止无法积分)
求出该函数在定义域内的积分:
归一化:
5.求CDF与CDF的逆
CDF同样也是一个分段函数
接下来求CDF的逆,因为是简单的指数型函数,因此求解也十分方便:
有了这个函数,我们就能通过0-1的随机变量来进行采样,返回一个距离r。
6.根据r在球面上进行采样
这一部分比较难解释。首先建立一个特殊的球面坐标系:

从一个截面上看,是这样的。经过随机采样得到了r,我们需要使采样点均匀分布在这里:

涂黑的圆盘与球面的交线,即球小圆之一,采样点应该在这上面均匀分布。
随机在球面上取一点
可以得到采样点的位置为:
而根据高中所学知识(余弦定理),可以求得
7.PDF
根据重要性采样理论,不同分布下应该除以PDF:
从而完成重要性采样的求解。
对比使用该采样的前后图像,会发现确实有许多改进,噪点明显减少:






(一些1080*720的实时渲染效果,视频上传中,希望压缩得不要太严重)
总结:
本次的文章和大家分享了PT的基本思想,以及实时应用的可能性。
第二段文章对于BSSRDF里面Rd函数的拟合为试验性的尝试,也获得了一点成果(命名为YCZ 分布(*/∇\*)),但是也还有许多理解不到位的地方(也请大家指出错误之处)。在分享该过程的同时,可以与大家一起加深对重要性采样的理解,感到很高兴,也希望以后还有更多这样交流的机会(鄙人也因为某些原因,下半年可能销声匿迹了,实际上,这篇文章也写了很多天,虽然渲染器只有短短的几千行。。。)
所以,请在我彻底销声匿迹之前,让我感受多几下被人赞的感受吧*(*´∀`*)☆
感激不尽!ありがとうございます!
参考文献:
1.Optical Monitoring of Fresh and Processed Agricultural Crops
2.Approximate Reflectance Profiles for Efficient Subsurface Scattering
3.BSSRDF理論と実装
4.Spatiotemporal Variance-Guided Filter
5.A Practical Model for Subsurface Light Transport