光线追踪基本原理
前面我们已经介绍了光栅化的知识:对于三维空间中的模型,我们可以通过透视投影以及深度缓冲将其呈现在屏幕空间上,然后再进行着色。这种渲染方式的特点是速度快,但真实度较低。我们在着色章节提到过,Blinn-Phong 等着色模型擅长处理局部光照,却不擅长处理全局光照(比如复杂的阴影、光线的折射与反射等)。
如何实现更逼真的光照效果呢?这里介绍一种方法 — 光线追踪(Ray Tracing)。它的核心思路是模拟物理世界中光线的传播:通过追踪光路,判断反射点与光源之间的关系,得到光线最终呈现在屏幕上的颜色。这种渲染方式的特点是速度慢,但真实度极高。它非常擅长处理光线与物体交互的各种特效(软阴影、磨砂反射、间接照明等),是物理正确的。
接下来,我们通过介绍一种经典的光线追踪模型 — Whitted-Style Ray Tracing — 来学习光线追踪的基本原理。
Whitted-Style 光线追踪
Whitted-Style 是最基础的光线追踪模型,它的核心思想是光路可逆:我们不从光源发射光线(因为绝大多数光线不会进入眼睛),而是从眼睛(相机)出发,穿过成像平面上的每一个像素,反向投射到场景中。
核心流程分为四步:
第一步:生成初级光线(Primary Ray)
从视点(Eye)出发,穿过成像平面上的某个像素
第二步:求交(Intersection)
找到光线与场景中物体的第一个交点(最近的碰撞点)。求交算法将在后文详细介绍。
第三步:计算反射与折射,生成次级光线(Secondary Ray)
如果物体表面是镜面或透明的,光线会完美地发生反射(Reflection)和折射(Refraction),生成新的次级光线继续向前传播,直到撞到非镜面物体,或者达到预设的最大递归深度。
第四步:计算着色(Shading)
从交点向光源连一条阴影光线(Shadow Ray)。如果阴影光线在到达光源之前被其他物体遮挡,说明该交点在阴影中;如果没有被挡住,则用光照模型(如 Blinn-Phong)计算该点的亮度和颜色。
每条递归路径上的交点颜色值按照反射 / 折射系数加权叠加,最终得到该像素的颜色值。
光线的表示与生成
在三维空间中,一条光线在数学上可以用参数方程来表示:
其中:
(Origin):光线的起点(三维坐标点)。 (Direction):光线的方向(通常是一个单位向量)。 :距离参数。改变 的值,就能得到光线路径上的任意一点。
光线的生成需要利用相机的视场角(FOV)和宽高比(Aspect
Ratio),把像素的屏幕坐标
最终这条光线的方程即为
光线与物体求交(Ray-Scene Intersection)
求交是光线追踪中最核心的几何运算。每一条光线都需要与场景中的所有物体进行碰撞检测,找到最近的交点。
光线与球体求交
对于三维空间中的球体,球面上任意点
其中
将光线方程
展开后得到关于
通过求解二次函数的判别式
:不相交。 :相切(一个交点)。 :穿过球体(两个交点),取较小的正根 即为最近的交点。
光线与三角形求交
三角形是三维模型的基本构建单元,光线与三角形的求交是光线追踪中调用最频繁的操作。
方法一:平面求交 + 内部判断
我们知道,三个点确定一个平面,三角形必然位于某个平面上。因此,可以先求光线与三角形所在平面的交点,再判断该交点是否在三角形内部。
已知平面的法向量
将光线方程
解出
判断条件:
:交点在相机前方(有效交点)。
得到交点坐标后,再通过叉乘等方法判断该交点是否在三角形内部。
方法二:莫勒-特朗博尔算法(Möller-Trumbore Algorithm)
除了上述两步法,还有一种更高效的算法可以直接求解光线与三角形的交点 — 莫勒-特朗博尔算法(Möller-Trumbore Algorithm)。
它的核心思想是:直接利用重心坐标(Barycentric Coordinates),一步到位地同时求出交点坐标和重心坐标。
前面我们介绍过三角形的重心坐标公式,三角形内部任意一点都可以表示为:
让光线方程等于三角形内部点方程:
令
即:
写成矩阵形式:
利用 克莱姆法则(Cramer’s Rule)
和标量三重积恒等式,可以高效地直接解出三个未知数
记
判断条件:
:交点在相机前方(有效交点)。 :交点在三角形内部。
Möller-Trumbore 算法的优势在于:只需要一次求解就能同时得到
总结
本文介绍了光线追踪的基本原理,以 Whitted-Style 模型为主线,涵盖了以下几个核心内容:
- Whitted-Style 的四步流程:初级光线生成 → 场景求交 → 反射/折射递归 → 着色计算。
- 光线的数学表示:参数方程
。 - 光线与球体的求交:代入球体方程,化为二次方程求解。
- 光线与三角形的求交:既可以通过”平面求交 + 内部判断”的两步法,也可以使用更高效的 Möller-Trumbore 算法一步到位。
光线追踪虽然能生成物理正确的逼真图像,但其计算量极大 ——— 每条光线都需要与场景中的所有三角形进行求交测试。后续文章将介绍 加速结构(如 BVH 包围盒层次结构) 来大幅减少求交次数,使光线追踪在实时渲染中成为可能。
这次的插图来自画师 luoyu
图片地址:https://www.pixiv.net/artworks/123634360