通常在计算机图形学中有三类光源需要考虑,分别是点光源、聚光光源和方向性光源。每类光源分别描述了日常生活中见到的不同类型的光。例如,点光源可以是某个距离上向所有方向发光的任何光源,如灯泡;聚光光源通过圆锥发光,如闪光灯;而方向光则是从特定的方向,但是无法辨别的光源处发光。
【注意】
方向光不同于点光和聚光的是,现实世界中并没有这样的光。另一方面,在计算机图形学中,它们确实存在而且可以由数学计算得到。
1. 点光源
如本章前面所提到的一样,点光源是一种在某个距离上向所有方向发光的光源。随着光传播一定的距离,它会损失一定的能量而且亮度也会逐渐降低。可以将点光源认为是灯泡、蜡烛,或是在一定距离上可以发光的所有其他东西。点光源在3D场景中看起来很舒服,因为经常使用。
2. 聚光光源
聚光光源在一定距离上散法能量(类似于点光源)。与点光源的差别在于聚光光源是通过一个圆锥将光发射到3D场景中,而不是在各个方向都发光。一些聚光光源如闪光灯、运动场灯、探照灯和头灯等,实现比较困难,耗费的处理器资源要比点光源多。虽然十分耗费资源,但它们看上去也很舒服。
3. 方向性光源
在计算机图形学中,第三种光被称为方向光。这些光像是从某个方向发生出来的,而没有特定的光源(整理者:类似于太阳光)。现实生活中,所有的光源都有一个产生光的源点,但在计算机图形学中产生一种没有发光源点的光源也是可能的。在光照计算机过程中,通过几个数学计算就可以实现该光源。这些光源看上去不是很真实,但它们在渲染简单的场景和简单形状的演示程序时,却足以满足要求。
3.1.2 反射模型
反射模型描述了光照射到某个表面时,入射光在物体表面上的作用方式。当一些光被反射回场景中时,一部分光能被存储。这些表面也就是所谓的材料。材料只是一些属性,描述了材料被照射时做出的满应方式。更改这些属性将得到不同的效果,例如,在木头表面和塑料表面会产生的不同反射。计算机图形学中有许多不同的反射模型,但最常用的模型分别是环境光反射模型、漫反射模型和镜面反射模型。反射模型和光属性一起确定了3D场景中物体的外观。
1. 环境光反射
环境光反射描述的是场景中没有方向的光,但是可以从各个地方都可以看到。因为从每个表面将光反射回来,这样就很难辨认光的原始位置。环境光试着模拟全局照明,这是场景中光从场景表面反射回来多次之后形成的光总量。材料的环境光反射描述了从表面反射回场景中的光数量。反射的光数量成为实际见到的光颜色。当光从表面上反射离开的时候,它沿着一定的方向反射。这些光线中的一部分进入到游戏玩家的眼睛中,这样玩家就可以看到周围的环境。
2. 漫反射
漫反射模型描述了光线从表面上在各个方向做相同反射的方式。这意味着如果看一个只由漫反射光照的物体,那么从各个角度看上去该物体都是相同的。漫反射是视觉独立的,只有物体移动或是光移动时,才会发生变化。
当光线照射在散射表面时,它会在多个方向反射。物体越光滑,反射光线散射得越光滑。除了物体的阴影区域外,物体从各个角度看上去都一样。出现这种情况是因为光线在各个方向均匀散射,所以一个角度接收到的光数量可以与另一个角度接收到的光数量相同或非常接近。
当光从表面区域上强烈反射时,会产生人眼看到的亮光区。这些亮光区可以精细的像柜台表面一样,也可以非常极端,像是照在金属球或发光的软饮料瓶上一样。因为光在表面的每个小块上产生强烈的不同反射,所以如果改变观察角度或是光源位置的话,物体就会呈现不同的外观。读者自己可以尝试一下。如果观察一个塑料瓶,就会注意到实际的亮光区是取决于光的位置、观察位置及瓶子的真实外形和细节。如果旋转该瓶子,那么亮光区就会发生变化。同样,如果围绕瓶子移动位置,也会出现相同的情况。
当谈到光照时,大部分算法都可以归为两类之一。它们要么是顶点级光照,要么是像素级光照。顶点级光照计算每个顶点的光照方程,而像素级光照则是计算屏幕上每个像素的光照方程。这是在实时光照计算时经常遇到的问题。顶点级光照是Direct3D和OpenGL中图形API使用的一种照明技术,它们通过一种名为“Blinn-phong光照”的算法完成顶点级光照。
场景中的所有光照不是都要实时完成的。实际上,有大量预处理技术可用于实现超现实影像。使用预处理技术的缺点就是不能进行实时光照,因为计算工作都是在运行实际的程序之前进行的。结果以文件形式保存,并在需要时将结果读出来。这意味着物体的环境必须是静态的,这是因为要实时使用结果的缘故,所以每次出现光动或物体移动时,就不得不重新计算。当然,这是不可能的,因为需要的计算能力远远超出了单独一帧动画可以完成的计算。预处理技术的一个例子就是所谓的“光照贴图”。光照图是特别创建的添加到场景中的图像,用于模拟光照和阴影,在许多游戏如Quake(雷神)和Rainbow6(彩虹6号)系列游戏中都使用了这种预处理技术。
阴影也是可以添加到场景中显著增加真实感层次的一个重要特征。计算机图形学中的阴影是一个包含许多实现阴影不同算法和方法的广泛研究领域。在Direct3D中,有许多可以实现阴影的方法,但是计算得到它们并不容易。Direct3D方法并没有包含这些方法中的任何一种。一个可用的阴影算法技术被称为“阴影贴图”,这种技术在计算机程序员中非常受欢迎。阴影贴图为动态物体和光源创建实时阴影。通过从光线角度观察到一种名为“深度缓存”的对象,并将结果以一幅大图像的形式映射到场景中而实现阴影贴图。