Press "Enter" to skip to content

【译】计算机图形学基础第四版(4.2)

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

 

特别声明

 

本文翻译的是由 Steve MarschnerPeter Shirley 主要参与编写的的第四版《计算机图形学基础》[英]。

 

版权归原作者所有。

 

正文

 

4 光线追踪(二)

 

4.4 射线-物体相交

 

一旦我们生成了一条射线 e td,接下来我们需要找到与任何 t > 0 的对象的第一个交点。在实践中,解决一个稍微更一般的问题是有用的:找到射线之间的第一个交点和出现在区间 [t0, t1] 中的 t 处的表面。基本光线相交是 t0 = 0 和 t1 = ∞ 的情况。我们为球体和三角形解决了这个问题。在下一节中,将讨论多个对象。

 

4.4.1 射线-球体相交

 

给定一条射线 p(t) = e td 和一个隐式曲面 f(p)=0(参见第 2.5.3 节),我们想知道它们在哪里相交。当射线上的点满足隐式方程时,就会出现交点,因此我们寻求的 t 值是那些求解方程的值

 

 

圆心 c = (xc, yc, zc) 半径为 R 的球体可以用隐式方程表示

 

 

我们可以用向量形式写出同样的方程:

 

 

任何满足这个方程的点 p 都在球面上。如果我们将射线上的点 p(t) = e td 代入这个方程,我们会得到一个关于 t 的方程,它由 t 的值满足,该值在球体上产生点:

 

 

 

在这里,除了参数 t 之外,一切都是已知的,所以这是 t 中的经典二次方程,这意味着它具有以下形式

 

 

该方程的解在 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,那幺交点会发生在

 

 

对于某些 t、β 和 γ。如图 4.10 所示,

 

 

交点 p 将在 e td 处。 同样,从第 2.7.2 节,我们知道交点在三角形内部当且仅当 β > 0、γ > 0 和 β γ < 1。否则,射线已经射到三角形外部的平面,所以它错过了三角形。如果没有解,要幺三角形退化,要幺射线平行于包含三角形的平面。 为了求解方程 (4.2) 中的 t、β 和 γ,我们将其从向量形式展开为三个坐标的三个方程:

 

 

这可以重写为标准线性系统:

 

 

解决这个3×3线性系统的最快经典方法是Cramer的规则。这为我们提供了解决方案

 

 

矩阵A是

 

 

和| A |表示A的决定因素A的3×3决定因素具有可以利用的常见缩写。查看带有虚拟变量的线性系统

 

 

克莱默法则给了我们:

 

当:

 

 

我们可以通过重用“ei-minus-hf”等数字来减少操作次数。

 

我们需要线性解的射线-三角形相交的算法可以有一些提前终止的条件。因此,该函数应类似于:

 

 

4.4.3 射线-多边形相交

 

给定一个具有 m 个顶点 p1 到 pm 和表面法线 n 的平面多边形,我们首先使用隐式方程计算射线 e td 和包含该多边形的平面之间的交点

 

 

我们通过设置 p = e td 并求解 t 来做到这一点

 

 

这使我们能够计算p。如果p在多边形内,则射线击中它。否则,它不会。 我们可以通过将点和多边形顶点投射到XY平面并在那里回答多边形来回答P多边形内部的问题。最简单的方法是将任何2D射线从p中发送出去,并计算该射线与多边形边界之间的相交数量(Sutherland,Sproull和Schumacker,1974; Glassner,1989)。如果相交的数量是奇数的,则该点在多边形内。否则不是。这是正确的,因为进入的光线必须熄灭,从而创建了一对交叉点。只有从内部开始的射线不会创建这样的一对。为了使计算简单,2D射线也可以沿X轴传播:

 

 

对于 s ∈ (0, ∞),计算该射线与诸如 (x1, y1, x2, y2) 等边的交点很简单。

 

然而,对于投影到 xy 平面中的多边形是一条线,就会出现问题。为了解决这个问题,我们可以在 xy、yz 或 zx 平面中选择最好的。如果我们实现我们的点以允许索引操作,例如 p(0) = xp 那幺这可以如下完成:

 

 

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

 

另一种在实践中经常使用的多边形方法是将它们替换为几个三角形。

 

4.4.4 与一组对象相交

 

当然,最有趣的场景由多个对象组成,当我们将一条射线与场景相交时,我们必须只找到沿射线与相机最近的交点。实现这一点的一种简单方法是将一组对象视为其本身是另一种类型的对象。要将射线与组相交,只需将射线与组中的对象相交并返回具有最小 t 值的交点。以下代码测试区间 t ∈ [t0, t1] 中的命中:

 

 

 

4.5 阴影

 

