光线追踪


计算机图形学的基本任务之一是绘制三维物体:获取一个场景或模型(由许多在3D空间中排列的几何物体组成),并生成一个二维图像(从一个特定的视角观察到的物体的图像)。这和几个世纪以来建筑师和工程师通过绘制图纸来与他人交流设计的做法是一样的。
从根本上说,渲染是一个以一组对象作为输入,并产生一个像素数组作为输出的过程。不管怎样,渲染需要考虑到每个对象对每个像素的贡献;
一般它有两种处理方法。对于对象顺序渲染,依次考虑每个对象,并为每个对象查找和更新其影响的所有像素。对于图像顺序渲染,依次考虑每个像素,对每个像素找到影响它的所有对象,并计算像素值。你可以从循环嵌套的角度来考虑它们的不同:在图像顺序中,“for each pixel”循环在外部,而在对象顺序中,“for each object”循环在外部。
(sp:如果输出的是矢量图像而不是光栅图像,那么渲染就不需要涉及像素,但我们在本书中假设是光栅图像。)

图像顺序和对象顺序的渲染方法可以计算完全相同的图像,但它们适用于计算不同类型的效果,并且具有非常不同的性能特性。我们将探索这两个方法的优劣放在第八章,但是,一般来说,图像顺序渲染更容易,也可以很灵活的做一些效果,但是通常(尽管不总是)需要更多的运行时间来产生类似的图像。
(sp:在光线追踪器中,很容易计算出精确的阴影和反射,而这在对象顺序框架中是很困难的。)

图4.1。光线被“追踪”到场景中,击中的第一个物体就是通过像素看到的那个物体。在本例中,返回三角形T2。
光线追踪是一种用于3D场景渲染的图像顺序算法,在渲染场景的时候我们会首先考虑它,因为它可以让光线追踪器在不开发任何用于对象顺序渲染的数学机制的情况下工作。

4.1 基本光线追踪算法

射线追踪器的工作原理是每次计算一个像素,对于每个像素,基本任务是找到在图像中在该像素位置所看到的物体。每个像素会“看”一个不同的方向,像素所看到的任何物体都必须与观察光线相交,观察光线是像素从视点所观察的方向发出的线。我们想要的特定物体是与观察光线相交的且与相机距离最近的那个,因为它挡住了它后面所有其他物体的视线。一旦找到对象,就会进行着色处理:计算使用交点、表面法线和其他信息(取决于所需的渲染类型)来确定像素的颜色。如图4.1所示,射线与两个三角形相交,但只有击中的第一个三角形T2被阴影覆盖。
因此,一个基本的射线追踪器有三个部分:

  1. 射线生成,根据相机几何形状计算每个像素的观察射线的原点和方向;
  2. 射线相交,找到与观察射线相交的最近的物体;
  3. 着色处理,根据光线相交的结果计算像素的颜色。

基本光线追踪程序的结构如下:
for 每个像素 do
计算观察射线
找出第一个被射线击中的物体及其表面法线n
通过碰撞点、光源和法线n来设置像素颜色

本章涵盖了光线生成、光线相交和着色的基本方法,这对于实现一个简单的演示光线追踪器来说是足够的。对于一个真正有用的系统,需要添加第12章中更有效的射线相交技术,而光线追踪器的真正潜力将通过第10章中更高级的阴影方法和第13章中额外的渲染技术看到。

4.2 透视

在电脑出现之前的几百年,艺术家们就研究过用2D图纸或绘画来表示3D物体或场景的问题。照片也用2D图像表示3D场景。虽然有许多非常规的方法来制作图像,从立体主义绘画到鱼眼镜头(图4.2)到外围相机,但艺术和摄影以及计算机图形的标准方法是线性透视,它将三维物体投影到图像平面上,使场景中的直线变成图像中的直线
图4.2。用鱼眼镜头拍摄的图像不是线性透视图像。照片由菲利普·格林斯潘提供。

最简单的投影类型是平行投影,将3D点映射到2D通过使它们沿投影方向移动,直到它们到达图像平面(图4.3-4.4)。所产生的视图由投影方向和像面的选择决定。如果像平面垂直于视图方向,则称投影为正投影;否则就叫斜投影。

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

