Advertisement

《Fundamentals of Computer Grahpics》虎书第三版翻译——第四章 光线追踪

阅读量:

光线追踪


计算机图形学的主要任务之一是绘制三维物体:获取一个场景或模型(由许多在3D空间中排列的几何体组成),并生成一个二维图像(从特定视角观察到物体的图像)。与建筑师和工程师几百年来通过绘制图纸交流设计的做法相似。
根本上讲,渲染是一个接受一组对象作为输入并生成像素数组作为输出的过程;无论如何,在考虑每个对象对每个像素的影响后,默认情况下有两种处理方法。
你可以从循环嵌套的角度来看它们的区别:在图像顺序中"for each pixel"循环位于外层,在对象顺序中"for each object"循环位于外层。

图像顺序渲染策略与对象顺序渲染策略能够生成完全一致的效果图景,在视觉呈现上并无明显差异。然而这些策略各自擅长处理不同类型的视觉效果,并且在性能表现上存在显著差异。
我们将将在第8章详细探讨这两种策略的优劣对比。
然而通常情况下图像顺序渲染更为简便也更为灵活地应用于特定效果生成但是在某些情况下生成类似的视觉效果可能需要较长的时间。
尽管如此在光线追踪器中能够较为精准地模拟阴影与反射效果而在基于对象的渲染框架中则显得力不从心。

在这里插入图片描述

图4.1,在场景中被“追踪”的光线首次碰撞的那个物体就是我们通过像素观察到的那个物体。本例中返回的是三角形T2。
光线追踪是一种用于3D场景渲染的图像顺序算法,在渲染过程中我们会首先考虑它,因为它允许光线追踪器无需开发复杂的对象顺序渲染机制即可高效运行。

4.1 基本光线追踪算法

其工作原理是通过逐一计算每个像素来实现图像生成。其基本功能是识别图像中位于各像素视角位置上的物体。各个像素各自面向不同的方向,并对所见物体进行定位。观察光线是从视点出发,在各像素视角方向上延伸的射线。其中与这些观察光线相交且距离相机最近的目标物体将被优先处理。一旦检测到目标物体,则执行着色步骤:首先根据交点位置、表面法线以及其他相关参数(根据渲染技术的不同)来确定该像的颜色;随后将颜色值赋值给对应像素单元即可完成该区域的渲染过程(如图4-1所示)。整个系统由三大部分组成:光栅化过程、几何求交操作以及着色处理阶段。

基于相机几何形状计算每个像素对应的观察射线起点与方向;

基本光线追踪程序的整体架构遵循以下步骤:首先初始化观察方向;然后对每一个像素执行以下操作:生成观察方向;接着确定首次被射线交互的物体,并记录其表面法向量n;最后根据碰撞位置、光源方向以及表面法向量n来确定该像素的颜色值。

本章介绍了光线生成、光线相交以及着色的基本方法。这些技术对于开发一个简单的光线追踪器系统来说已经足够完善。然而,在构建一个真正实用的系统时,则需要在第12章中采用更为高效的射线相交算法。此外,在第10章中应用更高级的阴影生成方法以及第13章中的额外渲染技术将能够充分挖掘光线追踪器的潜在性能。

4.2 透视

在电脑出现之前漫长的几个世纪里,在那个尚未完全理解三维空间的艺术时代里(也可以表述为:在那个尚未完全理解三维空间的艺术时期),艺术家们就已经开始探索如何通过二维图纸或绘画的形式来表现三维物体或场景的问题(也可以表述为:问题)。照片同样以二维图像的形式来呈现三维场景(也可以表述为:场景)。尽管存在许多非常规的方法用于图像制作(也可以表述为:图像生成),包括立体主义绘画(也可以表述为:立体主义作品)、具有独特视角效果的鱼眼镜头(如图4.2所示)以及使用外围相机拍摄的独特方法(也可以表述为:技术),但艺术与摄影以及计算机图形领域所采用的标准方法则是线性透视(即投影法)。这种技术将三维物体投射至二维图像平面上,并使画面中的直线得以维持其直线特性

