GAMES101 16 Ray Tracing 4 Path Tracing
Ray Tracing 4 Path Tracing
Monte Carlo Integration
- Definite intergral: $\int_{a}^{b}{f(x)dx}$
- Random variable: $X_i\sim pdf(x)$ , pdf is the Probability Distribution Function
- Monte Carlo estimator: $F_N=\frac{1}{N}\sum_{i=1}^{N}{\frac{f(x_i)}{pdf(x_i)}}$
我自己证明一下:中心极限定理,当 $ N\rightarrow \infty $
$\frac{1}{N}\sum_{i=1}^{N}{\frac{f(x_i)}{pdf(x_i)}}\rightarrow E(\frac{f(x_i)}{pdf(x_i)})$
$= \int_{a}^{b}{pdf(x_i)\times \frac{f(x_i)}{pdf(x_i)}}dx$
$=\int_{a}^{b}{f(x_i)}dx$
$= F_N|_{a}^{b}$
$F_N|_{a}^{b}$ 大概就是$x$从$a$到$b$的面积了
Path Tracing
Whitted-Style Ray Tracing:
- Always perform specular reflections / refractions
- Stop bouncing at diffuse surfaces
- Problems:
- Can’t solve “glossy” surface well - Utah teapot
- No reflections between diffuse materials. should contains color bleeding - The Cornell box
- Whitted-Style Ray Tracing is Wrong! But the rendering function is correct
A Simple Monte Carlo Solution:
- 对于一个点,就是把四面八方进来的光合起来(这里对方向进行采样,进行蒙特卡罗积分),然后算出射到眼睛点的光。
- 最简单的办法,均匀采样, $p(\omega_i)=1/2\pi$
- 得到方程 $ L_o(p,\omega_o)\approx\frac{1}{N}\sum_{i=1}^{N}{\frac{L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot \omega_i)}{p(\omega_i)}} $
Introducing Global Illumination 全局光照
- 就是在每个点的光源里面加上其他点的光,其他点的光怎么求?递归调用。
- 但是这么算会出现光线爆炸,光线指数级别增长,内存也炸了。
- 唯一不爆炸的办法就是每次取样只取样一束外来光线。形成一条光线的路径,所以也叫路径追踪。
Ray Generation
- 光线生成,从一个像素点出发,取样许多光线,进行路径追踪
- SPP (Samples per pixel) (还有一个spp是fstream并行用的)
Russian Roulette 俄罗斯轮盘赌
- 解决光线弹射无数次的问题
- 设置一个生存概率P。如果落入概率P中,反射的光线值取 $L_o/p $。如果没落入P中,反射光线取0.
- 这样做的好处就是让整体的期望仍然是 $L_o$
Sampling the Light (面光源场景)
- So, now it will generate a correct path tracing.
- 但是仍会有光线浪费问题。也就是如果很少有光源而来的光线,那么就有很多光线被浪费了。
- 也就是,取决于一个高效的pdf的问题。改进原来的pdf
- 而如果要做到这些,需要让渲染方程是对A积分而非对omega积分。
- 转换公式: $d\omega =\frac{dA cos\theta’}{||x’-x||^2}$
- 实际操作:把直接光照和间接光照分开算,直接光照对光源积分,间接光照用俄罗斯轮盘。
- 需要判定直接光照半路有遮挡的情况。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Chuan 川 Charles!
评论