GAMES101渲染部分(4)
蒙特卡洛积分
在积分定义域上随机采样加权,最后求平均
样本越多,最终的结果距离正确值越准。
在哪个变量上积分,采样哪个变量。
路径追踪
和Whitted-Style Ray Tracing有所不同
Whitted-Style Ray Tracing
- 只分成两种情况
- 镜面 反射/折射
- 漫反射 停止,结算着色
问题:
对于Glossy材质,简单将其和Specular等价是不合适的。
没有计算间接光照(Diffuse材质之间的反射)。
Whitted-Style Ray Tracing是有问题的,渲染方程是正确的,我们需要正确地解出渲染方程。
解渲染方程需要
- 解决一个半球积分
- 递归
解半球积分
- 一种积分的数值求法:蒙特卡洛
- 采用如图模型进行讲解
如何求当前点的直接光照?
目前假设是均匀分布的
如果只考虑直接光照,且不考虑可见性的话,目前这个结果就是求解渲染方程的一种方法了。
引入间接光照
这里,假如光线弹射到了Q点上,那么就相当于在P点观察Q点,获取Q点的直接光照。
但是还有问题…:
光线弹射次数爆炸
解决方案:打出一根光线。
现在就可以被叫做路径追踪了。
如何解决噪声?直接对单个像素打出多个光线
类似于对逐像素做蒙特卡洛积分。
以及另一个问题…:
俄罗斯轮盘赌(RR)(递归停止)
如果单纯限制弹射次数的话,很可能会导致能量损失。
采用俄罗斯轮盘赌来决定在一定概率下停止追踪。
目前已经是一个正确的路径追踪的算法了。
但是不够高效。
最终结果还是需要对单个像素打出多根光线。
对光源采样
因为是对光源采样,因此想要使用蒙特卡洛,我们也需要对光源积分。
首先需要把渲染方程写成关于光源面积的形式,因此我们需要找到光源面积和立体角的关系。
这样就可以更好地对光源进行采样
我们把光线传播分成两部分
- 直接光照,对光源采样,不需要俄罗斯轮盘赌
- 间接光照,对立体角采样,需要俄罗斯轮盘赌
但是还有问题
对光源采样的遮挡问题
在直接光照计算的部分,需要再射出一根光线判断是否有遮挡。
更多的方法…