在这里插入图片描述

图4.2是由鱼眼镜头拍摄的照片,并不遵循传统的线性透视法则。摄制于著名摄影家菲利普·格林斯潘的手下

在几何学中,最基本的投影视图是平行投影。通过将三维空间中的点沿着特定方向移动至二维平面上,在对应的图像平面上(如图4.3至4.4所示),生成的视图取决于投射方向和平面选择的不同。当投射平面与观察方向垂直时,则称这种投影视图为正交投影;反之则称为斜角投影视图。

在这里插入图片描述

图4.3。当投影线与像平面平行且垂直时,得到的视图称为正射影。

在这里插入图片描述

图4.4展示了平面与投影方向形成一定角度的平行投影被称为斜平行投影(右侧)。在透视投影视图中,所有投射线都经过视点而并非平行于某个特定方向(左侧)。该透视图属于非斜轴线方向的投射方式;这是因为投射线通过图像中心并垂直于图像平面。(有些书为平行于坐标轴的投射方向保留‘正投射’.)

在工程制图中,平行投影法常被采用。其特点在于:其一是确保所有直线都维持其原有的相对位置;其二是不仅能够维持物体在平面上的真实尺寸和形状;其三是特别适用于表现具有相互平行特征的空间物体。

虽然具备诸多优势但同时也存在明显的不足。在日常生活中我们能够直观感受到这一现象特别是在照片中这种现象尤为明显:物体离得越远看上去就越小因此远离镜头放置的平行线同样不会显得严格平行这一现象源于观察者与成像设备并非只专注于单一方向的光线而是在特定视点收集光线这一特性已被文艺复兴时期的艺术家所广泛认可因此我们可以利用透视投影来实现自然的画面效果:我们只是沿着经过一个特定点(视点)的直线进行投射而不是沿着平行线进行操作。(如图4.4所示)这样远离视点放置的物体在被投射时会逐渐变小而远处物体的实际尺寸则会随着视角的变化而发生相应的变化由此产生了中心投影的概念基于视点的选择不同我们还可以区分斜透视图与非斜透视图等多种类型这些分类标准依据的是图像中心所对应的投射方向

在这里插入图片描述

图4.5展示了三点透视的表现手法。在艺术创作中,默认情况下艺术家会通过设置多个消失点来表现空间感。地平线上方的水平线条往往会交汇于一点;而不同方向的线条则可能对应不同的消失点位置。为了实现理想的透视效果,在设计时应充分考虑几何关系并加以运用;其结果自然满足透视法则的要求。

您或许已经掌握了有关三点透视图的艺术原则。这一手动构建透视图的方法(如图4.5所示),揭示了一个有趣的现象:按照基于透视的基础进行简单的数学运算时,在视觉上将实现所有基于透视的绘画规则。这个现象的关键在于:物体直接投射至观察者眼中,并在其视平面上绘制。

4.3 计算观察射线

在上一节中,光线生成的基本工具是视点(或观察方向,对于平行视图)和图像平面。有许多方法来解决相机的几何细节;在本节中,我们将解释一种基于标准正交基的支撑法向和斜向平行和正交视图的方法
为了生成射线,我们首先需要射线的数学表示。射线其实就是原点和传播方向;三维参数线就是很好的表示形式。如2.5.7节所述,从眼睛e到图像平面上点s的三维参数线(图4.6)为

在这里插入图片描述

沿着向量(s−e)的部分距离t从e出发找到p点。基于给定的t值, 我们能够精确确定点p的位置。
当光线参数t满足0 < t1 < t2时, p(t1)会比p(t2)更接近观察者; 当t值为负时, 点p位于观察者后方。
在寻找光线与物体相交的过程中, 确定最靠近观察者的物体非常有用。为了构建射线方程, 我们需要已知起始点e以及方向向量s. 然而,在某些情况下直接计算s可能较为复杂。

在这里插入图片描述

图4.6。从眼睛到像面上某一点的光线。

