路径跟踪渲染器实现笔记【Games101】

最近实现了一次Games101课程关于渲染的课后作业,发现具体实现下来,需要对光线追踪原理、C++语言、环境配置和调试等等部分都要掌握的比较好才行,花费了不少时间。果然游戏渲染这个方向真的很多东西要学,需要时常保持对科学的敬畏之心,保持学无止境。

光照模型回顾

首先是光照模型的简单回顾,可以分为局部光照模型和全局光照模型。

局部光照顾名思义,不能考虑物体与环境之间的光影关系,如阴影,环境光等等;

全局光照模型可以模拟如光线穿过透明物体、物体之间的互反射、环境光等。全局光照模型比较复杂,适合于基于物理的渲染算法。

提出背景

光线追踪和路径追踪是计算机图形学中用于模拟光在虚拟环境中行为的两种流行方法,能够达到几乎逼近真实的渲染效果,光线追踪算法最早由Arthur Appel于1968年提出。

其中,光线追踪是一个确定性过程,涉及追踪光线的路径及其相互作用。优点是可以生成具有准确反射、折射和阴影的高质量图像,但是这种技术需要大量的处理能力。

相比之下,路径追踪是一个随机计算的过程,最早是James Kajiya于1986年提出,涉及在光线穿过场景时对光线路径进行采样。这种技术的计算成本低于光线追踪,但它会产生图像噪声,需要多次迭代才能收敛到高质量的结果。路径追踪通常用于需要对光进行物理精确模拟的应用,例如建筑可视化和产品设计。

发展现状

光线追踪算法是一种模拟光线与物体的相互作用的渲染技术,它可以实现逼真的全局光照、阴影、反射和折射等效果。但是,光线追踪算法也存在一些挑战和问题,例如:

基本思想

光线追踪(Whitted-style ray tracing)核心思想:

这种方法中,在每次求交点时候,需要按照当前材质是否镜面/折射面/漫反射面,进而计算下一个射线的方向。

但是实际上,对于一个出射光线,可能有多个方向(其他物体的随机漫反射等)都对这个出射方向有贡献,因此单单计算一个方向就认为是出射方向上的全部贡献,是不准确的。

因此引入了路径跟踪算法

基本思想是:从视点处的每个屏幕像素中心点发射一条光线,与场景求交点,根据交点处的材质采样多个方向(均匀采样或重要性采样),发射下一条光线,直到光线打到光源上(或逃逸出场景),然后计算得到一个颜色值,作为最终像素的颜色。

但是每个像素只计算一条光线,不能很好的表现不同方向的光线贡献,并且采样点只发射一个射线,很容易产生噪点,因为可能很多采样点最终是没有打到光源的,因此产生了下面的优化方法。

蒙特卡洛积分

蒙特卡洛积分目的是:当一个积分很难通过解析的方式得到答案的时候可以通过蒙特卡洛的方式近似得到积分结果。也就是只需要采样部分样本进行估计,但是这是一种无偏估计,即估计得到的期望值等于真实参数的值。

我们的目标是求得这个f(x)在[a,b]范围内的积分,但是具体每个点f(x)我们是不清楚的,因此我们使用一个采样的分布p(x)进行多次的函数值采样。一般可以选择均匀分布,或者重要性分布。

一个简单的推导:由于均值是期望的逼近:

根据期望值等于随机变量乘以其概率密度函数的积分,可以验证蒙特卡洛估计值=原积分值,:

因此,当分布函数p(x)为均匀分布时,可以得到:

蒙特卡洛路径追踪

因此在进行一次求交点后,我们首先在该交点处进行均匀采样,得到N个出射方向

根据渲染方程:

由于假设只有光源有自发光,因此暂时舍弃自发光项:

使用蒙特卡洛积分,可以得到下面的计算公式:

伪代码如下:

而对于一个交点,需要计算N方向的入射光线,再求和得到出射光线的颜色,会出现下面的计算量爆炸问题:

对每个点都计算所有方向的贡献(一般是取上半球方向进行采样),假设每次采样100条,那么从人眼出发的第一次采样就是100条,在进行第二次反射之后就是10000条,这计算量显然是不能接受的,因此每次我们只采样一个方向(w_i)

也就是取N=1,伪代码如下:

这表示了对于某个交点只取一个出射光线作为均值,所以为了减少误差,每次从视点发射多个射线,射线越多,误差也就越少。

从视点位置生成射线的伪代码:对每个射线求均值,得到最终结果:

重要性采样(直接光+间接光)

重要性采样的原理是:通过现有的一些已知条件(分布函数),想办法集中于被积函数分布可能性比较高的区域(重要的区域)进行采样,进而高效计算准确的估算结果的策略。

例如,对于一个漫反射表面,如果我们直接从半球中均匀地选择反射方向,那么可能会有很多光线无法到达光源或者背景,导致噪声和误差。但是如果我们根据Lambert定律,从余弦分布中选择反射方向,那么就可以更有可能选择到有效的光线,从而提高渲染效果。

