图形学基础-路径追踪Path -Tracing 以及优化

目录

概率论回顾

期望

PDF

​编辑

蒙德卡罗积分

定义

路径追踪path tracing

解渲染方程

只有直接光照

考虑其他反射

问题一和解决法

路径追踪

递归终止解决办法

总结

问题二和解决办法

问题:

解决方案:

优化PDF:

本节小结:


概率论回顾

期望

期望就是每一个随机变量乘以概率最后讲这些值加起来

E(X)= \sum_{i=1}^{n}x_ip_i

PDF

连续随机变量的期望:

对于每一个横坐标上的一个微小段dx作为的随机变量,概率是dx和曲线围的面积

这个曲线叫做概率密度函数PDF,期望计算方法:对于每一个取值乘以这个值的概率密度,最后对所有横坐标积分起来就行

E(X)= \int xp(x)dx

他描述的是,我事件发生的概率的分布,就是我选10个数,可能有8个事分布在-1到1之间的,只有2个是-1 到 1 以外的,描述的是这个事情

蒙德卡罗积分

对于很复杂的函数,我们是怎么解的?或者说计算机是怎么解这个积分的?

定义

我们在积分域内,我们使用一个概率密度来选取很多个自变量Xi(假如选了N个),然后,我们将得到函数值与积分域的长度计算出一个矩形的面积,每一个面积都除以选这个自变量Xi的概率密度,最后将所有除了概率密度之后的矩形面积求一个平均,得到的就是我们函数在这个积分域上的积分大小

式子:

 \int f(x)dx= \frac{1}{N}\sum_{i=1}^{N}\frac{f(X_i)}{p(X_i)}         

其中

    X_i - p(X_i)

所以无论什么函数求积分,我们只需要按照一个PDF在函数上采样,将矩形面积与这个样板点的概率密度的比值求一个平均就行了

路径追踪path tracing

我们之前学的Whitted-style ray tracing有局限

  • 光线打到粗糙物体就停了
  • 光只会单一的沿着镜面反射或者折射

这都是不对的

左边是Whitted-style 右边是有路径追踪的光线追踪,它实现了漫反射的全局光照

所以为了实现全局光照,我们上一节推导出了渲染方程来帮助我们实现这个全局光照,这里我们需要配使用到路径追踪算法和渲染方程

我们要解这个方程才可以知道出射方向上的光能量是多少

解渲染方程

使用蒙德卡罗积分方法来解渲染方程右边的积分

只有直接光照

我们先考虑只有直接光照的情况下的渲染方程,就是光源照射到这个点,然后我们从某一个方向上看到的能量大小,没有其他非光源的光那渲染方程表示成:

蒙德卡罗积分方法就是先找到应该PDF, 使用这个PDF对自变量采样,一般选取的就是均等的采样PDF,就是对于一个点接受光的半球面,选取每一个单位立体角的概率一样,是个常数,所以最终的PDF就是:

利用这个PDF采样入射点,最终可以解出这个积分

至此,我们可以使用这个方法计算出任何一个着色点在方向\omega _0上的光线能量大小了,前提是这个着色点只有直接光照

步骤:

对于着色点p , 出射方向w0 (注意我们的w0什么的都是对于着色点向外的方向),我们先在上半球面随机等概率选取N个方向,对于每一个方向,如果这个方向上有光源,就计算平均值中的一部分,直到每一个wi都计算完成,最后累加的就是出射方向的L0大小了

考虑其他反射

如果考虑物体,那就使用递归方法

步骤:

对于着色点p , 出射方向w0 ,先在p的上半球面随机等概率选取N个方向,对于每一个方向,如果这个方向上有光源,就计算平均值中的一部分。如果这个方向是物体,就递归计算累加这个物体对于这个方向来的光线能量的大小,,直到每一个wi都计算完成,最后累加的就是出射方向的L0大小了(注意我们的w0什么的都是对于着色点向外的方向 , 所以递归里面的是负号)

问题一和解决法

路径追踪

这种方法递归下去,每次选N个,那这数量是指数级的

怎么解决?使用路径追踪方法

所以我们每次就随机的在上球面选一根进来的光线,N =  1那么得到的递归函数变成了:

像这样,N = 1, 每次选一个方向判断进行渲染着色的算法就叫路径追踪