在这里插入图片描述

图4-7。屏幕上的采样点对应于3D窗口中的一个相似的数组。观察用于将所有光线传输至各个位置。

图4-7。屏幕上的采样点对应于3D窗口中的一个相似的数组。观察用于将所有光线传输至各个位置。

基于标准正交坐标系的ray-generation体系均以camera frame为基础进行构建。该框架中用e表示视点位置,并取u方向向右(相机视角)、v方向向上、w方向向后(即-n),其中{u, v, w}构成右手坐标系系统。最常用的方法是从视点出发构造camera frame,在此框架中视点被设定为e的位置,并取-w方向作为视线反向指向观察者;up向量则用于确定垂直方向的基础平面。根据第2.4.7节所述方法,在该平面上定义w和平面内另一个向量即可生成标准正交基底集。

在这里插入图片描述

_ 图4.8 在相机frame中的各个向量及其相对方向 _
在相机frame中定义了多个关键向量:w向量与观察者的视线相反;v向量位于w和up vector所在的平面内。由于v和w必须互相垂直的原因,在这种情况下up vector通常不会与v完全一致。然而,在某些特殊情况下(如将场景中的up vector设定为垂直方向),我们可能会认为相机的方向是直立的。
4.3.1 正交投影
对于正交投影来说,默认情况下所有光线的方向都是- w direction(负w方向)。即使没有视点存在的情况下我们仍然可以通过使用相机frame原点来定义光线起点所在的平面方程;这样物体就有可能位于相机后方。
(sp:似乎合乎逻辑的是正交投影应该从无限远的地方开始射出光线但这样一来房间内的物体就无法进行正交投影观察)
观察光线应当从由e点以及u v两个基底所张成的平面开始;这个平面唯一的信息就是图像应该在这个平面上的具体位置。我们将这个平面用四个参数来表示:l r分别表示水平边界的左右位置(沿u基底测量);b t分别表示垂直边界的上下位置(沿v基底测量)。通常我们会选择l < 0 < r 和 b < 0 < t的情况(见图4.9)。
(许多系统假设l = - r 和 b = - t 因此只需要宽度和高度信息即可)

在这里插入图片描述

如图4.9所示,在相机坐标系下进行光线生成技术的研究与实现。左侧:在正投影视图中,默认情况下每个来自图像平面像素位置的光线都具有相同的传播方向;而右侧:在透视投影中,则是从观察者视线焦点处发出的所有射线构成整个三维场景的空间几何关系映射到二维图像平面的过程

在第3.2节中阐述了图像中的像素坐标问题。将一个大小为(r-l) \times (t-b)的正方形放置于nx×ny的图像像素中,在水平方向上每个像素之间的间距设定为(r-l)/nx个单位,在垂直方向上每个像素之间的间距设定为(t-b)/ny个单位,在图像边缘周围留出半像素的空间区域以保证图像呈现居中状态。这种设置意味着位于光栅图像中(i, j)位置的像素能够精确地对应到该位置

在这里插入图片描述

当l和r被明确设定时,在像面上也会出现冗余:将观察点向右移动的同时适当缩减l和r的值,在v轴方向上也是如此。
(u, v)是在像面上相对于原点e以及基{u, v}测量出的像素位置坐标。
在正交投影中,则可以直接以像素在图像平面上的位置作为射线起点,并且已知这些射线的方向即为观察方向。
生成正交投影所需射线的过程如下所述:首先计算参数u和v(如公式4.1所示),然后确定光线方向为−w;最后设置光路起点为e加上u乘以单位向量u以及v乘以单位向量v
制作斜平行视图过程非常简便:只需分别指定图像平面法线w与观察方向d即可。随后的操作步骤与之前完全相同只不过将d替换为−w。
当然,在构造u和v的过程中仍会用到w。

4.3.2 透视视图
在观察者位置上所存在的所有光线都源自同一个视点;这些光线的方向各不相同,并且对应于每一个特定像素的方向指向其后方一定距离的位置;