图4.4。像面与投影方向成角的平行投影称为斜投影(右)。
在透视投影中,投影线全部通过视点,而不是平行(左)。
图示的透视图是非斜角的,因为通过图像中心绘制的投影线将垂直于图像平面。
(有些书为平行于坐标轴的投影方向保留“正投影”。)

平行投影经常用于机械和建筑图纸,因为它们使平行线保持平行,并保持与图像平面平行的平面物体的大小和形状

平行投影的优点也是它的局限性。在我们的日常经验中(在照片中更是如此),物体越远,看起来越小,因此,后退到远处的平行线就不显得平行。这是因为眼睛和相机不会只收集一个视野方向的光线;它们收集通过特定视点的光线。正如文艺复兴时期以来的艺术家们所公认的那样,我们可以使用透视投影来产生自然的视觉效果:我们只是沿着穿过一个点(视点)的直线投影,而不是沿着平行线。(图4.4)。这样,远离视点的物体在被投射时自然会变小。透视图是由视点(而不是投影方向)和图像平面的选择决定的。与平行视图一样,也有斜透视视图和非斜透视视图;根据图像中心的投影方向来区分

图4.5。在三点透视中,艺术家选择平行线相交的“消失点”。平行的水平线在地平线上相交于一点。每一组平行线都有它自己的消失点。如果我们基于正确的几何原理实现透视,这些规则会自动遵循。

您可能已经了解了三点透视图的艺术约定,这是一个手动构建透视图的系统(图4.5)。关于透视,一个令人惊讶的事实是,如果我们遵循透视基础上的简单数学规则,那么所有的透视画规则都将自动遵循:物体直接投射到眼睛,并在眼睛前面的视图平面上绘制。

4.3 计算观察射线