一旦知道像素的可见表面,就可以通过评估着色模型来计算像素值。如何做到这一点完全取决于应用程序——方法范围从非常简单的启发式到精细的数值计算。在本章中,我们描述了两种最基本的着色模型;第 10 章将讨论更高级的模型。

 

大多数着色模型,以一种或另一种方式,旨在捕捉光反射的过程,即表面被光源照亮并将部分光反射到相机。简单的着色模型是根据来自点光源的照明来定义的。光反射中的重要变量是光的方向 l,它是指向光源的单位向量;视图方向v,它是指向眼睛或相机的单位向量;表面法线 n,它是在发生反射的点处垂直于表面的单位矢量;以及表面的特征——颜色、光泽度或其他属性,具体取决于特定型号。

 

4.5.1 朗伯着色

 

最简单的着色模型基于 Lambert 在 18 世纪所做的观察:光源落在表面区域的能量取决于表面与光线的角度。直接面向光的表面接收最大照明;与光线方向相切(或背向光线)的表面不接收照明;之间的照明与表面法线和光源之间的角度 θ 的余弦成正比(图 4.12)。

 

 

这导致了朗伯着色模型:

 

 

其中l是像素颜色;KD是弥漫系数或表面颜色。我是光源的强度。因为n和l是单位向量,所以我们可以将n·l用作方便的速记(无论是在纸上还是在代码上)作为cosθ。该方程式(如本节中的其他阴影方程)分别适用于三个颜色通道,因此像素值的红色分量是红色扩散分量,红光源强度和点乘积的乘积;绿色和蓝色也是如此。

 

向量L是通过从光源位置减去射线和表面的交点来计算的。不要忘记V,L和N都必须是单位向量;在阴影计算中未能使这些向量归一化是一个非常普遍的错误。

 

来自真实点的照明会随着距离平方的形式掉落,但这通常比简单的渲染器中值得更多的麻烦。 如有疑问,将光源保持颜色中性,具有相等的红色,绿色和蓝色强度。

 

Blinn-Phong着色

 

朗伯着色与视图无关:表面的颜色不取决于您观看的方向。许多真实表面显示出某种程度的光泽,产生高光或镜面反射,随着视点的变化,它们似乎会四处移动。朗伯着色不会产生任何高光,并导致非常无光泽、白垩的外观,并且许多着色模型在朗伯着色中添加了镜面反射分量;朗伯部分是漫反射分量。

 

Phong (Phong, 1975) 提出了一个非常简单且广泛使用的镜面高光模型,后来 Blinn (J. F. Blinn, 1976) 将其更新为当今最常用的形式。这个想法是在 v 和 l 对称地穿过表面法线时产生最亮的反射,此时会发生镜面反射;然后,随着矢量远离镜面配置,反射会平稳减少。

 

 

我们可以通过比较半向量 h(v 和 l 之间的角的平分线)与表面法线(图 4.16)

 

 

来判断我们与镜像配置的接近程度。如果半向量接近表面法线,则镜面反射分量应该是亮的;如果它很远,它应该是暗淡的。这个结果是通过计算 h 和 n 之间的点积来实现的(记住它们是单位向量,所以当向量相等时,n·h 达到最大值 1),然后将结果乘以 p > 1 以使其减小快点。功率或 Phong 指数控制表面的明显光泽度。半向量本身很容易计算:由于 v 和 l 的长度相同,因此它们的和是一个将它们之间的角度平分的向量,只需对其进行归一化即可产生 h。

 

综上所述,Blinn-Phong 着色模型如下:

 

 

其中 ks 是表面的镜面反射系数或镜面反射颜色。

 

p的典型值:10——“蛋壳”; 100——有轻微光泽; 1000——非常有光泽; 10,000——几乎像镜子一样。 如有疑问,请将镜面反射颜色设为灰色,并具有相等的红色、绿色和蓝色值。

 

4.5.3 环境阴影

 

根本没有获得照明的表面将被呈现为完全黑色,通常是不可取的。避免黑色阴影的粗略但有用的启发式是在阴影模型中添加一个恒定组件,该模型的贡献仅取决于对象的命中,而完全不依赖于表面几何形状。这就是所谓的环境阴影 – 好像表面是由同样来自任何地方的“环境”光照亮的。

 

为了方便调整参数,环境阴影通常表示为具有环境浅色的表面颜色的产物,因此可以单独或将所有表面一起调整环境阴影。与Blinn-Phong模型的其余部分一起,环境阴影完成了简单且有用的阴影模式的完整版本:

 

在现实世界中,不被光源照亮的表面被其他表面的间接反射所照亮

 

 

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

 

如有疑问,请将环境颜色设置为与漫反射颜色相同

 

4.5.4 多点光源

 

光的一个非常有用的特性是叠加——由多个光源引起的效果只是各个光源效果的总和。 出于这个原因,我们的简单着色模型可以很容易地扩展到处理 N 个光源:

 

 

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

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。