opengl光线追踪的程序_【PathTracing】实时光线追踪和BSSRDF的那些事

写在前面

好久没有写文章。。不知道这次的文章能不能把想说的都表达完全。鄙人消失了快几个月了吧。。因为各种各样的原因也没有时间写下这些文字(这篇文章也是用零散时间东拼西凑出来的,望大家不要嫌弃)。

我的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

66443f2d2e508c566639e1863f771340.png

何为PathTracing?顾名思义,既是路径的追踪,对光线的追踪。

本质上,PathTracing也是一种对渲染方程的求解。

这里只考虑单向的路径追踪。

按照鄙人的理解,其重要部分为:

1.与场景求交

2.获取表面属性

3.根据表面属性生成新的射线

4.累积各种路径上的能量

通常的流程如下:

1.从眼睛出发,射出一条射线(若不考虑DOF,这条射线的位置是属于特定像素区域内的,可以是随机覆盖该像素,也可以是根据某种分布进行覆盖,各有特点)

而射线方向则是当前射线位置减去相机位置

2.射线与场景求交,得到新位置

,新表面法线
,新的表面属性

累积

(E为表面自发光的强度,R为当前遮蔽积累量)

本次计算的遮蔽积累量

3.根据

等等参数,随机(蒙特卡罗的思想,这里不详细叙述)一条新射线

4.重复步骤2到3,直到射线遮蔽累积量已经过小,或者反弹次数过多

5.得到最终的Radiance,输出至屏幕

(这里使用了一个遮蔽累积量这词,是为了方便理解而创造的)

因为使用的是蒙特卡洛的算法,求的只是一个理论上无偏的近似解,但是可以看到图中有噪点。噪点的成因,直观表现为积分过程中,每个样本之间的方差

当然,为了减少方差,这里有许多方法可以使用,如ImportanceSampling(重要性采样),MIS(Multi-,多重重要性采样),RussianRoulette(俄罗斯转盘),还有一些高级一点的如可以逼近未知分布的Metropolis(本文只使用了重要性采样与多重重要性采样)。方法思想很多,从逼近真实光线分布到复用光线路径,最后的目的都是为了使用最少的路径来获取最接近正确结果的结果。

二、实时PathTracing

其实说是实时PathTracing,更准确来说应该是对未来的展望。本文中使用的渲染器,如果将分辨率调至720p以下,每帧每像素5采样(5spp),对于光路不复杂的材质(塑料,金属,玻璃),结合Temporal Filter能勉强达到能看的实时渲染。

64d689279a478b0bca94c8bd2265ac83.png

可以看到大部分噪点都是由次表面散射的珠子提供的

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

28210d0906b1da90c886e1f7a1d6da86.png

9eee323108c3b3947a674f657882d111.png

