Lecture 16: Ray Tracing 4(Monte Carlo Path Tracing)
本讲内容
- 简要复习上节课
- 蒙特卡洛积分
- 路径最终
复习:渲染方程
复习:关于概率
Monte Carlo Integration(蒙特卡洛积分)
- 为了什么而提出?
- 给任意函数计算其从a到b的定积分
- 通常对于比较复杂的函数,是一种数值方法
- 黎曼积分:认为竖直每份是微小长方形
- 蒙特卡洛积分:在a和b直接随机取数直接近似一个长方形,如此采样许多次然后取平均——在积分域内不断采样,将长方形面积求平均
- 蒙特卡洛积分具体表示
- 举例说明
- 蒙特卡洛积分有一种特殊情况,就是随机变量是均匀采样
- 最后得到蒙特卡洛积分(只需要知道最后采样区间的PDF是多少就可以),注意:
- N越大,结果越准
- 定义在x上的积分,得采样x,别的不行
Path Tracing
Motivation: Whited-Style Ray Tracing
- Whited-Style ray tracing
- 不断弹射光线(镜面反射/折射)
- 在粗糙表面漫反射
- 这么做对吗:
- Path Tracing为改进Whited-Style ray tracing的问题而提出
Whited-Style Ray Tracing的问题
- 对于glossy(相比mirror没那么光滑)表面的效果不对,不应沿着镜面反射
- 对于漫反射,打到diffuse物体就停了,不继续打了,考虑不到漫反射物体之间的光照,下图中右图物体左面发红的现象被称为color bleeding(全局光照内的效果)
Whited-Style Ray Tracing是错的
- 但是渲染方程是对的,解方程有两个拦路虎:
- 积分
- 而且递归定义
使用蒙特卡罗方法试图解渲染方程
-
问题:解一个点的直接光照
-
上面有面光源,还有摄像头,箱子
-
忽略渲染方程的发光项,不再区分渲染方程和反射方程
-
直接光照说明这个光只能是光源的
-
就是解半球不同方向的积分
-
要考虑f(x)和pdf都是多少
-
我们已经可以把方程写成蒙特卡洛积分的形式
-
积分怎么写出来?(直接光照情况)
-
更进一步,引入间接光照,一种简单的想法——相当于在p点看q点
-
算法补充(蓝色字)递归了家人们
-
然而问题并没有被解决
- 问题1:这样光线的数量会爆炸(除了n=1的时候)!
- 问题1:这样光线的数量会爆炸(除了n=1的时候)!
-
再改!用一根光线的说! 但是噪声太大了!(以后说咋办)
-
形成了一条连接视点与光源的路径,算法(也算是有蒙特卡洛积分,对于每个像素):
-
上图解决了问题一
-
还有一个问题:递归的终止条件呢?算法停不了了!虽然现实世界也不会停,但是也不能限制弹射次数,这会导致能量损失。
-
解决新的问题的方法:Russian Roulette(RR)——俄罗斯轮盘赌
按概率停止弹射,给自己定一个概率,以一定的概率P打光线,- 打了(P)对其结果返回值Lo除以P
- 不大(1-P)结果就是0
-
通过这种方式Lo就是期望!
-
轮盘赌后的代码,加了个P_RR:
-
目前算法已经正确了!但是不够高效!
- 效果受到SPP的制约
- 效果受到SPP的制约
-
问题在于对于不同大小的光源,每个着色点打到光源的光线数目看运气,很多光线浪费了!
-
是否有不浪费光线的采样方法?
-
开始难了,对于着色点在光源上进行采样!
-
但是渲染方程不定义在光源上!不符合蒙特卡洛的原则了!
-
要把渲染方程写成在光源上的积分!
-
可以,要知道dω和dA的关系,这很简单,因为我们定义过立体角,把dA向单位球上投影就行!如下式:
-
更进一步,重写渲染方程:
-
之前我们是盲目地在着色点去采样,现在是直接对光源进行采样,radiance来自于两部分
- 光源(无需RR)
- 非光滑(需要RR)
-
写出来!
-
所有问题已经解决,除了还有一个小问题!
- 要是光源和着色点直接有别的物体呢?要判断!
- 取光源和着色点连线看有物体吗?
-
路径追踪算法就这样了!
-
点光源很难,先不说了,可以做成很小的面积光源
遗留的一些问题,小东西
-
把path tracing写对非常难!
-
学习可以帮助我们深入理解!
-
这还算入门吗?非常算!
-
早期与当今概念区别:
一些没说的话题
- 具体咋采样啊?
- 蒙特卡洛积分采用啥样的pdf最好呢
- 随机数很重要吗?
- 能不能结合随机采样和采样光源?
- 为什么平均起来就是像素的radiance?是否需要加权平均,还是简单平均?
- 算出来的radiance是颜色吗,这是咋做的?
- 路径追踪算不算入门?算啊!敬畏科学吧!