Category:Higher Mathematics & Computer Graphics Application
正文
4 光线追踪(一)
计算机图形学的基本任务之一是渲染 3D 对象:拍摄一个场景或模型,该场景或模型由排列在 3D 空间中的许多几何对象组成,并生成一个 2D 图像,显示从特定视点观察到的对象。几个世纪以来,建筑师和工程师通过绘制图纸将他们的设计传达给他人,所做的操作与此相同。
如果输出是矢量图像而不是光栅图像,则渲染不必涉及像素,但我们将在本书中假设光栅图像。
从根本上说,渲染是一个将一组对象作为其输入并产生一个像素数组作为其输出的过程。一种或另一种方式,渲染涉及考虑每个对象对每个像素的贡献。它可以通过两种一般方式进行组织。在对象顺序渲染中,依次考虑每个对象,并为每个对象找到并更新其影响的所有像素。在 imageorder 渲染中,依次考虑每个像素,并为每个像素找到影响它的所有对象并计算像素值。您可以考虑循环嵌套方面的差异:在图像顺序渲染中,“for each pixel”循环在外面,而在对象顺序渲染中,“for each object”循环在外面。
图像顺序和对象顺序渲染方法可以计算完全相同的图像,但它们适用于计算不同类型的效果并具有完全不同的性能特征。在讨论完这两种方法之后,我们将在第 8 章探讨它们的比较优势,但是,从广义上讲,图像顺序渲染更容易工作,并且可以产生的效果更灵活,而且通常(虽然不是总是)需要更多的执行时间来生成可比较的图像。
在光线追踪器中,很容易计算准确的阴影和反射,这在 objectorder 框架中很尴尬。
光线追踪是一种用于渲染 3D 场景的图像顺序算法,我们将首先考虑它,因为无需开发任何用于对象顺序渲染的数学机制就可以让光线追踪器工作。
4.1 基本光线追踪算法
光线追踪器通过一次计算一个像素来工作,对于每个像素,基本任务是找到在图像中该像素位置看到的物体。每个像素“看”在不同的方向,像素看到的任何物体都必须与视线相交,视线从视点发出的线朝像素所看的方向。我们想要的特定对象是与最接近相机的视线相交的对象,因为它阻挡了它后面的任何其他对象的视线。一旦找到该对象,着色计算将使用交点、表面法线和其他信息(取决于所需的渲染类型)来确定像素的颜色。如图 4.1 所示,其中光线与两个三角形相交,但只有第一个三角形命中 T2 被着色。
因此,基本的光线追踪器包含三个部分:
- 光线生成,根据相机几何计算每个像素的视线的原点和方向;
- 光线相交,寻找与视线相交最近的物体;
- 着色,根据光线相交的结果计算像素颜色。 基本光线追踪程序的结构是:
本章涵盖了射线生成,射线交叉和阴影的基本方法,这些方法足以实现简单的演示射线示踪剂。对于一个非常有用的系统,需要添加第12章的更有效的射线交叉点技术,并且将使用第10章的更高级阴影方法以及第13章的其他渲染技术来看到射线示踪剂的真正潜力。
4.2 视角
使用 2D 绘图或绘画来表示 3D 对象或场景的问题在计算机出现数百年之前就已由艺术家研究。照片还代表带有 2D 图像的 3D 场景。虽然有许多非常规的图像制作方法,从立体派绘画到鱼眼镜头(图 4.2)再到外围相机,但艺术和摄影以及计算机图形学的标准方法是线性透视,其中 3D 对象被投影到一个图像平面,使场景中的直线变成图像中的直线。
最简单的投影类型是平行投影,其中 3D 点通过沿投影方向移动直到它们碰到图像平面(图 4.3-4.4)来映射到 2D。生成的视图由投影方向和图像平面的选择决定。如果像平面垂直于观察方向,则称为正交投影;否则称为倾斜。
有些书籍为平行于坐标轴的投影方向保留“正交”。
平行投影通常用于机械和建筑图纸,因为它们保持平行线平行,并且它们保持与图像平面平行的平面对象的大小和形状。
平行投影的优点也是它的局限性。在我们的日常经验中(在照片中更是如此),随着距离的增加,物体看起来更小,因此向远处延伸的平行线看起来并不平行。这是因为眼睛和相机不会从单一观察方向收集光线。他们收集通过特定视点的光。
正如文艺复兴以来的艺术家们所认识到的那样,我们可以使用透视投影来产生自然的视图:我们只是沿着穿过一个点的线进行投影,即视点,而不是沿着平行线(图 4.4)。这样,距离视点较远的物体在投影时自然会变小。透视图由视点(而不是投影方向)和图像平面的选择决定。与平行视图一样,有斜视图和非斜视图;根据图像中心的投影方向进行区分。
您可能已经了解了三点透视的艺术惯例,这是一种手动构建透视图的系统(图 4.5)。关于透视的一个令人惊讶的事实是,如果我们遵循透视背后的简单数学规则,透视绘图的所有规则都将自动遵循:物体直接投射到眼睛,并且它们被绘制在与眼睛前面的视图平面相交的地方.
4.3 计算观察光线
从上一节看,射线生成的基本工具是视点(或视图方向,对于平行视图)和图像平面。有很多方法可以计算出相机几何的细节;在本节中,我们将解释一个基于正交基的方法,该基支持正常和倾斜平行和正交视图。
为了生成射线,我们首先需要射线的数学表示。
一条射线实际上只是一个原点和一个传播方向; 3D 参数线是理想的选择。如第 2.5.7 节所述,从眼睛 e 到图像平面上的点 s 的 3D 参数线(图 4.6)由下式给出
这应该被解释为,“我们从 e 沿着向量 (s - e) 前进一个分数距离 t 以找到点 p。”所以给定t,我们可以确定一个点p。点 e 是射线的原点,s - e 是射线的方向。
请注意,p(0) = e 和 p(1) = s,更一般地说,如果 0 < t1 < t2,则 p(t1) 比 p(t2) 更靠近眼睛。此外,如果 t < 0,则 p(t) 在“眼睛后面”。
当我们搜索被光线击中且不在眼睛后面的最近物体时,这些事实将很有用。
要计算视线,我们需要知道 e(给定)和 s。找到 s 可能看起来很困难,但如果我们在正确的坐标系中查看问题,它实际上很简单。
我们所有的射线生成方法都从称为相机坐标系的正交坐标系开始,我们将用 e 表示眼睛点或视点,用 u、v 和 w 表示三个基向量,组织为u 指向右侧(从相机的角度来看),v 指向上方,w 指向后方,因此 {u, v, w} 形成右手坐标系。构造相机框架的最常见方法是从视点,它变成 e,观察方向,它是 -w,以及向上向量,它用于构造一个在由视图方向和向上方向,使用第 2.4.7 节中描述的从两个向量构造正交基的过程。
4.3.1 正交视图
对于正交视图,所有光线的方向都为 -w。即使平行视图本身没有视点,我们仍然可以使用相机框架的原点来定义光线开始的平面,这样物体就有可能位于相机后面。
视线应该从点 e 和向量 u 和 v 定义的平面开始;唯一需要的剩余信息是图像应该在飞机上的哪个位置。我们将用四个数字定义图像尺寸,用于图像的四个边: l 和 r 是图像左右边缘的位置,从 e 沿 u 方向测量; b 和 t 是图像的底部和顶部边缘的位置,从 e 沿 v 方向测量。通常 l < 0 < r 和 b < 0 < t。 (见图 4.9。)
在第3.2节中,我们讨论了图像中的像素坐标。要将带有NX×NY像素的图像拟合到大小(r -l)×(t -b)的矩形中,像素间隔为距离(r -l)/nx/nx水平相距垂直方向,边缘周围有一个半像素空间,将像素网格置于图像矩形内。这意味着栅格图像中位置(i,j)的像素具有以下位置,
其中(u,v)是图像平面上像素位置的坐标,相对于原点E和基础{u,v}
由于 v 和 w 必须垂直,所以上向量和 v 通常不一样。但是将向上矢量设置为在场景中指向正上方,将使相机以我们认为“直立”的方式定向。
正交观察光线应该从无限远的地方开始似乎是合乎逻辑的,但是例如,不可能对房间内的对象进行正交视图。
许多系统假定L = - R和B = - T,因此宽度和高度就足够了。
在拼字图视图中,我们可以简单地将像素的图像平面位置用作射线的起点,我们已经知道射线的方向是视图方向。那么,生成拼字图视射光线的过程是:
制作倾斜平行视图非常简单:只需将图像平面法线 w 与视图方向 d 分开指定即可。然后程序完全相同,但用 d 代替 -w。当然 w 仍然用于构造 u 和 v。
通过指定L和R,有冗余:将视点稍微向右移动,并相应地减小L和R不会改变视图(并且在Vaxis上类似)。
4.3.2 透视图
对于透视视图,所有射线都具有相同的来源。每个像素是不同的方向。图像平面不再位于E处,而是在E前面的距离D。该距离是图像平面距离,通常被松散地称为焦距,因为选择D与在真实摄像机中选择焦距相同。每个射线的方向由图像平面上的视点和像素的位置定义。这种情况如图4.9所示,结果过程类似于拼字法:
与平行投影一样,倾斜透视图可以通过将图像平面法线与投影方向分开指定,然后在光线方向的表达式中将 -d w 替换为 d d 来实现。