阅读:1365回复:0
3D图形编程指南9 - 光线
<b>目 录
</b> 8.1 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.1" target="_blank" ><FONT color=#000000>光线的物理特性与人的感觉</FONT></A> 8.2 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.2" target="_blank" ><FONT color=#000000>颜色模拟</FONT></A> 8.2.1 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.2.1" target="_blank" ><FONT color=#000000>非彩色光</FONT></A> 8.2.2 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.2.2" target="_blank" ><FONT color=#000000>颜色模型的三个成分</FONT></A> 8.3 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.3" target="_blank" ><FONT color=#000000>照明模拟</FONT></A> 8.3.1 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.3.1" target="_blank" ><FONT color=#000000>环境照明</FONT></A> 8.3.2 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.3.2" target="_blank" ><FONT color=#000000>漫反射</FONT></A> 8.3.3 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.3.3" target="_blank" ><FONT color=#000000>镜面反射</FONT></A> 8.4 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.4" target="_blank" ><FONT color=#000000>在屏幕到世界中观察照明</FONT></A> 8.5 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.5" target="_blank" ><FONT color=#000000>辐射度</FONT></A> 8.6 <a href="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/8.htm#8.6" target="_blank" ><FONT color=#000000>在世界到屏幕中观察照明</FONT></A> <HR align=center width="95%" noShade SIZE=1> <B></B> <B>引言</B> 我们很难对人类对光线的感知能力做出过高的评价。但在我们所拥有的所有的感觉器官中,眼睛无疑是最重要的一个。这或许是因为由眼睛获得的信息与人体其他器官所获得的信息相比有更大的带宽所造成的吧。正是由于这个原因,整个计算机图形学领域的内容都建立在了开发人类的视觉感知能力上。 在前面的介绍中,我们已经讨论了如何来描绘一个真实场景的大致轮廓。但是,如果我们对同一个场景使用不同类型的灯光的话,那么这个场景最后表现出来的效果将会大大不同。并且这种不同不仅仅表现在物体的表面有不同的颜色,也将影响到场景的反射和阴影模式(shadow pattern),它们的效果也是很明显的。 同时,颜色和光线在计算机图形学中也是两个很重要的主题。它们都横跨了多个领域,这些领域包括:几何学,光学,物理学等。我们将会讨论在计算机图形学程序中表现颜色的一些基本原理,以及关于光源与被照亮物体之间相互作用的一些话题。这些讨论都是基于自然界中实际处理这些情况的过程的基本原理。但是其中大多数都是最基本的,这一点也是可以理解的,主要是因为采用高级的光学和波动理论将会消耗很大的资源。这一点也有一定的缺陷,例如我们采用的反射模型,使用它将无法产生我们在真实世界中所看到的某些效果。但是在某种程度上,我们可以采用合成方法,它与真实情况相比较也是可以接受的。 在下面的讨论中,我们也将讨论一些基本的模拟颜色和光线的途径,特别是如何将世界中的光线处理到屏幕上。 <B>8.1、光线的物理特性与人的感觉 </B> 我们使用计算机图形学方法进行渲染的最终目标就是要能够通过眼睛的处理。因此,我们就必须要充分考虑人眼是如何观察物体的。 是什么能使我们的眼睛区别红色与蓝色呢?在物理上,红色与蓝色又有什么区别呢?光在本质上一种电磁场,它在电磁特性上的一些参数决定了它的特性。这些电磁波根据频率或者波长的不同而表现出不同的特性。我们的眼睛只能看到波长为400到700纳米之间范围内的光线。 我们对两个眼睛接收的光线进行聚焦,每一个眼睛接收的图象是有所不同的,并且可以大致估计出物体到我们的距离。如果同一处物体的图像的投影完全一致的话,那么这个物体就在离我们无限远的地方。如果图象有一定的位移,那么物体的距离就会离我们近一些。我们交替的闭上眼睛,注视不同距离的物体就会明显的感觉到这一点。我们可以充分利用这一特点来产生沉浸式(immersive)的具有真实感的三维视觉图形,具体来说就是要保证我们的两个眼睛能够看到同一个场景的不同角度的图象。使用这种方法,我们就会感受到场景的深度信息。当然,我们的程序还必须依赖一些特殊的硬件才能达到上面的效果。这些硬件种类很多,从价格昂贵的头盔式显示器(head-mounted displays)(两个眼睛有各自不同的显示屏幕)到相对便宜的光闸眼镜(shutter glasses)(交替关闭透镜,从而使每一只眼睛能够同步的接收到计算机屏幕产生的不同的图象)。 我们所看到的图象在眼睛里被投影到视网膜上。视网膜上的视觉神经能够感受颜色。我们眼睛主要有两种感受光线的细胞:锥状细胞和杆状细胞。杆状细胞对光线有很强的感应能力而对颜色则没有直接的感觉。锥状细胞则对颜色存在感应能力。有三种不同的锥状细胞,每一种都只对某一特定的光谱范围有最强的感知能力。第一种对光谱中的蓝光敏感,第二种对绿光敏感,第三种则对红光敏感。对红光区域最敏感的细胞对相邻的光谱区域也有一定的感应能力,只是随着距离的增大而逐渐减小。人眼感应蓝光的细胞相对来说分布密度较小,因而感应能力也就比红光和绿光要小一些(见图8.1) 。这对于我们建立颜色调色板有一定的提示作用。通常我们都只分配较少的颜色位数来表示蓝色。 <TABLE cellSpacing=0 cellPadding=2 align=center border=0> <TR align=middle> <TD colSpan=3><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image538.gif"></TD></TR> <TR align=middle> <TD colSpan=3><FONT color=#cccccc><B>图8.1 不同颜色受体的敏感性范围</B></FONT></TD></TR></TABLE> 通常,上述三种分布综合起来决定了我们对不同波长光线的感应能力。对于人眼来说,最敏感的颜色位于光谱范围的中心附近。 单色光可以通过波长和强度来唯一的进行表示。但是真实的可见光都不是单色光 — 它们都是由不同波长和强度的光线组合而成的。实际光线可以用光线在可见光范围内的能量分布来表示。略微偏红的颜色的分布图会偏向右侧一些,而偏蓝的颜色会偏向左侧一些。 <TABLE cellSpacing=0 cellPadding=2 align=center border=0> <TR align=middle> <TD colSpan=3><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image539.gif"></TD></TR> <TR align=middle> <TD colSpan=3><FONT color=#cccccc><B>图8.2 某种颜色的能量分布</B></FONT></TD></TR></TABLE> 从物理学上来讲我们用能量分布来表示颜色,但是在实际的计算机图形学中我们没有必要这样做。考虑到人眼的一些特性,我们可以使用能量分布最大值处的波长 — 主波长(dominant wave length) — 来表示颜色。实际上,我们认为具有不同能量分布而又具有相同主波长的颜色具有相同的色度。而整个分布范围内能量的总量则涉及到了颜色的饱和度问题,例如,理想白色光的能量分布在整个光谱范围内是一条直线,它没有主波长,因此饱和度就是<I>0%</I>。一个具有<I>100%</I>饱和度的颜色只在某一位置上有一个能量冲击, 而在其他地方的能量均为0。光线的亮度则涉及到了能量的大小问题,特别是能量分布的优势部分的能量大小。 上面通过能量分布来描述颜色的假设对我们来说还是有些太复杂,并且也没有考虑到我们人眼视觉系统的一些特性,接下来,我们就要检验一下在计算机图形学程序中模拟颜色的实际的一些方法。 <B>8.2、颜色模拟</B> 人类为不同的物体再生出颜色的尝试可以一直追溯到几个世纪以前。对绘画颜色的混合以及彩色电视机的出现可能算作使这种尝试的成功典范了。在所有的尝试中,我们所使用的方案都要比能量分布来的简单,并且也都获得了可以接收的结果。下面,我们就来讨论一下计算机图形学程序中所使用的几种方案。 <B>8.2.1 非彩色光(白与黑)</B> 光线的总能量对我们的感觉来说是很重要的。我们在观察黑白图象以及将它们联系到现实生活中时,都间接的证明了这一点。较早的电视机与计算机显示器都是黑白的。黑白颜色如此受到欢迎主要是因为使用它可以简单的对任何颜色进行描述和重建。我们需要得到的仅仅是一个与光线能量大小相关的数字罢了。较高的能量转化为较亮的颜色,较低的能量则转化为较暗的颜色。 在我们表现光照效果时(例如反射效果,我们很快就会讨论到它),我们需要一种颜色的一整套不同的亮度等级。要得到这些亮度等级,我们就要给不同的亮度等级分配一些索引,这样就可以随着索引的增长而得到逐渐变亮的亮度等级。 通常,这些索引并不是简单地与光线的亮度成比例。它们实际上是成对数关系的。当能量较小时,我们需要索引的增量小一些,而当能量较大时,则需要增长得大一些。这主要是因为我们的视觉系统在能量等级较高时不容易区分亮度之间的差别。大多数情况下,计算机显示设备都会考虑到人眼的这一特性。 为非彩色光的亮度等级设置了索引之后,我们就可以执行某些光线操作了。例如,由于两个灯光合并起来的效果跟它们能量的和有关,所以我们就可以用它们索引的和来模拟它们合并后的效果。简单来说,我们可以在索引间进行内插,找到一个适合于已知亮度的索引值。 但是,我们将两个索引加起来之后得到的值很有可能会超过可用亮度等级的范围。当可用亮度等级的数量存在上限时,我们就要设计一些方法来保证任何颜色操作的结果都能够有一个正确的值。 最简单的方法就是将索引值限制在上限范围之内,也就是将比上限更亮的光线都用可能的最亮亮度等级来表示。另一种方法是对所有的颜色进行缩放,从而使得到的最亮颜色与可能的最大值对应起来,这样,其余的颜色亮度也就相应的减小了。 尽管非彩色光对许多技术仍然非常重要,但是现代的3-D图形已经开始将彩色作为提高视觉真实感的一个重要的工具了。 <B>8.2.2 颜色模型的三个成分</B> 我们已经认识到光线分布的某些特定属性对于我们的感觉有更重要的作用 。主波长影响着颜色的色调(hue),而光线的分布区域则影响着颜色的饱和度。能量分布的优势区域内的能量等级影响着颜色的亮度。这些概念都是很直观的,因此, 我们就有了一个模拟颜色的方法,那就是通过对颜色的色调(hue)、饱和度(saturation)以及亮度(brightness)进行描述。这就是我们常说的HSB系统,下图显示了HSB系统的颜色空间(见图8.3): <TABLE cellSpacing=0 cellPadding=2 align=center border=0> <TR align=middle> <TD colSpan=3><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image540.gif"></TD></TR> <TR align=middle> <TD colSpan=3><FONT color=#cccccc><B>图8.3 HSB颜色空间</B></FONT></TD></TR></TABLE> 在这个系统中,色调用角度进行度量,亮度在水平方向上进行度量。这样,黑色就位于颜色空间的底部,白色则位于顶部。从图中我们可以看到,饱和度在亮度很小时其大小也是很小的,当亮度增大时,它的范围也相应增加了。 尽管这个系统在直观上非常地清晰明了,也允许我们对颜色做进一步的详细说明,但它仍然不适于在计算机程序内来使用。为此,我们仍然需要寻找一种系统能够很容易的表示几个光源之间的相互作用,很容易的表示多个光源的合成效果或者很容易的在两个已知颜色间进行内插运算。 既然我们已经知道人眼的敏感度集中在三个区域内,那么我们就可以尝试着用这三个区域内颜色的加权和来表示一个单独的颜色。这三个眼色就是红、绿、蓝,也就是我们常说的三原色。这样,我们就可以用下面的形式来说明一个颜色了: <TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=0> <TR align=middle> <TD><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image541.gif"></TD></TR></TABLE> 式中的R、G、B分别表示红、绿、蓝三种颜色各自的亮度等级。这样我们只用三个值就可以表示一个颜色,当然要比用能量分布表示颜色的方法更容易操作。尽管这种方法并不完全正确,并且也不能覆盖所有的可见颜色范围,但是它确实十分简便,并且它的加和性(additive nature)也有很高的应用价值。 这种系统之所以具有加和性,主要是因为我们能够将纯色相加而产生处一个合成颜色。在第一章中,我们已经遇到过采用RGB系统来表示颜色的实际硬件。 由于这个系统的加和性,我们也可以使用矢量加法的形式将两个光线的效果进行合成,也就是将RGB三个分量分别相加: <TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=0> <TR align=middle> <TD><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image542.gif"></TD></TR></TABLE> 从直观上来讲,我们可以认为每一种颜色都位于下图这样的一个三维空间中的一个点上,该空间的每一个轴都是一种基色:(见图8.4) <TABLE cellSpacing=0 cellPadding=2 align=center border=0> <TR align=middle> <TD colSpan=3><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image543.gif"></TD></TR> <TR align=middle> <TD colSpan=3><FONT color=#cccccc><B>图8.4 RGB颜色空间</B></FONT></TD></TR></TABLE> 通常,我们也要限制每一种基色的亮度范围,这一点与非彩色光的情况相同。这样,所有可能的颜色就都位于图8.5所示的立方体内: <TABLE cellSpacing=0 cellPadding=2 align=center border=0> <TR align=middle> <TD colSpan=3><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image544.gif"></TD></TR> <TR align=middle> <TD colSpan=3><FONT color=#cccccc><B>图8.5 颜色立方体</B></FONT></TD></TR></TABLE> 在这个立方体中,灰度的亮度位于对角线上,白色表示为(1,1,1)黑色表示为(0,0,0)。立方体所包围的空间完全对应与HSB系统所表示的锥体空间。如果我们沿着对角线将白色和黑色点连结起来,那么这条线就正好对应于图8.3中锥体的轴。 有一个问题与我们在使用非彩色光线时一样,那就是两个彩色光线叠加后的效果有可能会超出上图立方体所表示的范围。那么这时最普通的方法就是将超出范围的三种颜色成分分别钳制在规定的范围之内。还有一个方法就是对所有的颜色进行缩放以避免上述溢出情况的发生。由于大多数情况下我们无法预先知道所有光线可能的值也无法知道它们叠加之后情况会如何,所以我们通常还是采用第一种方法来处理溢出情况的发生。 除了上面提到的几种颜色模型之外,还有其它许多种模型来描述颜色,如:YIQ,它主要用于描述广播电视信号;CMY,它多用于hardcopy打印技术。我们在计算机图形学中主要使用RGB系统,这主要是因为它能将大多数的光照问题分解为三个相互独立的基色来处理。由于系统的加和性,对于每一种基色单独进行处理的方案进行合并之后所得到的效果与我们在真实世界中所看到的效果是完全相对应的。例如,当我们要对两个颜色进行内插时,通过对两个颜色的三个成分分别进行内插,然后将它们合成起来得到的效果与直接进行内插得到的效果是一样的。而在这种情况下使用HSB系统有可能无法得到满意的结果。我们通常会给RGB系统添加第4个分量“<I>alpha</I>”,它用来描述透明属性。这种扩展的RGBA系统有助于我们对复杂照明效果进行模拟。 在第一章中,我们已经介绍过显示硬件可以为描述图象位图提供不同方式的支持。其中有一种是像素的颜色直接通过RGB值来进行描述,另一种则是通过一个调色板索引来进行描述。在后一种方式中,调色板中存储了实际的RGB值,并且调色板的大小也有限制。我们经常要将第一种方式存储的位图转换为后一种方式存储的位图,这时就要被迫减少颜色的数目。由于第一种表示方法是连续的,而第二种方法是离散的,因此这一问题就是我们所说的颜色量化(color quantization)。 如果我们要从原始图象中选择所有唯一的颜色,我们就必须在颜色空间中找到一些簇(cluster),这样在一个簇内,颜色间的距离是最近的,然后我们用一个单独的颜色来代替整个簇。直接解决这一问题的计算量是很大的。但是我们已经有了许多技术可以有效的找到一些近似值,这样就产生了我们感觉上可以接收的颜色简化(color reduction)。下面我们要讨论其中的一种叫做<I>median-cut</I>(中线切割)的算法,它最初于80年代早期由P.S. Heckbert提出<B>。</B> 这种算法将颜色视为三维空间中的点来看待,它首先要找到围绕最初颜色的边界盒,然后沿着最长一边的中线(median)将边界盒切割为两部分, 这样就可以将问题分解为两个子问题来解决。图8.6这时了一个平面例子的处理步骤,它忽略了B-轴。 <TABLE cellSpacing=0 cellPadding=2 align=center border=0> <TR align=middle> <TD colSpan=3><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image545.gif"></TD></TR> <TR align=middle> <TD colSpan=3><FONT color=#cccccc><B>图8.6 颜色简化过程的步骤</B></FONT></TD></TR></TABLE> 如图8.6(a)所示,我们沿着边界正方形的最长一条边将它分为两个部分。然后依此类推计算得到的两部分中颜色的边界正方形,并进行分隔(如图8.6(b)所示)。我们可以看到,一个分隔沿G-轴进行,另一个分隔则沿着R-轴进行。一旦我们达到了所需的数量要求,我们就可以停止进行分隔。例如,如果我们要用四种颜色来代替原先的颜色,那么经过两级分隔之后就可以不再进行分隔,接下来就要在每一个部分中分别计算颜色点集合的质心,从而得到我们所要的颜色(如图8.6(c)所示)。 在进行分隔时有一点要注意,那就是为了提高颜色简化的质量,还要考虑到原始颜色的点在图象中出现的频率问题。这一信息在计算中线以及质心时要予以考虑。该信息在中线和质心计算期间使用,这样,沿轴的中线被作为沿轴的坐标被这些频率总和分割开的频率次数和来计算。质心的坐标被作为各自沿轴的中线来计算。 在下面的讨论中我们将会看到,为了很好的表现出照明效果,我们要求能够表现出同一颜色不同的亮度等级。当图象位图存储了整个RGB值的时候,这一点并不难做到, 但是如果我们使用调色板来进行描述时就要变得复杂的多了。这时,我们只有有限的几种颜色可用,并且位图存储的是调色板入口的索引值。这时,为了对应于某些更亮的颜色,可能就要调整颜色板中的颜色以便增加索引值。但是,如果调色板中某些颜色的色调完全不同的话,那么以任何顺序来安排它们都是十分困难的。有时,我们可能要在逻辑上将调色板分割成一些颜色组,这样在这些组中,增加的索引就能与更亮的亮度等级相对应。 必须要注意的是,这些组可能仍然会共用某些颜色。例如,任何在零照明情况下的颜色都支持黑色。既然我们要考虑颜色数目的限制,那我们就不能允许重复存储同样的颜色,这样就有必要用另外一个调色板来反映这些共用的颜色。为了表现出共用的颜色,我们可以建立一个二维数组,用一维来表示颜色的索引,另一维来表示亮度等级的数目。由于有颜色共用的存在,表格的大小可能会超过调色板的大小。 还应强调的是,增加的索引完全对应于使用非彩色光时的情况。如果我们要使用不同颜色的光源,那就有可能在第二个表格中需要更多的维数。 <B>8.3、照明模拟</B> 在前面的讨论中,我们已经研究了光线的本质、属性以及在计算机图形中模拟不同颜色光线的一些方法。然而,由一些光源以及我们周围物体所发出的光线是有相互作用的。 三维图形的最终目的就是要描绘出来自于真实世界的图象。为了这一目的,我们当然要重视对人类视觉有重要作用的光线与物体的相互作用问题。 在光线与物质之间有许多种类的相互作用。例如,物质可以吸收、反射或者是传播光线。这些效果都可以用光线的粒子属性来进行解释和模拟,也就是说,可以把光线模拟作一束很小的粒子。模拟其它的效果,如干涉、衍射或者是反射,则需要用光的波动理论来进行解释。总之,充分考虑到光线与物质相互作用的光照模型是很复杂的,同时用计算机处理起来计算量也很大,特别是要在具有交互性的程序中实现计算量就更大了。因此,大多数程序就只去考虑一些绝对重要的相互作用,如比较显著的反射效果。在这一部分中,我们将讨论在计算机图形学中广泛使用的光照模型的一些组成部分。 <B> 8.3.1 环境照明</B> 在计算机图形学程序中,最简单并且也是最早应用的照明模型恐怕就是环境光模型了。在这个模型中,我们假设只有很少的光源,且其照明在任何方向都是相等的。 使用这种照明方式,每一个表面所表现出的都是它固有的反射能力。能够较好反射光线的物体看起来就会亮一些,而吸收了大部分光线的物体看起来则会暗一些。在日常生活中,我们会发现物体经常都处在一个由太阳发出的统一的白光照射下。很明显,这与我们通常所说的有材质物体的颜色有关。我们所说的某种有材质物体的颜色实际就是描述了它对白色光的反射能力。通常,反射能力可以用[0,1]范围内的一个系数来进行描述,0意味着物体将百分之百的吸收一个给定频率的光线,1则表示完全反射。我们可以看到, 这个系数是与波长有关的 — 大多数物体会吸收某些频率的光线而反射掉其它频率的光线。因此,一个有材质物体的反射能力就可以用一个分布来进行描述,在这个分布中,反射系数是入射光线波长的函数。根据前面对颜色模型的讨论,我们知道一个颜色既可以用一个索引值来进行表示(非彩色光情况下),也可以用三基色来进行表示(彩色光情况下)。这样,我们所说的物质的反射能力也就既可以用一个单独的系数来表示,也可以用三个系数同时来表示。总的来说,我们用下面这个简单的公式来表示光照模型: <TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=0> <TR align=middle> <TD><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image546.gif"></TD></TR></TABLE> 使用上面的公式,我们可以得到在环境光照明情况下光线反射后的亮度值。注意,公式中的<IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image547.gif">和<IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image548.gif">在非彩色光模型下均为表亮,在彩色光模型下均为三维矢量。 由于环境光等级保持为常量,这样我们就可以预先设置场景中每个表面的<IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image549.gif">使每个物体都能使用它本身的颜色。下图中的物体使用了环境光照明模型,我们可以看到,它的真实感是很差的,我们只能从图中看到物体的轮廓而已。 <TABLE cellSpacing=0 cellPadding=2 align=center border=0> <TR align=middle> <TD colSpan=3><IMG src="mk:@MSITStore:E:\3D图形编程指南.chm::/3D图形编程指南/image/8.1/Image550.gif"></TD></TR> <TR align=middle> <TD colSpan=3><FONT color=#cccccc><B>图8.7 环境照明</B></FONT></TD></TR></TABLE> 为了提高图象的真实感,我们就需要寻找更复杂的照明模型。但是这种古老的方法至今仍然在广泛使用,特别是用来执行一些我们不愿去计算的效果,例如光线在物体表面的多重反射。 |
|
|