Path Tracing 的性能与效率[1:00:32]
现象
👆 图中上面是光源,中间是遮挡物。左:Low SPP。右:High SPP。
SPP:sample per pixel。表示从一个像素出来的path数。SPP低,速度快,但noisy。SPP高,速度慢,但效果好。
怎样才能在Low SPP情况下得到好的效果?
💡 具体问题具体分析。在什么情况下LOW SPP的影响会特别(不)严重。这些场景有什么特点?实验用来分析这种问题最有意义,而不是调参。
分析[1:02:12]
由于是从着色点均匀地向外随机采样,
当光源大时,随机采样更容易遇到光源。
当光源小时,随机采样可能要采很多次才会遇到光源。而其它大多数采样次数都被“浪费”了。
解决方法
解决方法:上半球均匀采样->只在光源上采样
由于MontoCalio方法不限制采样的PDF,可以定义更合理的PDF使得采样结果不浪费。那就是只在光源上采样。
💡 如果我来做会指使高斯分布来采样.可以控制重点
右上角是光源。光源面积是A。那么在光源上采样的PDF是 :
$$ p(x) = \frac{1}{A} $$
但现在的采样和积分不是针对同一个区间进行的。采样域是光面的所有面积,积分域是x点的所有立体角。因此通过光源位置与球面立体角的关系,把采样域和积分域的统一。可以是(1)改PDF函数,把光源采样的PDF转化成在球面立体角采样的PDF。(2)改积分函数,把立体角上的积分转化成在光源上的积分。在视频算法中选择了后者。
根据立体角的定义可知:
$$ d\omega = \frac{dA\cos\theta'}{||x'-x||^2} $$
❓ 听上去逻辑很顺,总感觉有点怪。上面这个公式要求A的面积不能太大。如果是一个大的光源,是不是要分解成很多小的dA?
❓ 为什么dA不能太大?
代入渲染方程可得:
$$ L_o(x, w_o) = \int_AL_i(x, w_i)f_r(x, w_i, w_o)\frac{\cos\theta\cos\theta'}{||x'-x||^2}dA $$
总结 [1:11:26]
以上优化是针对光源来做的,因此只用于直接光照。
✅ 因为反射的光线可能来自任何地方,不可能对来源做枚举。
因此这个优化算法是,直接光照和间接光照分开处理:
- 直接光照在光源上积分,间接光照仍旧在立体角上积分。
- 直接光照不需要考虑“Russian Roulette”,间接光照涉及多次弹射才需要。
在光源上积分需要判断一个 sample 出的光线是否被挡住
光源被挡住
遍历所有光源,并计算光源对x点的贡献,这里没有考虑光源被挡住的场景。
解决方法:
判断xx'的连线上是否有其它物体。
效果
照片级真实感
其它
- 点光源当成面积很小的光源处理
- 怎样基于一个pdf做采样?
- 怎么选择好的pdf?均匀采样→重要性采样
- 随机数质量对算法的影响
- 把上半球采样与光源采样结合起来
- pixel reconstruction filter
- radiance → color, gamma 校正
本文出自CaterpillarStudyGroup,转载请注明出处。
https://caterpillarstudygroup.github.io/GAMES101_mdbook/