(这是Peter and Karl's GPU path tracer,一个我在网上浏览资料时看到光线追踪器。这是一个使用CUDA可支持三角形和其他类型表达场景的光线追踪器(但是效率比较低,对比截图可以看得出来,驱动也很容易停止响应o(-`д´- 。)對,沒錯,每次截圖,就是一次驅動的崩潰)

当然还有许多许多在这方面做得很好的渲染器,鄙人就不一一列举出来。

当然除此之外还有一个思路,就是图像的去噪。这方面在这几年研究也变得更多。

1、Spatiotemporal Variance-Guided Filter(SVGF)

fb8d5628af2231c442819fc82d10ea90.png

d3ddc906eba0bc50a65f116f867ac096.png

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

详细见文章末尾论文处。

(同时这个降噪的思想也是接下来想要努力的方向,如果还能有时间的话

2.AI降噪

8597d2c96dc67043d459da926d756be8.png

来自Optix 5.0 AI-Based Denoising

如今降噪结合AI,是一个蛮流行的研究方向。。本文也不再详细叙述。

三、BSSRDF的简介

假设已经了解了BRDF,BSDF等概念,那么理解BSSRDF应该不算太苦手。

a2758b31a2101e4eb887843823cc6aae.png

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

640caa6fd6bc14088eeb259058597363.png

75a7e8f5e61feb0a17066885767acf36.png

简单地理解,BSSRDF描述的是这样一个事情:对于

外一点
与射出(入)的光线方向
,可以得到的能量是多少。

因此对于每一个采样点,实际上需要求物体表面的所有点对他的贡献。其中BSSRDF被简单记叙为:

实际上通常

而eta则为介质的IOR(空气为1),F项为常见的Fresnel项

因为通常

,但是在选取表面上一点时,两点中间可能不是连续的介质(中间可能隔着空气),因此会导致最后结果与实际出现偏差,偏暗(如果是球球则不会有这样的问题啦)

因此在路径追踪中只需对

进行合理地重新选取,根据BSSRDF进行能量的累加,就能近似地模拟这种结果。

Rd函数也十分地复杂。他的积分形式(我懒得打了啦)没有解析解,因此通常使用他的近似算法来求解,如DipoleDirectionalDipole等。。

而且使用原始函数或者Dipole的形式,需要输入的参数也十分复杂:

4cedbe8618a654ff666224b9505b42aa.png

(那个Chicken,认真的吗(((( ;°Д°)))))

(而且实现也十分复杂,如果照着论文来做的话,因为参数太多了,很容易写错o(╥﹏╥)o在这里卡了好多好多天)

本文渲染器中使用的是一种Normalized Diffusion的算法(Approximate Reflectance Profiles for Efficient Subsurface Scattering)。

该算法的核心在于这个公式

其中d是控制该函数的一个玄学参数(下面会讲到)

这个公式形式也比原来的Rd简单了不少。而且据原论文,该公式乘以

之后,是可以求出CDF的,从而可以求出
,进行重要性采样(
然而其实这个CDF的逆也没有解析解)。

187e427abd1b1f6a017dfd6d007ecb14.png

使用Normalized Diffusion的渲染结果,可以看到噪点依然明显(@´_`@)

然后鄙人就有了一个大胆的想法(以下内容均为实验内容,未经允许严禁转发)

四、BSSRDF在球面上的重要性采样的探索

所需工具:Wolfram,Excel,计算器

首先使用该公式

s为scaling factor

又已知

(u是无穷,找不到那个符号了o(╥﹏╥)o)

(Albedo without the fresnel terms)

(来自Optical Monitoring of Fresh and Processed Agricultural Crops(我也不知道为什么是这个奇怪的名字))

从而得到d的近似解,

为平均散射距离

可以看到参数被简化了许多。而鄙人想做的事情,正是拟合出

的曲线,从而得到一个CDF,CDF的逆均有解析解的分布

1.求出d的常用范围

使用Wolram将Rd画出来,可以发现函数形状较d的变化会比较大

n取1~2(通常物体的Reflective Index),散射距离从1取到500:

97149859bf69f76653cb1fb7de7813d6.png

可以发现d的取值大概分布在0.1~0.5(实际上IOR的值会大于1.2,通常为1.3,因此前面一部分骤变的曲线被舍去了)

2.根据d的取值可能拟合多条曲线

使用Excel进行运算:

6b32fe3b21eb1d3db8af92759530e4c7.png

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

的取值。通过散点拟合,可以统一为一个形式:

ae95a88134e37249ce0d9f53cc39b82b.png

3.拟合k、b

根据不同的d值,我们得到了不同的k,b值。

新建表格,对k,b值进行拟合:

6d18f20e62c019ff77564bd2804e0214.png

71a0579a2f7fc6706c9a4f3c3702b5ef.png

11a00f2fcdc19230bf95b0f96dcd4218.png

实际上,运气很好的是,在选取的d的范围之内,k,b的值均为单调的(事实上再过一点点就会呈现下降趋势,不过对于选取的区域来说已经足够精确了)

又可以得到关系式:

得到完整的拟合曲线为:

4.细节处理与归一化处理

由于该函数在0处无定义,因此使用分段的形式:

(其中R为当前球的半径,因为2R为可采样的最大距离,因此需要进行截断处理,minr为自由选择的一个不等于0的极小的数,小于minr的函数值将会变得平稳,从而防止无法积分)

求出该函数在定义域内的积分:

归一化:

5.求CDF与CDF的逆

CDF同样也是一个分段函数

接下来求CDF的逆,因为是简单的指数型函数,因此求解也十分方便:

有了这个函数,我们就能通过0-1的随机变量来进行采样,返回一个距离r。

6.根据r在球面上进行采样

这一部分比较难解释。首先建立一个特殊的球面坐标系:

e0a6f7f265f97593ccafd618b330a199.png

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

64a289516668a80301ed4b125e3d2a48.png

涂黑的圆盘与球面的交线,即球小圆之一,采样点应该在这上面均匀分布。

随机在球面上取一点

,取向量

可以得到采样点的位置为:

而根据高中所学知识(余弦定理),可以求得

7.PDF

根据重要性采样理论,不同分布下应该除以PDF:

从而完成重要性采样的求解。

对比使用该采样的前后图像,会发现确实有许多改进,噪点明显减少:

a5872b0052c18b031e1a8d5856b14313.png
未使用改进后的重要性采样,1024spp

ab4967e6318386e74751d18e1bae8cff.png
使用后,1024spp

e94fcd79e9254a4d744931a0a44bfdab.png
使用前,1024spp

f9f90477613b42adf3b85409d3b3d3bb.png
使用后,1024spp
1c823b51a788ca46e647f9192cc004a3.png
https://www.zhihu.com/video/944011958136037376
69803de6463f1afeb59d5fdc181c9d95.png
https://www.zhihu.com/video/944012371203784704

(一些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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值