如果我们在交点位置,直接进行随机的采样,很大一部分的光线都不会直接打到光源,而我们往往希望能直接采样那些能打到光源的方向,提高效率,因此path tracking先直接对光源进行采样,再对间接光进行采样

直接光采样原理

对场景中的所有光源进行遍历,如只有一个光源时,取其中非常小的一块面积作为采样点,则概率密度函数pdf_light = 1/A,其中A为光源的面积。

然而之前我们的采样都是出射方向,因此我们需要在光源dx和出射方向dwi之间进行转换:

其中dA是光源中非常小的一块面积,cosθ'是光源直射方向投影到dw的大小,即cosθ'越小,越接近直射方向,则贡献值越大。

分母是立体角的计算,表示以dw为圆心半径为r距离处的立体角为,物理意义是光源能量的衰减,越远离dw则衰减程度越大。

因此,在直接采样时,可以将dw用dA代替:

间接光采样:

间接光依然采用先前的方法进行光线方向的均匀采样。

最终的伪代码如下:

俄罗斯轮盘赌算法

为了避免递归无限进行下去,可以使用深度进行判断,若depth超过某个值,那么就停止递归。或者可以使用俄罗斯轮盘赌算法,根据具体目标材质和光线强度,设置概率,是否进行递归:

俄罗斯轮盘赌算法是一种利用概率的方法. 我们指定一个概率 P ( 0 < P < 1), 有概率 P 存活, 有概率 (1-P) 被淘汰. RR 方案应用到 Path Tracing 中则为:

  1. 有概率 P 发射一条光线并返回 Lo / P 作为此次追踪得到的 Radiance

  1. 有概率 1 - P 追踪过程直接中止

有如下好处:

  1. 可以避免路径过长导致的计算开销过大。

  1. 可以避免路径过短导致的光照效果不真实。

  1. 可以减少噪音,提高渲染质量。

微平面模型(提高作业)

之前一直把物体的材质反射分为漫反射和镜面反射、折射等等,但是不知道具体之间的联系是什么,微平面模型将物体材质的微观体现进行了建模,并且将各种光线进行了联系。

微平面模型:将物体表面建模成无数微观尺度上有随机朝向理想镜面反射的小平面(microfacet)的理论。微观几何(microgeometry)的效果是在表面上的不同点处改变微平面的法线,从而改变反射和折射的光方向。出于着色的目的,通常会用统计方法处理这种微观几何现象,将表面视为具有微观结构法线的随机分布,并将宏观表面视为在每个点处多个方向上反射(和折射)光的集合。在微观尺度上,表面越粗糙,反射越模糊,表面越光滑,反射越集中。

简单而言,当一束光线入射到物体表面时,光线会发生反射折射

反射(Reflection)。光线在两种介质交界处的直接反射即镜面反射(Specular)。金属的镜面反射颜色为三通道的彩色,而非金属的镜面反射颜色为单通道的单色。

折射(Refraction)。折射的部分会进入物体内部,一部分被物体吸收,一部分会发生散射,其中散射并逃逸出的一部分被称为漫反射,而穿过物体的一部分被称为透射(如玻璃、水)。

如下是光与介质边界的交互类型思维导图版的总结:

总之,使用微平面模型,我们可以通过不同材质类型进行计算他们的反射和折射项,得到最终的颜色。

不同的材质有不同的BRDF,因为它们对光的反射特性不同1。例如,镜面反射的材质的BRDF会集中在入射光和法线之间的角度等于出射光和法线之间的角度的方向,而漫反射的材质的BRDF会均匀地分布在所有方向1。因此,通过选择合适的BRDF,可以模拟出各种真实或虚构的材质效果

这里使用Cook-Torrance BRDF来实现:

K_d折射光占入射光比例;

K_s反射光占入射光比例;

f_lambert漫反射(diffuse)的BRDF;

f_cook-torrance镜面反射(specular)的BRDF

漫反射的BRDF

镜面反射的BRDF

具体的每个项内容也比较多,可以参考这一篇文章:

https://blog.csdn.net/qq_41835314/article/details/125362634

实现效果

直接光照:

直接光+间接光:

完全折射(左)+完全镜面反射(中)+微平面模型(右):

完全折射和完全镜面反射非常特殊,因为只有刚好处于完全反射 or 完全折射方向的光线是有贡献的,其他方向不需要进行采样,因此需要对采样方法进行修改。

AI去噪后:

参考文章:

https://zhuanlan.zhihu.com/p/56967462

一叶斋 | SmallPT —— 99 行代码光线追踪解析 (xieguanglei.github.io)

计算机图形学十五:全局光照(蒙特卡洛路径追踪) - 知乎 (zhihu.com)

https://blog.csdn.net/qq_41835314/article/details/125362634

【游戏开发面经汇总】- 图形学基础篇 - 知乎 (zhihu.com)

实时光线追踪技术:业界发展近况与未来挑战 - 知乎 (zhihu.com)

猜你喜欢

转载自blog.csdn.net/cycler_725/article/details/129480618