计算机图形学-8-光线追踪
概述
为什么
为什么使用光线追踪:因为光栅化的着色局部性,无法解决全局效果如 软阴影、光泽反射、间接光照。
底层原理
- 光沿直线传播
- 光线相互不可碰撞,如果光线传播路径交叠,互不干扰。
- 光线具有可逆性
光线追踪
经典/惠特式/递归 光线追踪,采用间接光照,即允许多次反射。
技术细节
交点判定
隐式交点判定与显式交点判定。
交点判定加速
采用包围盒(计算机图形学中一般采用轴对齐包围盒),按照交点判定算法执行判断条件。
光线追踪的问题
经典光线追踪假设:
- 在 镜面反射与折射
- 在漫反射面停止反射
为了解决问题,引入渲染方程。
渲染方程与求解
渲染方程与展开
\[ 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》