如何让图像栩栩如生?
无论虚拟三维世界有多大、多精彩,计算机都只能通过在二维屏幕上绘制像素来描画那个世界。本节将重点介绍如何让屏幕上的内容看起来栩栩如生,尤其将介绍如何尽量让场景看起来接近于现实世界。首先,我们来了解一下如何让单个静态物体看起来栩栩如生。然后,我们再回答针对整个场景的同一问题。最后,我们将介绍计算机该执行哪些操作,才能显示真实图像以真实速度进行运动的全动态场景。
要让物体的形象逼真,图像的许多要素都发挥着重要作用。其中最重要的部分包括:形状、表面特性、光照、透视、景深和抗锯齿。
形状
当我们看窗外时,会看到由各种形状构成的景色,其中的直线和曲线尺寸各异,构成的组合也不尽相同。同样,当我们看计算机显示器上的一个三维图像时,会看到由多种形状组成的图像,尽管大多数形状都是由直线构成的。我们会看到正方形、长方形、平行四边形、圆形和菱形,但看到最多的还是三角形。为了让构建出的图像看似拥有自然的平滑曲线,一些形状必须非常小。要制作复杂的图像(比如人体),可能需要将数千个这样的形状放在一起,构成一个称为线框的结构。此时,这个结构已经具有了成品的大致模样,但下一个主要步骤仍非常重要:必须赋予线框一个表面。
此图显示的是一个手的线框,它由相对较少的多边形(共862个)构成。
可以对线框的轮廓进行加工,使其看起来更自然、更圆滑,但这需要用到更多的多边形(3,444个)。
表面纹理
在现实世界中看到一个表面时,我们可以通过两种主要的方法来获得有关这个表面的信息。我们可以看见它,有时可以从多个角度进行观察;我们还可以触摸它,看看它是硬的还是软的。但对于三维图像而言,我们只能通过观察表面来获得所有可能得到的信息。这些信息可分成三类:
要让图像看起来“真实”,办法之一就是在图像的各个不同部分包含大量的上述三种信息。请环顾一下您的四周:您的计算机键盘与桌面在颜色、纹理、反射率方面都存在差异;而桌面的颜色、纹理、反射率又与您手臂的颜色、纹理和反射率存在差异。要生成真实的颜色,计算机必须能够从数百万种不同颜色中选择出适合构成图像的像素使用的颜色,这一点非常重要。纹理的变化来自于为各种表面(从青蛙的皮肤到Jell-o牌果冻,再到存储的应用于表面的“纹理贴图”)建立的数学模型。我们还将各种不可见的性质(软、硬、温暖、寒冷)与特定的颜色、纹理和反射率组合进行关联。只要一个方面出错,真实的感受就会被破坏。
为线框添加表面,即可将图像由一个数学模型转变成一幅图,我们可以认出这幅图画的是一只手。
照明
进入房间后,您会打开灯。您也许不会花大量的时间去思考灯泡或灯管传递光的方式,以及光是如何扩散到整个房间的。但制作三维图形的人必须考虑这个问题,因为线框四周的所有表面都必须从某个位置来照亮。有一种被称为光线跟踪的技术能够绘制虚拟光线的行走路线:虚拟光线离开灯泡后,被镜面、墙壁和其他反射面反射回来,并最终以不同的强度,从不同的角度落在不同的物件上。想想来自单个灯泡的光线就已经够复杂了,但大多数房间都有多个照明来源:多盏灯、屋顶吊灯、窗户、蜡烛等等。
光照在产生以下两种效果方面发挥着重要作用,正是这两种效果让物体看起来具有重量和硬度:明暗和阴影。如果光线照在物体上,一侧的光线比另一侧强,这时就会产生第一种效果,即明暗。正是这种效果使得球看起来是圆的,让高颧骨看起来引人注目,让毯子上的折痕看上去有深度且柔软。这些光线强度的差异与形状配合在一起增强了这样一个假象,那就是物体具有纵深、高度和宽度。重量错觉则来自于第二个效果,即阴影。
图像中的光照不仅可以通过明暗效果来为物体添加纵深,它还可以用阴影将物体“固定”在地面上。
光线照在实体上时,实体会投下阴影。观察日晷或树木投在人行道上的阴影,您就可以了解到这一点。因为我们习惯于看到真实物体和人投下阴影,所以,在三维图像中看到阴影有助于加强这样一个错觉,即我们是在透过一扇玻璃窗看真实的世界,而不是在看屏幕上以数学方式生成的各种形状。
透视
透视是那种听起来相当专业的词汇之一,但它确实描述了人人都见过的一种简单效果。如果您站在一条笔直长路的一侧向远处张望,这条路的两侧在地平线上看起来就像是交汇成了一点。另外,如果路边有树,较远的树木看起来要比离您较近的树木矮。实际上,这些树看起来就像是在路两侧形成的那一点上会聚。场景中的所有物体看起来都像是最终将在远处的一个单点上会聚,这就是透视。透视有许多不同类型,但大多数三维图形使用的是上述的“单点透视”。
在示意图中,那些手是单独存在的,但在大多数场景中,某些物件之前都会有另一些物件,从而部分地遮挡这些物件。对于这些场景而言,软件不仅得计算物件的相对尺寸,而且还必须知道哪个物件挡在前面,以及它挡住了多少其他物件。Z缓冲区算法是计算这些因素的最常用方法。Z缓冲区算法之名来自从屏幕回穿过场景再到地平线的那条轴(或虚线)的通用标记(还可考虑使用另外两条常用轴:衡量场景左右两侧之间距离的X轴和衡量场景上下方之间距离的Y轴)。
Z缓冲区根据包含多边形的物体与场景前端之间的距离来为各个多边形分配一个数字。通常,较小的数字分配给距离屏幕较近的物件,较大的数字分配给距离地平线较近的物件。例如,一个16位的Z缓冲区会将数字32,768分配给距离屏幕最近的物体,而将32,767分配给距离屏幕最远的物体。
在现实世界中,我们的眼睛看不见其他物体之后的物体,因此我们不用去猜想自己应该看到什么。但计算机会不断遇到这个问题,并将以直接的方式来解决问题。每个物体创建出来后,其Z值就会被拿来与拥有相同X值和Y值的其他物体的Z值进行比较。具有最小Z值的物体将被完全渲染,而对于具有较大Z值的物体而言,它与具有较小Z值的物体相交的部分将不被渲染。这样做可确保我们不会看到背景物件透过前景人物,在前景人物中出现。由于物体被完全渲染之前就已采用了Z缓冲区,因此根本无须对隐藏在人物或物体之后的场景部分进行渲染。这就改善了图形的效果。
景深
可成功用于创建三维图形的另一个光学效果就是景深。让我们以路边的树木为例。当树木行列变得越来越小时,就会出现另一个有趣的现象。如果看离自己较近的树,较远的树似乎就变模糊了。当您看有树的照片或电影时,这种现象特别明显。电影导演和计算机动画师利用这种景深效果来达成两个目的。第一个目的是增强所见场景中的纵深错觉。计算机完全可以保证场景中的每个物件不论距离远近都完全清晰。但因为我们习惯于看到景深效果,所以如果无视距离远近,一律确保物件清晰就会让人觉得不寻常,并将妨碍产生所见的是真实场景这个错觉。
导演采用景深效果的第二个原因就是要将人们的注意力集中到他们认为最重要的物件或演员身上。例如,一方面,为了将注意力集中到影片的女主角身上,导演可能会采用“浅景深”效果。采用这种效果时,只有演员清晰可见;另一方面,如果场景旨在让观众对壮观的自然景象产生深刻印象,那么就可能采用“深景深”,使场景尽量清晰,引人注目。
抗锯齿
另一种欺骗人们双眼的技巧就是抗锯齿效果。数字图形系统非常擅长于创建贯穿屏幕上下或左右的直线。但如果遇到曲线或对角线(这种类型的线条在现实世界中随处可见),计算机就可能生成像楼梯一样的线条,而不能生成圆滑流畅的线条。为欺骗观众的眼睛,让他们相信自己看到的是圆滑的曲线或线条,计算机将把线条颜色的渐变阴影添加到线条周围的像素上。这些“灰显”的像素会欺骗观众的眼睛,让他们相信锯齿状楼梯已经消失。添加其他有颜色像素以欺骗眼睛的过程就叫做抗锯齿,它是区分计算机生成的三维图形和手工绘制三维图形的技巧之一。跟踪穿过颜色区域的各种线条,并添加适量的“抗锯齿”颜色,是计算机在显示器上创建三维动画时要执行的另一项复杂任务。
如果紧挨着直线中的像素开始为图像上色,就会出现锯齿状“楼梯”,这是物体由计算机生成的显著标志。
在图像线条周围画一些灰色的像素,即“模糊”线条,可最大限度地减少锯齿感,使物体看起来更加真实。