 ppt笔记)
Monte Carlo Integration计算复杂的定积分时通过随机采样的函数值的平均值估计该函数的定积分对于函数f(x)f(x)f(x)的积分∫abf(x) dx\int_a^b f(x) \, dx∫abf(x)dx其蒙特卡洛积分表示为1N∑i1Nf(Xi)p(Xi) \frac{1}{N} \sum_{i1}^N \frac{f(X_i)}{p(X_i)}N1i1∑Np(Xi)f(Xi)采样数量越多误差越小在x上采样在x上积分Path Tracing前面介绍的Whitted-style ray tracing只考虑了镜面反射和折射并在遇到漫反射表面时停止反射光线如左图未考虑光线在遇到漫反射表面后的继续传播天花板被渲染成黑色且柱形的侧面没有与周围墙壁颜色相关的color bleeding我们需要更符合物理规律的算法下面围绕渲染方程进行展开Lo(p,ωo)Le(p,ωo)∫ΩLi(p,ωi)fr(p,ωi,ωo)(n⋅ωi) dωi L_o(p, \omega_o) L_e(p, \omega_o) \int_{\Omega^} L_i(p, \omega_i) f_r(p, \omega_i, \omega_o) (n \cdot \omega_i) \, d\omega_iLo(p,ωo)Le(p,ωo)∫ΩLi(p,ωi)fr(p,ωi,ωo)(n⋅ωi)dωi首先只考虑下面场景中一个像素接受到的直接照亮direct illumination的光不考虑Le(p,ωo)L_e(p, \omega_o)Le(p,ωo)项要计算定积分∫ΩLi(p,ωi)fr(p,ωi,ωo)(n⋅ωi) dωi\int_{\Omega^} L_i(p, \omega_i) f_r(p, \omega_i, \omega_o) (n \cdot \omega_i) \, d\omega_i∫ΩLi(p,ωi)fr(p,ωi,ωo)(n⋅ωi)dωi设置蒙特卡洛积分的概率密度函数pdf为p(ωi)1/2πp(\omega_i) 1/2\pip(ωi)1/2π得到定积分的计算结果Lo(p,ωo)≈1N∑i1NLi(p,ωi)fr(p,ωi,ωo)(n⋅ωi)p(ωi) L_o(p, \omega_o) \approx \frac{1}{N} \sum_{i1}^N \frac{L_i(p, \omega_i) f_r(p, \omega_i, \omega_o) (n \cdot \omega_i)}{p(\omega_i)}Lo(p,ωo)≈N1i1∑Np(ωi)Li(p,ωi)fr(p,ωi,ωo)(n⋅ωi)初步得到path tracing的计算方式计算某一点反射的光时随机采样n个入射方向向这n个方向追踪光线若光线到达光源将结果加上上述公式计算出的结果若光线到达物体以该物体在该方向反射出的光作为上式中的Li(p,ωi)L_i(p, \omega_i)Li(p,ωi)计算公式结果加到最终结果中这里可以把物体反射出的光看作另一种光源发出的光伪代码如下shade(p, wo) Randomly choose N directions wi~pdf Lo 0.0 For each wi Trace a ray r(p, wi) If ray r hit the light Lo (1 / N) * L_i * f_r * cosine / pdf(wi) Else If ray r hit an object at q Lo (1 / N) * shade(q, -wi) * f_r * cosine / pdf(wi) Return Lo这种算法具有下列问题1.指数爆炸需要计算的光线数量是采样数量的反弹次数次幂因此我们假设采样次数N为1这样只随机采样一个方向的光没有for循环另采样次数不为1的算法称作分布式光线追踪Distributed Ray Tracing而采样次数过少会带来很大噪声我们对一个像素追踪多条路径并对radiance结果取平均值ray_generation(camPos, pixel) Uniformly choose N sample positions within the pixel // 对每个像素追踪多条路径 pixel_radiance 0.0 For each sample in the pixel Shoot a ray r(camPos, cam_to_sample) // 从摄像机到采样点追踪一条光线 If ray r hit the scene at p pixel_radiance 1 / N * shade(p, sample_to_cam) // 利用path tracing的函数shade Return pixel_radiance2.递归算法无限递归计算机不能做无限次的光线弹射减少弹射次数意味着截断power我们采用俄罗斯轮盘赌Russian Roulette从前我们采样时永远会向表面上的采样点发射一个光线返回radianceLoL_oLo现在设置一个概率P在发射光线后有 P 的概率返回Lo/PL_o / PLo/P有 1-P 的概率返回 0这保证了返回radiance的数学期望仍然是LoL_oLo现在解决path tracing的效率问题若光源面积过小采样发出的很多条光线因不会到达光源而被浪费对于光源发出的光线我们不在采样点上对立体角积分而是在光源处采样对光源面积A积分设置光源的pdf 1 / A找到dωd\omegadω和dAdAdA的数量关系立体角的定义是区域在单位球上投影的面积我们将光源在垂直光线上的分量等比例投射到单位球上下面θ′\thetaθ′表示光源法线与光线的夹角dωdA∥x′−x∥2cosθ′ d\omega \frac{dA}{\|x - x\|^2} \cos \thetadω∥x′−x∥2dAcosθ′将dωd\omegadω代入到上面的公式得到对光源积分的结果Lo(x,ωo)∫ALi(x,ωi)fr(x,ωi,ωo)cosθcosθ′∥x′−x∥2 dA L_o(x, \omega_o) \int_A L_i(x, \omega_i) f_r(x, \omega_i, \omega_o) \frac{\cos \theta \cos \theta}{\|x - x\|^2} \, dALo(x,ωo)∫ALi(x,ωi)fr(x,ωi,ωo)∥x′−x∥2cosθcosθ′dA现在我们就把结果分为两部分1.光源直接照射不考虑俄罗斯轮盘赌2.其他反射indirect考虑RR最后考虑光线是否被物体遮挡得到最终path tracing算法shade(p, wo) # Contribution from the light source. Uniformly sample the light at x’ (pdf_light 1 / A) Shoot a ray from p to x’ If the ray is not blocked in the middle L_dir L_i * f_r * cos θ * cos θ’ / |x’ - p|^2 / pdf_light # Contribution from other reflectors. L_indir 0.0 Test Russian Roulette with probability P_RR Uniformly sample the hemisphere toward wi (pdf_hemi 1 / 2pi) Trace a ray r(p, wi) If ray r hit a non-emitting object at q L_indir shade(q, -wi) * f_r * cos θ / pdf_hemi / P_RR Return L_dir L_indirNot covered上面的讨论未涉及很多细节均匀采样半球 -带权重的半球采样蒙特卡洛的pdf选择 -重要性采样Importance Sampling随机数的选择 -低差异序列Low Discrepancy Sequences光源与半球采样的结合 -组合采样Multiple Importance Sampling像素的radiance为所有路径得到radiance的平均值 -像素重建滤波器Pixel Reconstruction Filter像素的radiance和color的关系 -伽马矫正gamma correction图形学博大精深