这种距离等同于像面间的距离,并被称作焦距;这是因为参数d的选择与其在相机系统中的应用效果具有等价性。每条光线的方向由镜头焦点位置及其像素在图像平面上的坐标共同决定。这一现象如图4.9所示,在这种情况下其处理流程与正交投影方法相似:

在这里插入图片描述

如同在平行投影中那样,在投影方向上单独指定图像平面法线,并将射线方向表达式中的-dw替换为dd,则可实现斜透视视图的绘制

4.4 光线-物体相交

当我们创建一条参数化的射线表示为e + td的形式时,则下一步就是识别这条射线与周围物体的第一个接触点;其中参数值t必须大于零(即仅考虑前方潜在碰撞)。事实上这一技术在解决许多实际问题中展现出显著的效果:计算该射线在时间区间[t0, t1]内首次与曲面的接触位置,并确定接触点的具体坐标;其中时间参数t通常对应于几何意义上的距离或时间值;基本情况下该算法处理两种典型场景:一是球体表面的检测;二是由平面三角形构成的多边形表面;而在下一节我们将探讨如何处理包含多个不同对象的情况

4.4.1光线-球面相交
给定一条射线p(t) = e + td和一个隐式曲面f§=0(见2.5.3节),我们想知道它们的交点。当射线上的点满足隐式方程时就会出现交点,所以我们求的t值就是解方程的值
f(p(t)) = 0 or f(e + td)=0.
一个圆心为c = (xc, yc, zc),半径为R的球面可以用隐式方程表示
(x − xc)² + (y − yc)² + (z − zc)² − R² = 0.
我们可以把这个方程写成向量形式:
(p − c) · (p − c) − R² = 0.
任何满足这个方程的点p都在球面上。如果我们把射线p(t) = e + td的点代入这个方程,我们得到一个关于t的方程,这个方程上的点的t值满足:
(e + td − c) · (e + td − c) − R² = 0.
整理一下可得
(d · d)t² + 2d · (e − c)t + (e − c) · (e − c) − R² = 0.
这里,除了参数t,其他都是已知的,所以这是一个经典的关于t的二次方程,这意味着它有这样的形式
At² + Bt + C = 0.
这个方程的解将在2.2节中讨论。二次解的平方根下的项,B2−4AC,被称为判别式,它告诉我们有多少实解。如果判别式为负,则其平方根为虚数,则线与球不相交。如果判别式是正的,就有两个解一个是光线进入球面的解另一个是光线离开球面的解。如果判别式为零,射线就会擦过球体,恰好相切于一点。代入球的实际项,然后消去两个因子,就得到

在这里插入图片描述

在实现过程中,在计算其他相关参数之前,请先评估该判别式的值。当球体仅作为更复杂物体的边界时,则只需确认是否与之相交;此时检验判别式就足够了。如2.5.4节所述,在p点处法向量由梯度n = 2(p−c)给出,则单位法向量可表示为(p−c)/R。

在这里插入图片描述

在本研究中存在一组包含变量t、u、v的三元方程组;通过数值方法可以求解出这些变量。如果条件理想的话,则有可能通过分析法来得到解析解。

为了计算式(4.2)中的变量t、β、γ,我们将该矢量表示转换为基于三个坐标轴的分量方程组。这些方程可以表示为一个典型的线性方程组的形式。对于解决这个3×3阶线性方程组的最优传统方法是克莱姆法则。

在这里插入图片描述
在这里插入图片描述

我们可以通过循环引用‘ei-minus-hf’等关键数值来降低运算次数。 为解决具有线性解法的射线三角形相交问题,该算法可设计为允许提前退出。 因此,函数应该如下所示:

在这里插入图片描述
在这里插入图片描述

图4.10。射线击中包含三角形的平面点p。

4.4.3 光线-多边形相交
考虑一个具有顶点集p1至pm的平面多边形及其表面法向量n已知。通过求解隐式方程组确定射线e + td与该平面相交的位置。

在这里插入图片描述

我们通过设p = e + td并解出t来得到