在上一节中,光线生成的基本工具是视点(或观察方向,对于平行视图)和图像平面。有许多方法来解决相机的几何细节;在本节中,我们将解释一种基于标准正交基的支撑法向和斜向平行和正交视图的方法
为了生成射线,我们首先需要射线的数学表示。射线其实就是原点和传播方向;三维参数线就是很好的表示形式。如2.5.7节所述,从眼睛e到图像平面上点s的三维参数线(图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可能看起来很困难,但如果我们在正确的坐标系下看问题,它实际上是简单的。

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

图4.7。屏幕上的采样点映射到3D窗口上的一个类似的数组。观察射线被发送到每一个位置。

我们所有的ray-generation 方法都是从一个标准正交坐标系开始的,这被称为camera frame,我们通过e表示眼睛的点或者视点,以及u,v和w三个基本向量,其中u指向右(从相机角度),v指向上,w指向后,因此{u , v, w}又称为右手坐标系。
最常见的构造camera frame的方法是从视点出发,视点变成了e,视点方向是-w,up向量用于构建一个基础:向量w和向量v在平面上被定义为视图方向和上方向,使用2.4.7节中描述的由两个向量构造标准正交基的过程。

图4.8。camera frame的向量,以及视图方向和向上方向。w向量与视图方向相反,v向量与w和上向量共面。
因为v和w必须是垂直的,所以up向量和v一般不一样。但是把场景中up向量设置成垂直方向的话,我们会认为朝向像机方向是“垂直”的。
4.3.1 正交视图
对于正交视图,所有射线的方向为- w。即使平行视图本身没有视点,我们仍然可以使用camera frame的原点来定义光线开始的平面,这样物体就有可能在相机后面。
(sp:似乎合乎逻辑的是,正射观察射线应该从无限远的地方开始,但这样一来,就不可能对一个房间内的物体进行正射观察。)
观察光线应该从点e和向量u v定义的平面开始;唯一所需的信息只剩图像应该在平面上的哪个位置。我们将用四个数字定义图像的四条边的大小:l和r是图像左右边的位置,从e沿着u方向测量;b和t是图像上下边的位置,从e沿v方向测量。通常l < 0 < r, b < 0 < t(见图4.9)。
(许多系统假设l = - r和b = - t,因此宽度和高度是足够的)
图4.9。光线生成使用camera frame。左:在正投影视图中,光线从图像平面上的像素位置开始,并且共享相同的方向,与视图方向相同。右:在透视图中,光线从视点开始,每条光线的方向由通过视点e的直线和像素在图像平面上的位置定义。

在第3.2节中,我们讨论了图像中的像素坐标。将nx×ny的图像像素置于一个大小为(r-l)×(t-b)的正方形,这些像素的间隔为水平分量(r-l)/nx,垂直分量为(t-b)×ny,在边缘周围使用半像素空间,使图像矩形内的像素网格居中。这意味着在光栅图像中位于(i, j)位置的像素具有该位置

(sp:当l和r都被指定时,就会出现冗余:将视点向右移动一点并相应地减少l和r将不会改变视图(在v轴上也是如此)。)
其中(u, v)为像素在像面上的位置坐标,相对于原点e和基{u, v}度量。
在正交视图中,我们可以简单地使用像素的图像平面位置作为射线的起始点,并且我们已经知道射线的方向就是视图的方向。产生正交投影观察射线的程序如下:
compute u and v using (4.1)
ray.direction ← −w
ray.origin ← e + u u + v v
制作斜平行视图非常简单:只需要将图像平面法线w与视图方向d分开指定即可。接下来的过程完全相同,只是将d替换为−w。
当然,w仍然被用来构造u和v.

4.3.2 透视视图
对于透视图,在视点处所有光线的原点都是相同的;它是每个像素不同的方向。像平面不再位于e处,而是位于e前面某一距离d处;

这个距离就是像面的距离,通常称为焦距,因为选择d和在实际相机中选择焦距作用相同。每条射线的方向由视点和像素在图像平面上的位置定义。这种情况如图4.9所示,结果过程类似于正交法:

与平行投影一样,通过在投影方向上单独指定图像平面法线,将射线方向表达式中的−dw替换为dd,可以实现斜透视视图。

4.4 光线-物体相交

当我们生成了一条射线e + td,那么我们需要去找到第一个与射线相交的物体,且t>0。实际上他在解决一些常见的问题非常有用:求出在区间[t0, t1]内射线与曲面的第一个交点,交点在t处的。基本射线相交在t0 = 0和t1 = +∞。我们同时解决了球面和三角形的问题。在下一节中,将讨论多个对象。

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。
4.4.2光线-三角形相交
有许多计算射线三角形交点的算法。我们将使用重心坐标的形式给出包含三角形的参数平面,因为除了三角形的顶点之外,它不需要长期存储(Snyder & Barr, 1987)。
为了使光线与参数曲面相交,我们建立一个笛卡尔坐标完全匹配的方程组:

这里,我们有三个方程和三个未知数(t, u, v)所以我们可以用数值方法求解这些未知数。如果幸运的话,我们可以通过分析求解出来。
当参数曲面为参数平面时,参数方程可以写成向量形式,如2.7.2节所述。如果三角形的顶点是a、b、c,那么当
e + td = a + β(b − a) + γ(c − a), (4.2)
对于某些t,β和γ。交点p将在e+td处,如图4.10所示。
同样,从2.7.2节中我们知道,当且仅当β > 0, γ > 0,和β + γ < 1时,交点在三角形内。否则,光线击中了三角形外的平面,所以没有击中三角形。如果没有解,要么三角形(degenerate)退化,要么射线平行于包含三角形的平面。

为了求解式(4.2)中的t, β, γ,我们将其从矢量形式展开为三个坐标下的三个方程:
这可以写成一个标准线性系统:
求解这个3 × 3线性方程组最快的经典方法是克莱默法则。

我们可以通过重复使用“ei-minus-hf”等数字来减少操作次数。
对于需要线性解的射线三角形交,算法可以有提前终止的条件。
因此,函数应该如下所示:


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

4.4.3光线-多边形相交
给定一个平面多边形,顶点p1到pm,表面法线n为m,首先用隐式方程计算射线e + td与包含该多边形的平面的交点.

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

这允许我们计算p。如果p在多边形内部,那么射线就会击中它,否则就不会。我们可以通过将点和多边形顶点投影到xy平面来回答p是否在多边形内的问题。最简单的方法是从p发出任意2D射线,并计算射线与多边形边界之间的交点的数量。如果交点的个数是奇数,那么这个点就在多边形内;否则就不是。这是正确的,因为光线进入一定会出去,从而创造了一对交点。只有从内部开始的光线才不会产生这样的一对。为了简化计算,2D射线也可以沿x轴传播:

对于s∈(0,∞),计算这条射线与边(x1, y1, x2, y2)的交点是很简单的。
然而,当多边形在xy平面上的投影是一条直线时,问题就出现了。为了解决这个问题,我们可以在xy, yz或zx平面中选择一个最好的。如果我们实现点来允许索引操作,例如 p(0) = xp,则可以通过如下方式实现:
现在,所有的计算都可以使用p(index0)而不是xp。

另一种处理多边形的方法,也是实践中经常使用的方法,是用几个三角形来替换它们。
当然,最有趣的场景不止一个物体,当我们将光线与场景相交时,我们必须沿着光线找到离摄像机最近的交集。实现这一点的一个简单方法是将一组对象本身视为另一种类型的对象。要使射线与组相交,只需将射线与组中的物体相交,并返回t值最小的交点。以下代码对区间t∈[t0, t1]中的命中进行测试


图4.11。一个简单的场景渲染,只有光线生成和表面相交,但没有阴影;每个像素都被设置为固定的颜色,这取决于它击中的对象

4.5 光照处理(Shading)

一旦已知像素的可见表面,像素值就通过评估光照模型来计算。如何做到这一点完全取决于应用程序-方法范围从非常简单的启发式方法到复杂的数值计算。
在本章中,我们将介绍两种最基本的光照模型;更高级的模型将在第10章中讨论
大多数光照模型,都是为了捕捉光线反射的过程而设计的,这些光主要来自物体表面反射光源和部分反射到相机上的光线。
简单的着色模型是根据点光源的照明来定义的。光反射的重要变量是光的方向l,它是指向光源的单位矢量;视图方向v,是指向眼睛或相机的单位矢量;表面法向量n,是垂直于反射点的单位向量;以及表面的特性——颜色、光泽或其他属性,取决于特定的模型。
4.5.1 Lambertian Shading
最简单的着色模型是基于Lambert在18世纪所做的观察:光源照射在一个表面上的能量取决于该表面对光线的角度。直接面向光的表面会受到最大的光照;与光方向相切的表面(或背向光的表面)没有受到光照;在两者之间,光照强度与表面法线和光源夹角θ的余弦成正比(图4.12)。这就引出了Lambertian shading model:

式中,L为像素颜色;Kd为扩散系数,或表面颜色;I为光源强度。因为n和l是单位向量,我们可以用n·l作为cos θ的简写(无论是在纸上还是在代码中)。这个方程(与本节中的其他阴影方程一样)分别适用于三种颜色通道,因此像素值的红色分量是红色漫反射分量、红色光源强度和点积的乘积;绿色和蓝色也是如此。向量l的计算方法是用光源位置减去光线和表面的交点。别忘了v,l和 n都必须是单位向量;不归一化这些向量是一个非常常见的错误在阴影计算。

(sp:真实点源的光照会随着距离的平方而减少,但在一个简单的渲染器中,这通常会带来更多的麻烦。)
(sp:你是否会有疑问,让光源颜色变为中性,那么红绿蓝强度会相同吗)

4.5.2 Blinn-Phong Shading
Lambertian shading是独立于视图的:表面的颜色不依赖于你观察的方向。许多真实的表面显示出一定程度的反射光,产生高光,或镜面反射,似乎随着视点的变化而移动。Lambertian shading不产生任何高光,导致看上去非常暗,许多光照模型会在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。
有了这样一个类,您可以创建一个具有通用接口的光线跟踪器,接口这个词在建模图元中很少用到,只使用球体调试它。

重要的一点是,任何可以被光线“击中”的东西都应该是这个类层次的一部分,例如,即使是曲面的集合也应该被认为是曲面类的子类。

这包括数据结构,如包围盒层次结构;它们可以被射线击中,所以它们在类里。例如,“抽象”或“基”类将指定hit函数以及一个稍后将证明有用的边界框函数:
这里(t0, t1)是返回hit的射线的区间,而rec是通过引用传递的记录;它包含数据,例如hit返回true时交点处的t。该类型框是一个3D“边界框”,即两个点定义了一个轴对齐的框,该框包围了曲面。例如,对于一个球体,函数将由

另一个有用的类是material。这允许你抽象材料的行为,然后添加透明的材料。连接对象和材料的一个简单方法是在surface类中添加一个指向材料的指针,尽管可能需要更多的可编程行为。一个大问题是如何处理纹理;他们是材质类的一部分还是在材质类之外?这将在第11章中进一步讨论。

4.7阴影(Shadow)

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

为了获得阴影的算法,我们添加了一个if语句来确定点是否在阴影中。在一个简单的实现中,阴影射线将检查t∈[0,∞),但由于数值不精确,这可能导致与p所在的曲面相交。相反,为了避免这个问题,通常的调整方法是对t∈[E,∞)进行检验,其中E是一个小的正常数(图4.18)。
如果我们用公式4.3为Phong照明实现阴影光线,那么我们得到以下结果:
注意,无论p是否在阴影中,环境颜色都会被添加。如果有多个光源,我们可以在评估每个光源的阴影模型之前发送一个阴影射线。上面的代码假设d和l不一定是单位向量。这对于d非常重要,如果我们希望稍后简单利落地添加实例化(参见第13.2节)

4.8理想的高光反射

将理想的高光反射或镜面反射添加到光线追踪程序中是很简单的。关键的观察结果如图4.19所示,从e方向看的观察者看到的是在r方向上从表面看到的东西。矢量r是使用Phong照明反射方程(10.6)的一个变式来找到的。符号会发生变化因为在这种情况下矢量d指向曲面,所以

在现实世界中,当光线从表面反射时,会损失一些能量,这种损失对于不同的颜色可能是不同的。例如,金色反射黄色比蓝色更有效,所以它会改变反射物体的颜色。这可以通过在raycolor中添加递归调用来实现:
其中km(表示“镜面反射”)是镜面RGB颜色。我们需要确保对s∈[,∞)进行测试的原因与对阴影射线的测试相同;我们不希望反射光线击中产生它的物体。

上面的递归调用的问题是它可能永远不会终止。例如,如果一束光线从房间里开始,它将永远反弹。这可以通过添加最大递归深度来解决。如果仅在km不为零(黑色)的情况下生成反射射线,则代码将更有效。

4.8历史记录

射线追踪在计算机图形学的早期就已经被开发出来了,但是直到后来有了足够的计算能力之后才被广泛使用。射线追踪的时间复杂度比基本的对象顺序渲染要低。尽管它传统上被认为是一种离线方法,但实时射线跟踪实现正变得越来越普遍。
经常被问到的问题
•为什么在射线追踪中没有透视矩阵?
因为z-buffer中的透视矩阵存在,所以我们可以将透视投影转换为平行投影。这在光线追踪中是不需要的,因为它很容易通过从眼睛发散光线来进行透视投影
•射线追踪可以是交互式的吗?
对于足够小的模型和图像,任何现代PC都有足够强大能力进行的射线跟踪交互。实际上,需要多个cpu和一个共享帧缓冲区来实现全屏。计算机能力的增长速度远远快于屏幕分辨率,普通pc机能够在任何屏幕分辨率追踪复杂场景只是时间问题。
•光线跟踪在硬件图形程序中有用吗?
光线追踪经常用于筛选。当用户在3D图形程序中的一个像素上单击鼠标时,程序需要确定该像素内的哪个对象是可见的。射线追踪是确定这一点的理想方法。

练习

1 射线(1,1,1)+t(−1,−1,−1)和以原点为中心半径为1的球面的交点的射线参数是什么?
注意:这是一个很好的调试案例。

2 当射线(1,1,1)+ t(−1,−1,−1)击中顶点为(1,0,0)、(0,1,0)和(0,0,1)的三角形时,重心坐标和射线参数是什么?
注意:这是一个很好的调试案例。

3 在“漂亮”(非对抗)模型上做一个射线追踪的近似时间复杂度的包络背面计算。将您的分析分解为预处理和计算图像的情况,这样您就可以为静态模型预测光线跟踪多帧的行为。

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

  1. 《Fundamentals Of Computer Graphics》虎书第三版翻译——第五章 线性代数

    或许图形学程序最常用的工具就是能对点或者向量进行变换的矩阵.在下一章节,我们可以看到如何用矩阵表示一个向量,以及如何用向量与方阵相乘表示不同基.我们还将描述如何使用这种乘法来实现向量的变换,如缩放.旋 ...

  2. 《Fundamentals Of Computer Graphics》虎书第三版翻译——第六章 矩阵变换

    线性代数的机制可以用来表达在3D场景中排列对象.用摄像机观察它们并将它们放到屏幕上所需的许多操作.几何变换,如旋转.平移.缩放和投影可以通过矩阵乘法来完成,而用于实现这一目的的变换矩阵是本章的主题.我 ...

  3. 《Fundamentals of Computer Grahpics》虎书第三版翻译——第一章 介绍

    1.1 图形领域 在任何领域进行强分类是危险的,但大多数从事图形学行业的人都会赞同以下这些计算机图形学的主要领域: 建模:使用数学规格进行建模,这些数据是能存储在计算机上的形状和外观属性.例如,一个咖 ...

  4. 《Fundamentals of Computer Grahpics》虎书第三版翻译——第二章 各种各样的数学

    大部分图形学只是把数学直接转化成代码.数学越清晰,对生成的代码越清晰;这本书的大部分内容都集中在如何正确的使用数学.本章回顾了高中和大学数学中的各种工具,旨在作为参考而不是教程.这本书的主题看起来像是 ...

  5. Timo学习笔记 :Python基础教程(第三版)第四章 当索引行不通时

    第四章 当索引行不通时 Timo学习笔记 :Python基础教程(第三版)第三章 使用字符串 这是word编辑的最后一章笔记,第五章开始将直接用这个模板记录. 本章笔记很少,也很简单.很多方法可以到要 ...

  6. JavaScript高级编程设计(第三版)——第四章:变量作用域和内存问题

    系列文章目录 第二章:在html中使用javaScript 第三章:基本概念 第四章:变量作用域和内存问题 第五章:引用类型 目录 系列文章目录 前言 一.基本数据类型和引用类型的值? 1.数据类型 ...

  7. 深入理解计算机系统(原书第三版)系列 第一章 计算机系统漫游

    大学学习 计算机操作系统,当时太年轻,没有重视起来,今天 重拾书本,来看看这本传说中的 豆瓣9.9的神书 ,夯实基础,基础是石,敲出希望之火. 第一章 计算机系统漫游

  8. windows下对hid设备interrupt端口读写_读《汇编语言》第三版 第十四章 端口

    我们知道,各种存储器都和CPU的地址线,数据线,控制线相连.CPU在操控它们的时候,把他们都当作内存来对待,把它们总地看做一个若干存储器单元组成的逻辑存储器,这个逻辑存储器称为内存地址空间. 在PC系 ...

  9. 计算机理论导引第三版答案第四章,《计算理论导引》第四章:可判定性-学习笔记 | 诟屍...

    第四章:可判定性 4 Decidability 关于其他章节的内容,请点这:<计算理论导引>学习笔记 4.1 Decidable Languages 几个可判定的语言 acceptance ...

最新文章

  1. 网吧电源和网络布线经验谈(1)
  2. 网站初学笔记3-HTML实用元素3
  3. 数据结构:栈实现逆波兰计算器
  4. jquery终止函数
  5. 整理了一下目前的专栏文章,基本可以完整解决普通问题了 - 知乎专栏
  6. 7nfs客户端没权限_Ant design pro v4-服务器菜单和路由权限控制
  7. C++中函数模板template和函数参数为指针,且有返回值的结合使用
  8. mysql5.7重置密码windows_MySql 5.7 for Windows 重置root密码
  9. [C++11]shared_ptr效率比较
  10. caffe data层_Caffe Softmax层的实现原理?
  11. 使用vue-qriously插件,在vue项目中生成二维码
  12. 单臂路由VLAN通信
  13. mysql建表时创建索引语句_创建表的时候创建索引
  14. 拓端tecdat|新零售消费者特征的数据视野
  15. cefsharp设置cookie_CefSharp 设置cookie
  16. RuoYi-flowable工作流管理
  17. 如何使用自己的云服务器做代理服务器
  18. Shell监控jvm发短信
  19. 前端实现浏览器自动弹开三屏、一键关闭效果
  20. 【Egret优化分享】白鹭引擎王泽:重度H5游戏性能优化技巧

热门文章

  1. 《Kinect应用开发实战:用最自然的方式与机器对话》一3.5 从深度图像到骨骼图...
  2. 神经系统疾病题库【1】
  3. 北大数学系「扫地僧」韦东奕爆红!拒绝哈佛offer,留任北大,却因长相引热议...
  4. 有感而发:总结很重要
  5. 近段时间参加的CTF竞赛部分题目复现(ISCC2020 、GKCTF、网鼎杯)
  6. 联通5G卡插到手机显示3G
  7. L3-013. 非常弹的球
  8. Selenium WebDrive使用Edge浏览器模拟登录163邮箱
  9. ilog开发培训大纲
  10. iOS开发人员必看的精品资料(100个)(转)