为什么使用光线追踪?
- 光栅化不能很好处理全局效果(软阴影,反弹超过一次的光线)
- 光栅化速度快,但质量低
- 光线追踪精确,但耗时
Basic Ray Tracing Algorithm
图形学中有关光追的三条规定:
1.光线沿直线传播
2.光线交叉时不发生"碰撞"
3.光线从光源出发到达人眼
Ray Casting
光线投射主要思想:
生成图像时,向每个像素投射一条光线
生成阴影时,当眼睛光线与物体表面相交后,从该交点再向光源发射一条阴影光线;如果这条光线在到达光源之前与其他物体相交,则该交点处于阴影中
假设有一条从眼睛发出的eye ray,与最近的物体表面交于一点,连接该点与光源,若无物体遮挡,
则可以看作光源发出的光线经物体表面该点反射能到达人眼

Recursive ( Whitted-Style) Ray Tracing
上面的光线投射只考虑了光线反射一次的情况
递归光线追踪考虑光线多次反射
我们将从眼睛发出的第一条光线称为primary ray,后面反射/折射的光线称为secondary rays
所有光线都可与物体表面交于一点,我们考虑这些点与光源连线shadow rays的连通性

Ray-Surface Intersection
首先考虑光线与物体表面相交 的计算
光线方程:r(t)=o+td,0≤t<∞r(t) = o + td, 0 \le t < ∞r(t)=o+td,0≤t<∞
光线由光源o与方向向量d定义,光线上任意一点r(t)由时间t通过光线方程决定
光线与隐式表面相交:
光线:r(t)=o+td,0≤t<∞r(t) = o + td, 0 \le t < ∞r(t)=o+td,0≤t<∞
隐式表面:p:f(p)=0p: f(p) = 0p:f(p)=0
代入得:f(o+td)=0f(o+td)=0f(o+td)=0 解得正实根即为光线与表面的交点
光线与三角形网格相交:
检测光线与三角形是否有交点可转化为
光线与三角形所在平面的交点是否在三角形内
平面方程:p:(p−p′)N=0p: (p-p')N = 0p:(p−p′)N=0
平面由法线向量与平面上一点定义
平面上的所有点p满足向量pp'与法向量垂直
光线:r(t)=o+td,0≤t<∞r(t) = o + td, 0 \le t < ∞r(t)=o+td,0≤t<∞
平面:p:(p−p′)N=0p: (p-p')N = 0p:(p−p′)N=0
代入得:(o+td−p′)N=0(o+td-p')N = 0(o+td−p′)N=0 解得正实根即为光线与表面的交点

Möller Trumbore Algorithm可用于快速判断光线与三角形是否有交点
考虑三角形P0P1P2P_0P_1P_2P0P1P2
解方程O+tD=(1−b1−b2)P0+b1P1+b2P2O+tD = (1-b_1-b_2)P_0+b_1P_1+b_2P_2O+tD=(1−b1−b2)P0+b1P1+b2P2
(1-b1-b2, b1, b2)构成重心坐标
若光线与三角形有交点,该三元方程组解出的(t, b1, b2)满足
t为非负数, 1-b1-b2, b1, b2均为非负数

Accelerating Ray-Surface Intersection
普通光线-场景交集:遍历每个三角形找到最近的交点
pixels x triangles x bounces 非常耗时
边界体积Bounding Volume
将复杂物体用一个简单的volume框住,物体由volume完全覆盖
如果光线与volume不相交,则与物体也不相交;则可以先检测光线是否与volume相交,再检测是否与物体相交

一般采用与坐标轴对齐的包围盒Axis-Aligned Bounding Box(AABB) ,我们将该长方体视为三组相对的面围成的体积
选择与坐标轴对齐,可以简化三维运算到相似下的单一方向的运算

光线在x, y, z三个方向上都能计算出进入相对面的中间区域的时间tmint_{min}tmin和离开该区域的时间tmaxt_{max}tmax
下图中光线在tmint_{min}tmin时间进入x0面,在tmaxt_{max}tmax时间离开x1面

!!!
光线在三个方向均进入中间区域时,光线处于box中
光线在任意一个方向退出中间区域时,光线离开box
!!!
因此对于3D的box,
光线进入box的时间tenter=max{tmin}t_{enter} = max\{t_{min}\}tenter=max{tmin}
光线退出box的时间texit=min{tmax}t_{exit} = min\{t_{max}\}texit=min{tmax}
考虑texit<0t_{exit}<0texit<0时,box在光线后方
tenter<0t_{enter}<0tenter<0时,光源在box内
最终结果:光线与AABB相交当且仅当tenter≤texitt_{enter} \le t_{exit}tenter≤texit 且 texit≥0t_{exit}\ge0texit≥0