在这里插入图片描述

通过这种方式我们可以计算p的值。如果点p位于多边形内部,则该射线将与之相交;否则则不会。为了确定点p是否位于多边形内,我们可以将点及其所有顶点投影到xy平面。最直接的方式是从点p出发绘制一条任意方向的二维射线,并统计其与多边形边界曲线的交集次数。若交集次数为奇数,则说明该点位于多边形内部;若为偶数则不在其内。这是因为从内部发出的光线必定会穿过边界两次(进入和退出),从而形成两个交集;而从外部发出的光线则只会穿过一次或不穿出(特殊情况)。为了简化计算过程,在实际应用中通常选择沿x轴正方向绘制射线:

在这里插入图片描述

对于任意s属于区间(0, ∞),求解该射线与边(x₁, y₁, x₂, y₂)的交点相对容易。然而,在多边形在xy平面上投射成一条直线时会遇到问题。为了应对这一挑战,在xy、yz或zx平面中选择一个最合适的位置进行处理。如果我们能够实现一种机制来支持索引操作(例如定义p(0) = xp),则可以通过以下方法实现:

在这里插入图片描述

现在,所有的计算都可以使用p(index0)而不是xp。

替代性的多边形处理方案,在实践中常被采用的技术,则是以若干个三角形替代它们。
然而,在涉及多个物体的场景同样引人入胜的情况下,
当光线穿透场景时,
必须沿着光线路径确定距离摄像机最近的那个交点位置。
一种简便的方式就是将同一组对象重新定义为另一种类型的对象。
为了实现射线与该组对象集合的有效交互,
需计算并返回最早遇到的交叉点。
代码块如下所示:

\text{for } t \in [t_0, t_1]:

在这里插入图片描述
在这里插入图片描述

在图4.11中展示了这样一个简单的场景渲染过程:该过程仅涉及光线生成以及表面与物体的相交操作,而未生成阴影效果。值得注意的是,每个像素的颜色被精确地设定,这一设定依据其碰撞的目标物体性质进行确定

4.5 光照处理(Shading)

当确定某个像素可见时,则该像素值将通过评估相应的光照模型来确定。具体实现则完全由所采用的应用程序及其方法的选择范围所决定——从最简单的启发式技术到复杂的数值计算方案。

在这里插入图片描述

式中

在这里插入图片描述

(sp:真实点源的光照强度会随着观察者与光源之间距离的平方而减弱,在较为简单的渲染引擎中,这一现象可能会导致计算复杂度增加。)
(sp:你可能会好奇,在将光源颜色设为中性之后会发生什么情况呢?即红绿蓝通道的强度是否会一致呢?)

4.5.2 滔弹阴影
Lambertian着色方法与观察视角无关:表面颜色不受观察方向的影响。许多实际表面会呈现出一定程度的反射光线,并会产生高光效果或镜面反射效果,在某些情况下似乎随着观察视角的变化而移动。Lambertian着色方法不会产生任何高光效果,在这种情况下整体看起来非常暗淡。许多光照模型会在基于Lambertian的方法上增加这一细节部分来表现高光效果;而Lambertian方法则主要用于处理漫反射部分

Phong (Phong, 1975)提出了一个非常简单和广泛使用的高光模型,后来由Blinn (J. F. Blinn, 1976)更新为今天最常用的形式。这个想法是为了在v和l对称地穿过表面法线时产生最亮的反射,也就是镜面反射发生的时候;当矢量离开镜像结构时,反射平滑地减小。
通过比较半向量h (v和l之间角的平分线)与表面法线(图4.16),我们可以知道我们与镜面的距离。如果半向量接近表面法线,镜面分量应该是明亮的;如果是遥远的应该是昏暗的。这个结果是通过计算的点积h和n(记住他们是单位向量,所以当向量相等时n·h达到最大1),然后把结果取p次方(p > 1),使其减少得更快。其中P为Phong指数,控制表面的表面反光指数。半矢量本身很容易计算:因为v和l长度相同,它们的和是一个平分它们之间夹角的矢量,这个夹角只需要标准化就能得到h。
综上所述,Blinn-Phong光照模型如下:

