Skip to content

光线追踪是一种计算点与点之间可见性的技术。光传输算法被设计用来模拟光在空间中传播的方式(同时与物体发生交互)。它们被用于(简而言之)计算场景中某一点的颜色。请不要将光线追踪和光传输算法混为一谈。它们是两个不同的东西。光线追踪并非光传输算法,它只是一种计算点与点之间可见性的技术.

首先,渲染器的目的是为每个像素分配一个颜色,从而生成一个准确代表从特定3D视角观察到的场景几何形状的图像。我们也知道,参数如视野角度会影响我们看到场景的范围。

在前一课和本课中,我们已经解释过,光线追踪图像是通过为每个像素生成一条光线来创建的。当一条光线与场景中的一个物体相交时,我们将该像素的颜色设置为相交点处物体的颜色。这个过程被称为后向追踪或眼追踪(因为我们沿着从相机到物体,再从物体到光源的光线路径进行追踪,而不是从光源到物体,再从物体到相机的路径进行追踪)。我们将在接下来的课程中更详细地介绍这个过程。

总之,光线追踪的核心思想是:

  1. 为每个像素生成一条光线
  2. 检测光线与场景中物体的相交
  3. 根据相交点设置像素颜色

让我们仔细回顾一下构建这些原初或相机光线的过程:

  1. 光线的起点是相机的原点。在大多数3D应用程序中,创建相机时其默认位置都位于世界坐标系的原点(0, 0, 0)。

  2. 从第3课关于针孔相机模型的内容回忆,相机原点可以视为针孔相机的光圈(也是投影中心)。在实际的针孔相机中,胶片位于光圈的后面,光线通过几何构造形成场景的倒影。但是,如果胶片平面位于光圈前面而不是后面,就可以避免这种倒影。

  3. 在光线追踪中,通常将胶片平面放置在相机原点正前方1个单位的距离处,这个距离是固定不变的,我们稍后会解释原因。

  4. 通常,相机的默认方向被设置为沿负z轴。虽然相机的初始方向由开发人员自行决定,但一般都是沿正z轴或负z轴。RenderMan、Maya、PBRT和OpenGL都将相机对准负z轴我们建议开发人员也遵循这种惯例。

为了简化演示的开始,我们假设渲染的图像是正方形的(即图像的宽度和高度像素数相等)。

  1. 我们需要为每个像素都生成一条原初光线。这可以通过从相机原点出发,绘制一条穿过每个像素中心的线来实现(如图1所示)。

  2. 我们可以将这条线表示为一条射线,其原点为相机原点,方向为从相机原点指向像素中心的向量。

  3. 为了计算像素中心的位置,我们需要将原本以像素为单位表示的光栅空间坐标(左上角为(0,0))转换为世界空间坐标。

  4. 假设图像分辨率为 width×height 像素,那么第(x,y)个像素的中心坐标可以计算为:

pixel_center_x = (x + 0.5) * (image_width / width)
pixel_center_y = (y + 0.5) * (image_height / height

我们的任务是为每个像素生成一条原初光线。这可以通过从相机原点开始绘制一条线,并使其穿过每个像素的中心来轻松完成(如图1所示)。我们可以将这条线表示为一条射线,其原点为相机原点,方向为从相机原点指向像素中心的向量。为了计算像素中心点的位置,我们需要将原本以像素为单位表示的光栅空间坐标(左上角为(0,0))转换为世界空间坐标。

首先,我们需要使用帧的尺寸对这个像素位置进行归一化。像素新的归一化坐标被称为NDC空间(Normalized Device Coordinates,标准设备坐标)。

请注意,我们在像素位置上添加了一个小偏移量(0.5),因为我们希望最终的相机光线穿过像素的中心。以NDC空间表示的像素坐标范围为0,1。如图2所示,胶片或图像平面是以世界坐标系原点为中心的。换句话说,位于图像左侧的像素应该有负的x坐标,而位于右侧的像素应该有正的x坐标。对y轴来说也是同样的逻辑。位于x轴上方的像素应该有正的y坐标,而位于下方的像素应该有负的y坐标。我们可以通过将当前在[0:1]范围内的归一化像素坐标重新映射到[-1:1]范围来解决这个问题。

重映射后的y坐标会出现相反的情况。所以我们需要使用下面的公式来修正这个问题,因为光栅化空间坐标是从左上角为 (0,0),正常是左下角为 (0,0),需要翻转下 y 轴

Released under the MIT License.