概述

为什么

为什么使用光线追踪:因为光栅化的着色局部性,无法解决全局效果如 软阴影、光泽反射、间接光照。

底层原理

  1. 光沿直线传播
  2. 光线相互不可碰撞,如果光线传播路径交叠,互不干扰。
  3. 光线具有可逆性

光线追踪

经典/惠特式/递归 光线追踪,采用间接光照,即允许多次反射。

技术细节

交点判定

隐式交点判定与显式交点判定。

交点判定加速

采用包围盒(计算机图形学中一般采用轴对齐包围盒),按照交点判定算法执行判断条件。

光线追踪的问题

经典光线追踪假设:

  1. 在 镜面反射与折射
  2. 在漫反射面停止反射

为了解决问题,引入渲染方程。

渲染方程与求解

渲染方程与展开

\[ L_r(p,\omega_r)=L_e(p,\omega_r)+\int_{H^2}L_i(p,\omega_i)f_r(p,\omega_i,\omega_r)(n\cdot\omega_i)d\omega_i \]

渲染方程的求解

蒙特卡洛积分(Monte Carlo Integration)的基本思想是:在积分域内不断采样 f(x),不断地与 ab 构成一个个长方形,然后对所有的长方形的面积之和求平均值。由此我们可以得到离散形式的蒙特卡洛方程,如下所示。 \[ F_N=\frac1N\sum_{i=1}^1\frac{f(x_i)}{p(x_i)} \] 连续形式: \[ \int_a^bf(x)dx=\frac1N\sum_{i=1}^N\frac{f(x_i)}{p(x_i)} \] 忽略着色点本身的发光,且在半球面上任意一点的采样概率是 \(1/2\pi\) ,即 概率密度函数 (PDF)。采用蒙特卡洛法求解渲染方程: \[ \begin{aligned} L_o(p,\omega_o)& =\int_{H^2}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot\omega_i)d\omega_i \\ &\approx\frac1N\sum_{i=1}^N\frac{f(\omega_i)}{p(\omega_i)} \\ &\approx\frac1N\sum_{i=1}^N\frac{L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot\omega_i)}{p(\omega_i)} \end{aligned} \] 在此基础上(上述只处理一次光弹射),处理二次三次弹射等。

Q 点反射到 P 点的光线,不就等于从 P 点观测 Q 点,Q 点的着色吗?于是全局光照就转换成了一个递归着色的过程。

还存在两个问题:

  • 分治爆炸:每个点采样100个方向,那它的采样点要采样10000个,采样点的采样点要采样 1000000个,指数爆炸。
  • 无限递归:光线不断反射,就需要不断反向追踪

分治爆炸

采用路径追踪或者多次路径追踪求平均值

无限递归

借鉴了 俄罗斯轮盘赌(Russion Roulette,RR)的思想。

俄罗斯轮盘赌的基本原理是设定一个概率值 \(0<P<1\)

  • 射出光线的概率为 \(P\),由此返回的着色结果为\(L_0/P\)
  • 不射出光线的概率为 \(1-P\),由此返回的着色结果为 \(0\)

使用这种方式,我们仍然可以期望得到 \(L_0\),如下所示为俄罗斯轮盘赌的期望公式. \[ E=P*(L_0/P)+(1-P)*0=L_0E=P∗(L0/P)+(1−P)∗0=L0 \]

光源采样低效

原因是:均匀采样,然而很多方向没有光源,所以大多数方向浪费。

因此直接对光源进行采样,因此直接对光源进行采样。

总结

最终着色结果来源于两部分:

  • 光源的直接作用:直接采样光源,无需俄罗斯轮盘赌
  • 光源的间接作用:反射、漫反射,需要俄罗斯轮盘赌

参考文献

[1] 楚权的博客 [2] 《GAMES 101》