在这里插入图片描述

其中ks是镜面的镜面系数或镜面颜色。
(
sp:
Typical values of p:
10—“eggshell”;
100—mildly shiny;
10,000—nearly mirror-like.

4.5.3 Ambient Shading
没有任何光照的表面将被渲染成完全黑色,这通常是不可取的。避免黑影的一个粗略但有用的方法是在光照模型中添加一个常量组件,该分量对像素颜色的作用依赖于对象碰撞,而不依赖于表面几何形状。这就是所谓的Ambitient Shading——就好像表面被来自各处的“环境”光照亮一样。为方便调整参数,Ambitient Shading通常表示为表面颜色与环境光颜色的乘积,因此,Ambitient Shading可以调整单个表面,也可以一起调整所有表面。与Blinn-Phong模型的其余部分一起,Ambitient Shading完成了一个简单且有用的阴影模型的完整版本:

在这里插入图片描述

其中ka是表面的环境系数,或“环境颜色”,Ia是环境光强度。

(sp:在现实中,未接受直接照明的表面通常依赖于其他表面通过间接反射提供的光照.)
(sp:当环境色与漫反射色相等时会发生什么情况?)

在这里插入图片描述

4.5.4多点光源
光的一个极为有用的重要特性是叠加原理——当涉及多个光源时,其效果仅是各自身效的总和.基于这一原理,我们基本阴影模型能够轻易扩展以处理N个光源:

在这里插入图片描述

式中,Ii、li、hi为第i个光源的强度、方向和半向量。

4.6一个光线追踪程序

在这里插入图片描述

该处描述的方法可参考第4.4.4节中的相关算法。在具体实施时,在射线与物体相交的情况下,请确保能够按照特定流程处理结果数据,并将其传递给后续处理模块进行验证与计算操作。通常采用传递带有相应信息的方式将结果数据发送给后续模块进行处理,并根据需求完成必要的计算操作与验证工作;面向对象编程时,请定义一个名为surface的基础类,并创建triangle、sphere、group等派生类;射线与其他物体相交的情况均在此范围内适用;光线追踪系统中的模型整体上都会包含至少一个这样的"表面"引用,并且支持透明地添加新的对象及所需的数据结构

4.6.1 光线追踪程序的面向对象设计
如同前面所述,在光线追踪器中主要的类层次结构构成了模型中的几何对象。这些应该是几何对象类的一些子类,并且被设计为支持一个hit函数(Kirk & Arvo, 1988)。为了消除"对象"这个词可能引起混淆的情况,我们使用surface作为这些类的名字。
通过引入这样的surface类,我们可以创建一个具有通用接口的光线追踪器,并通过该接口进行操作。

一个关键的要点是:任何能够被光线照射到的对象都应该被视为该层次结构的一部分;即使如此复杂的几何形状如曲面的整体集合也应归属于曲面类。

这一系列数据结构包括包围盒层次结构;这些元素可被射线所击中因此位于类内。例如'抽象'或'基'类负责指定hit函数以及一个稍后将证明有用的边界框函数:其中(t0 t1)表示射线开始于t0并结束于t1时发生相交事件的时间区间而rec携带所需的数据信息该类型框是一个3D'边界框'即两个点定义了一个轴对齐的框该框包围了曲面例如对于一个球体函数将由

该库中的另一个重要组成部分是Material组件。该组件提供了一种方法来抽象材料的行为,并实现透明效果。通过在Surface类中引入一个Material指针来建立对象与材料之间的关联。值得注意的是,在这种设计下可能需要额外的编程逻辑以支持复杂的交互需求。关于如何处理纹理信息的问题——它们是材质属性的一部分还是独立存在的这一关键点——将在下一章进行详细探讨。

4.7阴影(Shadow)

一旦你有了一个基本的光线跟踪程序,阴影可以很容易地添加。回想一下第4.5节,光线来自于l方向。如果我们想象自己在一个被阴影覆盖的表面上的点p,如果我们朝l方向“看”并看到一个物体,这个点就处于阴影中。如果没有物体,那么光线就不会被阻挡.
如图4.17所示,射线p + tl没有击中任何物体,因此不在阴影中。q点在阴影中,因为q + tl射线确实击中了一个物体。向量l对于两个点都是一样的,因为光线“远”。这一假设稍后将被放宽。决定在阴影内或在阴影外的光线被称为阴影射线,以区别于观察射线。

在这里插入图片描述

为了判定点是否处于阴影区域内,在算法中引入了一个条件判断逻辑。在初步实现阶段,在检测光线与曲面交点时,默认检查参数t是否落在区间[0,∞)内。这可能导致光线与该曲面发生相交问题。为了避免可能出现的问题,则一种常见的优化方法是将t值限定在[E, ∞)区间内(图4.18)。基于公式4.3,在Phong光照模型下生成阴影光线,则可得到相应的结果展示。

在这里插入图片描述

请注意,在p是否处于阴影区域的情况下,“环境颜色”都会被包含进来。
此外,请注意,在存在多个光源时,“发送一次影子射线”是一个必要的步骤——用于评估每个光源对应的影子模型。
上文中的代码并未假设d和l必须是单位向量。
这一特点对于处理d来说至关重要——它使得我们可以稍后更加方便地进行实例化操作(参见第13.2节以获取进一步的信息)。

在这里插入图片描述

4.8理想的高光反射

将理想的高光反射或镜面反射纳入光线追踪程序相当容易。关键的观察结果如图4.19所示表明,在e方向的观察者观察到的是表面在r方向呈现的样子。根据Phong照明模型的一个变式(方程10.6),我们能够推导出矢量r的方向。由于在这种情况下矢量d指向曲面因此

在这里插入图片描述

在现实中,在光线照射到表面时(light reflects off a surface in the real world),都会不可避免地造成一定的能量损耗(energy loss)。这种能量损耗可能因不同颜色(colors)而异(vary)。例如(For instance):金黄色光(yellow light)的反射效果优于蓝色光(blue light),因此它能够有效地改变被反射物体呈现的颜色(shaping the color of objects)。这可以通过在一个称为raycolor的功能中(within the function named raycolor)递归地进行调用(recalling)来实现:

在这里插入图片描述

其中km即为镜面RGB颜色。被我们确保的原因与对阴影射线的测试相同的是为了避免反射光线击中所生成的物体。

该递归调用存在永远不终止的问题。当一束光线从房间出发时, 它会无限反射。通过设定最大递归深度, 可以有效缓解这一问题。只有当km不为零(即黑色)时生成反射光线, 能使代码效率更高。

在这里插入图片描述

4.8历史记录

射线追踪方法早在计算机图形学初期便已有了初步研究,但直至计算能力的大幅提升才逐渐得到广泛应用。相比于基本对象顺序渲染的方法而言,射线追踪算法的时间复杂度更为高效。值得注意的是,尽管传统上人们认为射线追踪是一种离线技术,但实时射线跟踪如今已成为可能并日益普及。

练习

射线(1, 1, 1) + t(-1, -1, -₁)与从原点出发半径为一的球面相交所形成的射线参数为何? 注意:这个问题为我们提供了一个优秀的调试案例。

此时射线(\mathbf{v}_o + t\mathbf{d})穿过该三角形(其顶点为\mathbf{v}_a=(\alpha=2), \mathbf{v}_b=(\beta=3), \mathbf{v}_c=(\gamma=4))的问题是什么? 注意:这是一个很好的调试案例。

实现一个基于"漂亮"(非对抗性)模型的射线追踪技术用于估算其时间复杂度的包络背面。对您的分析进行分解处理,并分别针对预处理阶段和图像生成过程进行详细评估。这有助于构建一个静态模型的时间序列光线跟踪行为预测框架。

全部评论 (0)

还没有任何评论哟~