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:
    1. Can’t solve “glossy” surface well - Utah teapot
    2. No reflections between diffuse materials. should contains color bleeding - The Cornell box
    3. 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}$
  • 实际操作:把直接光照和间接光照分开算,直接光照对光源积分,间接光照用俄罗斯轮盘。
  • 需要判定直接光照半路有遮挡的情况。