每一个像素就是一个观测点,相当于前面一直在说的出射方向L0和w0, 如果对于每一个着色点我们每次反射时考虑的入射光只考虑一条,那最终图片的噪声是很大的,但是我们可以在一个像素多发出几根光线,最后得到的每一个L0取一个平均,这样就解决了问题

所以对于每一个像素,我们填充这个像素的radiance 所使用的函数就可以结合之前的路径追踪算法来实现了:对于相机位置,和前方的像素,在这个像素上随机选点发出光线,如果打到东西,就计算这个着色点的shader,记得取平均

其中shader函数就是之前的这个下图:

递归终止解决办法

递归必须有停止条件,但是真实情况是光确实会一直反射下去,前面我们的渲染方程

L=E+KE+K2E+K3E+K4E.....也告诉我们需要考虑无数次反射的情况

那我们怎么解决?

使用概率期望,就是在递归的时候,我们有时候考虑其他方向来的光线,有时候就不考虑,直接return , 最后根据期望,最终返回的L0就是我们要的L0,没有因为提前return而造成的能量损失,尽管有噪声

shader函数优化成了这样:

在每次递归是按照一个统一的概率P_RR决定是否继续进行下去,同时返回的值需要除以P_RR

总结

这样我们使用两函数:填充像素函数和shader函数,可以正确的填充相机上的所有像素,每一个像素,我们打出的光线越多,结果越真实但是运行速度越慢。越少,就很大噪点,但是快。

问题二和解决办法

问题:

刚刚知道,对于每一个像素,发出的光线的数量与图片质量和计算速度很有关系,有没有办法,既可以多发出光线同时还可以快速运行?有的!

解决方案:

之前的效率低有一个原因就是,对于像素发出去的光,在遇到着色点时,会随机等概率的四周反射出去,如果场景里面物体很少,这时大部分光线是浪费的,所以我们可以更改随机分布函数PDF。使其不是单纯的四周任意方向等概率,而是专门往有光源的地方打出光线,在面光源表面等概率的采样,所以pdf变成了1/A,总概率除以光源面积

优化PDF:

优化版的随机分布函数PDF是为了保证直接光照可以全部采样。就是使得像素发出的一根光线在上半球的采样方向永远多一根是往光源的路径上反射的,这样对于光源的光线就没有浪费,可以全部采到光源的光线。

由于pdf的作用域由上半球面变成了面光源,我们的蒙德卡罗积分的积分域要从对单位立体角的积分d\omega变成对面光源的单位面积的积分dA,

他之间的关系使用立体角的定义(投影面积比上半径的平方)和图中的量可以得到:

这样积分换元后,对于直接光源的采样使用的蒙德卡罗积分就变成了:

由于每次采一个点x,得到的积分结果记得除以pdf(x)

对于不是直接来自光源的方向,我们还是使用原来的随机抽取一个方向,积分域是半球面,并且递归时会随时停下来

这样我们的shader函数就分为了两部分,一部分是对光源进行的采样,直接返回光源对于出射方向的L0,另一部分是非光源的采样,使用俄罗斯轮盘赌终止递归,每次发出一根光线,去获取这个方向上对于出射方向的L0,最后将这两个合起来,就是最终的出射方向的能量

伪代码:

如果每一层递归在对光源采样时,这个样本光线的路径上有其他物体,那L1直接就是0,判断方法就是在计算这个采样点的L0前,先往样本点方向射一个光线,看看有没有打中其他物体,没打中就L0该是多少就是多少


由此,我们彻底解决了path  tracing的所有问题

本节小结

  • 我们回顾了概率论,知道怎么计算期望
  • 了解了什么是pdf,pdf就是一种采样方法
  • 学会什么是蒙德卡罗积分,就是根据任意一种pdf对函数采样,最后求每次得到的矩形面积的平均
  • 会解积分后,我们就可以递归计算每一个着色点在观测方向上的能量大小
  • 由于按照PDF , 每次反射都要考虑n个样本点,这递归太大,所以我们每次只考虑一个光线,但是每一个像素多发出几次光线,得到路径追踪算法
  • 使用俄罗斯赌注来解决无限递归的问题
  • 为了降低噪点,每次反射时,反射出两个光线,其中有一个在面光源上采样一个点,另一个不变,最后返回的着色值是这两个的和
  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值