DongGu
光线追踪基本原理

光线追踪基本原理

前面我们已经介绍了光栅化的知识:对于三维空间中的模型,我们可以通过透视投影以及深度缓冲将其呈现在屏幕空间上,然后再进行着色。这种渲染方式的特点是速度快,但真实度较低。我们在着色章节提到过,Blinn-Phong 等着色模型擅长处理局部光照,却不擅长处理全局光照(比如复杂的阴影、光线的折射与反射等)。

如何实现更逼真的光照效果呢?这里介绍一种方法 — 光线追踪(Ray Tracing)。它的核心思路是模拟物理世界中光线的传播:通过追踪光路,判断反射点与光源之间的关系,得到光线最终呈现在屏幕上的颜色。这种渲染方式的特点是速度慢,但真实度极高。它非常擅长处理光线与物体交互的各种特效(软阴影、磨砂反射、间接照明等),是物理正确的。

接下来,我们通过介绍一种经典的光线追踪模型 — Whitted-Style Ray Tracing — 来学习光线追踪的基本原理。

Whitted-Style 光线追踪

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 模型为主线,涵盖了以下几个核心内容:

  1. Whitted-Style 的四步流程:初级光线生成 → 场景求交 → 反射/折射递归 → 着色计算。
  2. 光线的数学表示:参数方程
  3. 光线与球体的求交:代入球体方程,化为二次方程求解。
  4. 光线与三角形的求交:既可以通过”平面求交 + 内部判断”的两步法,也可以使用更高效的 Möller-Trumbore 算法一步到位。

光线追踪虽然能生成物理正确的逼真图像,但其计算量极大 ——— 每条光线都需要与场景中的所有三角形进行求交测试。后续文章将介绍 加速结构(如 BVH 包围盒层次结构) 来大幅减少求交次数,使光线追踪在实时渲染中成为可能。


这次的插图来自画师 luoyu

图片地址:https://www.pixiv.net/artworks/123634360

本文作者:DongGu
本文链接:https://donggu.xyz/2026/06/17/图形学入门/光线追踪基本原理/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可