3D图形芯片

  3D芯片的处理对象是多边形表示的物体。用多边形表示物体有两个优点:首先是直接(尽管繁琐),多边形表示的物体其表面的分段线性特征除轮廓外可以通过明暗处理(shading)技术消除;其次是仅存储多边形顶点的几何信息,多边形内部每个象素的明暗颜色计算所需的信息由这些顶点信息插值而来,这正是易于用图形硬件支持的快速明暗处理技术。

功能解析

  一个典型的3D 芯片具有如下功能特征:

  1)3D芯片的处理对象为屏幕空间的三角形或上边平行于扫描线的四边形。

  2)象素采样算法可选择精确的点采样(24位寻址空间)或象素区域随机/平均采样。如每个象素区域可有16个随机/平均分布的采样点和多达4个的面片。

  3)支持的象素操作包括等亮度明暗处理(flat shading);Gouraud明暗处理;Z-Buffer算法;用于透明效果等的alpha混合;纹理映射及其透视矫正;每象素可选择1个、4个(双线性插值混合)、8个(三线性插值混合)采样点的密集纹理采样;支持MIP-mapping纹理映射方法;支持多种混合模式的纹理光照效果;支持A-Buffer反走样算法。

  4)可以实现芯片一级的并行操作。例如在一种隔行扫描的体系结构中可有多达32个3D芯片对同一组处理对象进行并行操作。要做到这一点芯片就必须设计成可伸缩的体系结构。

  5)应提供与工作环境交互的丰富而强大的接口。它们包括用于传输处理对象数据的接口,芯片内部微处理器与外部的接口,象素缓存接口,纹理接口等。由于存储器技术,特别是面向图形应用的存储器技术在不断取得进步,因而3D芯片的接口设计必须有利于不断采用新出现的存储器技术。特别是颜色、深度、纹理存储器的接口,应在它们的访问协议相互独立的前提下,为每一个系统的特殊需求建立专用和优化的存储器系统。例如SGRAM(同步图形RAM)先进的块写特征适合深度存储器的清“0”操作,而新的WRAM(窗口RAM)的先进的Bit-BLT功能和块写功能非常有利于颜色存储器的设计。因而这些接口必须面向一类情况设计成可编程的。这样无须对芯片的设计作更改就可及时采用新的存储器技术。

  6)具备调试和测试诊断功能。这些功能为3D芯片的应用开发提供手段。

  上述功能具体到某个芯片时会有一些出入和不同的表述方式。而且新功能和新算法还在不断研究发展并及时反映到产品上。

体系架构

  1.一个简单的3D芯片

  与其它多边形相比,三角形是最简单的平面多边形。沿着扫描线方向一个屏幕空间三角形内部各点颜色(r,g,b)和深度(z)的变化是线性的,即相临象素点的这些值仅相差一个固定的常数。这样就使得三角形的明暗计算非常适合于硬件实现。而其他多边形都可以通过预处理分解成三角形,因而三角形是一种最合适的图形处理基元。我们首先以一个仅完成Gouraud明暗计算功能的芯片为例,解释3D芯片的基本体系结构。一个三角形的明暗计算可分为三个步骤:初始化;沿着三角形边的插值计算;沿着三角形内扫描线段(span)的插值计算。

  (1)初始化

  经过几何处理阶段之后三角形被变换到了屏幕坐标空间,这时三角形由其三个顶点的(x,y,z)坐标及顶点的颜色(r,g,b)来定义,其中坐标z就是所谓的深度值。假设屏幕空间的原点在屏幕的左上角,则y坐标最小的顶点称为三角形的顶点,y坐标的顶点为三角形的底点,另一顶点为中点。连接顶点和底点的边为三角形的长边,连接顶点和中点的边为短边,连接中点和底点的边为其它边。三角形的这些数据必须转换成适于做Gouraud明暗计算的数据格式。为了以后在芯片上增加对纹理映射和透明效果的支持,就必须实现精确的点采样。另外在边的插值中应保证没有象素被遗漏或重画。要满足这些要求,三角形的数据就必须转换成包含以下成分的数据结构:

  顶点的坐标数据x,y;颜色数据r,g,b; 深度数据z 。沿长边y坐标增加方向的坐标变化量de.x, de.y;颜色变化量de.r, de.g ,de.b ;深度变化量de.z 。在三角形内沿扫描线从长边到短边(包括其它边)的坐标变化量ds.x,ds.y ;颜色变化量ds.r, ds.g,ds.b;深度变化量ds.z。中点y坐标,底点y坐标。沿短边和其它边的y坐标增加方向的x坐标变化量dx1,dx2。

  其坐标空间的数据定义如图1 所示。颜色空间和深度空间的数据也可比照该图理解。以上数据可以很容易地从三角形的初始定义数据得到。这一初始化过程既可以放在几何处理阶段,也可以放在3D芯片的前端作为一个独立的数据准备阶段,又可以放在3D芯片之上。

  具体实现时插值计算总是从三角形的长边开始,这时沿三角形内部扫描段的插值计算既可能沿x轴(扫描线)的正向进行,也可能沿x轴的负向进行。在这一实现方案中仅考虑象素中心处的插值计算,为保证速度和精度,所有数据分为整数部分和小数部分存储。

  (2)沿着三角形边的插值

  通过以上数据就可以分别求出三角形的长边和短边(或其它边)与扫描线的交点坐标,交点处的颜色值和深度值。如三角形长边与与它相交的条扫描线的交点坐标为(x+de.x,y+(de.y=1)),短边与条相交的扫描线的交点坐标为(x+dx1,y+1),这两点定义了三角形内的一条扫描线段。长边与条扫描线交点处的颜色为(r+ de.r ,g+de.g,b+de.b),深度为(z+ de.z )。类似地可以得到所有三角形内扫描线段两端点处的相关信息。

  (3)沿三角形内扫描线段的插值计算

  得到三角形内扫描线段两端点处的坐标之后,就可以用其控制三角形内颜色和深度的插值计算。这一计算过程总是从三角形的长边向短边方向进行,因而插值增量可正可负。三角形内扫描线段上各象素的颜色和深度值,在得到长边上端点处的初始值之后通过简单的累加沿扫描线段的变化量就可以得到。这时恒有ds.y=0,ds.x=1或-1。

  (4)体系结构

  至此,一个不包括初始化阶段的最简单的3D芯片的体系结构可设计如图 2 所示。

  该芯片与几何处理部分的接口是一个先进先出缓冲存储器,它以一个三角形为单位用上文所述的适于明暗计算的数据结构存储三角形数据。缓冲存储器的大小应使几何处理和光栅化处理的性能尽量达到匹配。三角形处理控制器控制整个三角形的明暗着色计算过程。它控制三角形寄存器每次从三角形缓冲器中取出一个三角形的数据,然后锁定,再启动轮廓部件和插值部件开始沿着三角形的长边和三角形内的扫描线段进行插值。所有插值部件之间都是并行处理的。轮廓部件辅助三角形控制器完成三角形轮廓上各种数据的计算,决定三角形内扫描段插值何时到达端点,是否需要开始下一个扫描段的计算,何时将轮廓从短边调整为其它边,何时三角形的处理结束需要更换为下一个三角形等。轮廓部件还产生颜色和深度存储器的访问地址,其地址空间取决于屏幕的分辨率。插值得到的颜色值是否要写入帧缓存(颜色缓存)取决于插值得到的同一屏幕地址的当前深度值与已存储在该位置的深度值的比较结果,如果新得到的深度值离视点更近,则容许新的颜色值覆盖旧值,否则插值计算结果被丢弃。以上处理过程将对每个需处理的三角形重复一遍。帧缓存的访问控制逻辑以及Z-Buffer的实现逻辑既可以做在3D芯片上,也可以用独立的模块加以实现。无论采用哪种方案,都应以有利于及时应用更新的存储器技术为目标。

  2.典型3D芯片的体系结构

  有了上一节的基础,就可以理解实现了本文第二部分所罗列的功能特征的更加复杂的3D芯片。

  层次控制部件由一组相互作用的时序机实现。所有数据处理部件设计成并行的具有不同长度的流水线,使用移位寄存器实现流水线之间的同步,从而使不同长度流水线的数据能够在同一时钟周期到达所要求的汇合点。当不能在一个时钟周期内以流水线方式完成对外部接口的访问时,部分流水线或整个流水线将暂停。为减少象素缓存较长的操作周期对系统性能的影响,在象素缓存接口中对象素缓存字的不同逻辑部分设置有FIFO先进先出存储器。下面就芯片各部分的详细功能分别进行剖析。

  (1)控制结构

  对3D芯片的控制和初始化是通过微处理控制器接口进行的。在正常操作开始之前,应先通过该接口加载用于控制操作方式的内部状态寄存器和用于查表计算的几个RAM存储表。可通过该接口提供的数据线和地址线直接访问芯片上一些重要的控制和状态寄存器以及存储统计信息的寄存器。这些统计数据对于判别实时模拟系统中视景子系统的过载情况很有用。芯片中的时序机以地址/数据寄存器逻辑方式控制芯片中所有其它存储位置及存储器接口的访问,时序机自动完成地址的增量操作和数据的格式转换。3D芯片还可以以调试模式运行,在外部控制器的控制下芯片可以以每次一个象素、一个扫描段、一个三角形等运行方式工作。

  几何接口的控制部分控制FIFO存储器向3D芯片加载数据。在单芯片模式下,芯片的工作状态取决于FIFO中是否有可用数据及其下一级流水线的工作状态。在多个3D芯片协同工作的模式下,主控芯片的几何控制部分监测所有从属芯片是否已可接受新的几何数据。

  三角形控制部分完成处理一个三角形所要求的所有控制。它最主要的任务是从几何接口的初始数据建立寄存器中向内部工作寄存器读取三角形处理所需的数据。在上一个三角形的一个扫描段仍在处理的时候,下一个三角形的有关数据就可以开始独立加载,使流水线开始准备新三角形的处理。三角形控制还启动分割过程,以决定当前扫描段是在三角形的哪一部分。扫描段初始化过程为扫描段控制产生开始数据。扫描段控制的主要任务是产生实际象素的x地址,标识那些在某些条件下已无需作进一步处理的象素数据,防止不必要的性能损失。几何部件必须保证三角形的处理不重叠,从而避免数据的不一致。

  在所有流水线部件中没有被立即使用的中间结果和参数都存储在扫描段数据移位寄存器中。如果使用DRAM作象素缓存FIFO,其刷新周期将导致流水线暂停;在进行象素区域采样时如果访问扩展缓存也会导致流水线暂停;如果需要多次访问纹理缓存(如三线性滤波时),或由于纹理缓存刷新而未准备好,则与纹理映射无关的其它流水线部分一个时钟周期一个时钟周期地进行等待。

  (2)几何接口

  几何接口存储从外部FIFO存储器读入的数据,这些数据是具有不同类型的数据组。在几何接口和处理部件中对参数进行了缓冲,因而初始化和处理可以并行进行。如果要进行A-Buffer反走样操作,顶点的x , y地址还需加上从查表得到的伪统计子象素偏量。

  (3)光栅化处理部件

  光栅化处理部件确定三角形内象素的地址,它可以工作在点采样模式和区域采样模式下。三角形光栅化沿着扫描线坐标上升的顺序从上到下进行,总是从具有最小y值的顶点开始,y坐标差值的边为主动边并决定扫描段插值的方向。扫描段初始化部件通过递增边的斜率来确定扫描段的起点和终点坐标。在点采样模式下,仅考虑其中心位于三角形几何边界之内的象素。对位于三角形边界或共享边上的象素仅处理一次。这既可以防止在alpha混合期间发生错误,还可以减少对帧缓存的访问次数。在区域采样模式下情况将复杂的多。为避免图形走样,所有仅被三角形部分覆盖的象素都必须做更细致的处理。必须确定它们被三角形所覆盖的区域。采用精确的算法其计算代价太大。通常采用近似的方法,如在一个象素内定义16个随机分布的采样点,并测试那些采样点被三角形所覆盖。

  在区域采样时,柔性查表部件(FUP部件)分析将要处理的扫描段类型,根据扫描段包含顶点的多少(一个、两个或没有)可以将其分为七个不同的类型。这些信息连同扫描段的插值方向以及边的斜率的符号决定象素内实际的采样点。采样点的坐标传送给r、g、b、alpha、z产生器以计算该点相应的颜色、alpha及深度值。FUP部件可以处理多达150多种不同的情况,它的绝大部分功能以查表实现,共有8张表。这种实现方式使算法保持了某种程度的灵活性(柔性)。求交部件决定象素边界与正被处理的三角形边之间的交点,其公式和参数由FUP部件确定并传送给求交部件。交点的x , y坐标的小数部分分别被截断为3个二进制位,将其连接成6位去查一个包含64个16位掩模字的表,掩模字中每一位的位置决定相应的采样点是否被覆盖。根据扫描段的处理方向和边的斜率的符号,掩模字中的位有时必须求反以获得所覆盖的采样点。当一个象素中有几条边经过时,将为每条边产生的掩模通过逻辑“与”运算得到最终的该象素的掩模。由于三角形边上象素的存在,相邻象素之间的距离在区域采样时并不总是等于1,这时简单的给r、g、b、alpha、z累加固定的变化量就会产生错误。当扫描段的起点和终点不在象素中心时就需要用乘法操作求得较精确的位置。为使这些值的计算能采用一致的公式从而简化设计,可选择平面方程这一通用形式。这样r、g、b、alpha产生器将具有相同的流水线结构。z产生器则稍有不同,它的数据宽度更大,需处理的情况更复杂。

  在光栅化过程中,颜色或纹理地址的线性插值会引起透视失真。一种解决方法是将三角形细分成更小的三角形,但这会加重几何处理的负担。纹理映射是以适中的几何处理代价得到非常自然的物体外观,小的三角形会使纹理映射的这一优点大打折扣。为避免上述情况,就应实现真正的透视纹理映射(或称纹理的透视矫正),这需要为每个象素做一次除法。除法操作是用乘以z倒数部件所产生的倒数值来实现的。z值在进入求倒部件时要求规格化的浮点表示,这一浮点表示也同时传送给LOD部件,LOD部件用该值决定对应的MIP-map纹理细节层次。

  (4)纹理部件

  纹理部件是3D芯片中最复杂的部分,它由UV产生器、LOD部件、纹理地址部件、纹理缓存接口及纹理混合部件组成。纹理部件要处理的纹理是一个经过预滤波处理的MIP-map纹理图。该图中除了原始分辨率的图像之外还包括较低分辨率的称作细节层次(LOD:Level Of Detail)的滤波图像。在较高分辨率的图像中将相邻四个象素的颜色值相加并做平均计算就可以得到较低分辨率的一个细节层次的滤波图象。一个1024×1024的原始图象经过如此处理最多可有11个LOD的滤波图像,LOD0 便是原始图像。并不是任何纹理的任何LOD都是有意义的,带有纹理的三角形将在其数据中包含有两个值以指明可用的纹理层次的范围。选择哪一个细节层次的纹理取决于采样点的深度坐标值。使用MIP-map可以避免采样不足而导致的走样现象。观察者和物体在纹理映射环境中的水平或垂直移动会产生失真现象。采用双线性插值混合来代替对纹理的点采样就可以消除这一现象。在双线性插值模式下,与采样点的u,v坐标最近的四个纹理象素按照它们到采样点的距离进行加权求和,其结果调整到颜色的表示范围后赋给该象素,这四个最近的纹理象素选自与采样点最近的细节层次。当逐渐接近场景时,细节层次间的切换会明显的感觉到。可用三线性插值混合来消除这一现象,具体来说就是在距采样点最近的两个细节层次中分别进行双线性混合,其结果再根据采样点的深度坐标加权混合。上面计算中用到的权值是预先计算好之后存放在一张表中,计算时通过查表直接获得权值。UV部件使用实际采样点的x,y坐标、z的倒数值及预计算的一组参数产生用于纹理映射的u ,v值。LOD部件在点采样和双线性插值混合时确定离采样点最近的细节层次滤波图象;在三线性插值时确定包围采样点的两个细节层次滤波纹理。纹理地址部件根据u,v 值、当前LOD、纹理颜色深度、纹理寻址空间等确定访问纹理存储器的物理地址。

  纹理缓存接口有两组独立的数据总线和地址总线,其外接存储器的组织应满足一次访问可以读出任意四个相邻的32位纹理象素。选择不同的外接存储器,如DRAM、SRAM等会有不同的访问速度。DRAM由于有刷新周期而存在等待状态,SRAM则无等待状态,可减少由于存储器访问而导致的流水线暂停。随应用纹理的目的不同,可选择颜色(r,g,b)、光强(I)、或alpha值作为纹理。根据选择的纹理格式,纹理混合部件中的多路选择器将纹理字的各组成部分连接到相应的计算部件,各成分的计算并行进行并按双线性或三线性插值要求进行混合计算。

  (5)融合部件

  融合部件将r、g、b、alpha产生器流水线的结果同纹理流水线的结果结合在一起从而产生纹理映射表面的光照效果。也可以用三角形数据中的第二组颜色数据进行融合处理以产生淡入淡出效果。

  (6)象素缓存接口

  象素缓存是线性编址的,其字的宽度为80位,并由两个逻辑部分组成,一个真正的象素缓存和一个扩展缓存。在点采样模式下,象素缓存的每个地址存储了与象素有关的所有数据,它们包括颜色、alpha、深度及一些状态信息。在区域采样模式下,r、g、b、alpha分别被扩展4位以存储累加的中间值,另外还要存储16位象素区域掩模,还要为每个象素在动态寻址的扩展缓存中存储最多达四个的小数部分,这些小数部分是相关地址值的小数部分,用于与掩模和混合有关的计算。象素缓存接口从三个FIFO中读取数据:个FIFO仅包含完整的象素信息和个小数部分信息;第二个FIFO包含其余的小数信息及相关指针;第三个FIFO由独立的奇、偶地址存储块组成,包含扩展缓存的数据。

技术现状

  图形硬件的研究历史可以划分为两个阶段。八十年代以前主要在军事领域研究发展,其应用目标是各类军用运输工具仿真模拟器的视景生成系统。八十年代早期,斯坦福大学教授Jim Clark产生了用专用集成电路技术实现3D图形绘制处理器的设想,然后与其学生创立了SGI公司,并於1984年开发出了世界上个通用图形工作站IRIS 1400(可称为代高端通用图形系统)。第二代高端通用图形工作站的功能特征包括三角形的Gouraud明暗处理、Phong光照模型和硬件Z-Buffer算法。图象的真实感显着改善,几何变换及扫描转换性能大幅提高。代表性产品有HP公司的SRX和SGI 公司的GT系统,GT系统是个突破每秒10万个三角形的系统。第三代出现于1992年下半年,代表产品是SGI的Reality Engine。它增加了纹理映射及全屏幕反走样,为通用图形工作站用于户外视景模拟打开了大门。虽然SGI新的Infinite Reality在性能上比之于Reality Engine 有了很大的改进,但其基础依然是绘制纹理反走样的多边形。美国北卡大学研究的PixelFlow系统于去年发表了样机,它得到了HP公司的支持,是个对明暗处理语言提供实时支持的系统,但其硬件功能尚未超出第三代的范围。

  即使是最快的可生成高质量图象的工作站如Infinite Reality图形加速系统仍是基于Gouraud明暗处理结合普通的纹理技术。作为通向更高真实感图形的重要一步,实时Phong明暗处理(Phong Shading )以及凸凹纹理(Bump-mapping)是硬件目前研究的一个重点。已提出了许多Phong 明暗处理及凸凹纹理的硬件实现方案,但尚未取得突破。改进的环境映照、反射映照及更复杂的反射模型也是目前的一个研究重点,预计不久将出现在新推出的硬件当中。

  当前PC图形正将上述第二代功能以低价推向市场,某些加速芯片和加速卡还提供一些第三代的功能特征。PC图形仍将继续继承由高端工作站所开创的新功能。由于绝大多数PC图形的解决方案是围绕一个ASIC芯片来设计,因而它与半导体技术的发展紧密相关。

算法原理分析

  一、3D物体的表示法

  具有复杂外形的物体其表面可以由多边形面片来近似表示。以图1的圆柱为例,其柱面可以由2N个三角形近似,其两端可以由两个N边形来近似。多边形模型在其轮廓上的分段线性特征是这一表示法主要的视觉缺陷,改进的途径是增加多边形的分辨率。对于一个复杂形体来说,为了充分表示其细节,常常要用到十万个以上的多边形。这将耗费许多数据库访问时间和绘制时间。当将多边形模型进行放大处理时,会产生连接问题。这就是所谓的“几何走样”。物体的多边形表示既可以通过交互设计人工提取,也可以通过激光扫描设备得到。总之,多边形表示的物体并不特别适合于交互操作或做自由的形状改变。当改变物体的形状时很难保证多边形表示的完整性得到保持。

  对多边形明暗着色所需要的信息存储在一个分层的数据结构中,每一个物体表面由指向多边形表的指针定义,该多边形表包含了近似该表面的一组多边形,每一个多边形由指向顶点表的指针定义,顶点表包含了每个多边形的所有顶点。具体来说需要为每个多边形存储以下信息:

  1)多边形的顶点表,每一个顶点是一个三维坐标,该坐标定义在创建该物体时的局部坐标系中。

  2)顶点的法向量表,这是明暗处理算法所要求的信息。向量由同一局部坐标系中的三分量表示。

  3)多边形的法向量,它是包含该多边形的平面的真正的几何法向量。这是背面删除操作所需要的信息。

  绘制多边形物体的传统方法是将多边形作为独立的绘制实体,这样多边形之间的共享边就要被处理两次。为避免这种情况,可采用基于边的绘制方法,这时多边形的表示是基于多边形的边而不是多边形本身。基于边的方法意味着绘制过程的组织要采用基于扫描线的算法,基于扫描线的算法将同时处理与当前扫描线相交的所有多边形。这时存储器中能存储的可被同时处理的多边形的数目将成为可绘制的场景复杂度的上限。使用全屏Z-buffer并将扫描线算法局限在物体所包含的多边形上就可以解决这一问题。

  二、坐标系统

  绘制过程的几何处理部分可被看成应用一系列的坐标变换将物体数据库变换到一系列的坐标系下,这些坐标系对所有绘制系统都是公用的,是理解3D图形学的基础。用计算机生成图象的一系列基本操作与绘制过程要经历的一系列空间即坐标系有关。随着绘制过程的进行处理将从一个空间进入下一个空间。已完整地建立起描述这些变换的方法。在对物体实施变换时希望对顶点和顶点的法向量使用相同的变换矩阵。事实上,当变换在所有方向并不相同时,顶点法向量必须采用不同的变换矩阵。由于单位法向量经过变换之后其长度不一定仍保持不变,因而必须对其进行重新单位化处理(单位法向量是光照计算所要求的)。

  1.局部坐标系(局部空间)

  为了建模和进行局部变换的方便可选择被建模物体之内或附近的某一点作为局部坐标系的原点。例如可选择一个立方体的某一顶点作为坐标原点,三个坐标轴即是与该顶点相连的立方体的三条边。在局部坐标系选定之后,物体各顶点的局部坐标以及相对于该局部坐标系的各顶点的法向量和物体上多边形的法向量就可以被提取并存储起来。

  2.世界坐标系(世界空间)

  当每一个物体在其局部坐标系中被建立起来之后,就需要将其放置到将要绘制的场景之中。组成场景的每个物体都有自己独立的局部坐标系。整个场景的坐标系就是所谓的世界坐标系。场景中的所有物体都必须从自己的局部坐标系中变换到世界坐标系中以定义场景中物体之间的空间相对关系。如果一个物体在场景中被定义为运动的,则必须为该物体定义一个随时间变化的变换序列以便在每一帧将该物体变换到世界坐标系中的不同位置。场景中的光源也在世界坐标系中定义。如果光照计算是在世界空间中进行,则对物体法向量的变换到此为止。对物体表面属性如纹理、颜色等的定义和调整也在世界空间中进行。

  3.眼睛坐标系、相机坐标系或观察坐标系(眼睛空间)

  眼睛坐标系统是用来建立对世界空间进行观察时的观察参数和观察范围的。在图形学中通常用假想的相机来辅助对观察系统的理解。一个假想的相机可以以任意方向放置在世界空间的任何位置,胶片平面在图形学中就是观察平面,也就是场景将投影到其上的平面。建立一个普遍适用的观察空间相当繁琐,在多数情况下是对眼睛坐标空间做许多限制。一个最小的实用系统可以这样建立,首先要求眼睛坐标系的原点和投影中心是世界坐标系中的同一个坐标点;其次要求观察平面的法向量和观察方向在眼睛空间中与Z坐标轴重合;,观察方向必须是这样的,当相机朝着Z轴的正向时Z值的增加将远离眼睛的位置,同时在左手坐标系的前提下,X轴指向右,Y轴向上。满足这一要求的系统就可以使假想的相机以任何观察方向放置在世界坐标空间中的任何位置。图2 是有关坐标系之间的关系。

  眼睛坐标系是最适宜做背面删除的空间。背面删除操作是将背对观察者的多边形全部剔除,在场景中这些多边形对于观察者来说是不可见的。如果对一个凸物体做背面删除,则可以完全解决其隐藏面问题。对于具有凹面的物体而言这一操作并不能解决隐藏面问题。背面删除操作是通过计算多边形所在平面的法向量与视线向量之间的夹角来决定该平面是否可见。如果这两个向量的点积大于0,意味着其夹角小于90o 即该多边形是可见的,否则为不可见。视线向量是从多边形指向视点的向量。多边形平面的法向量可通过其不共线的三个顶点计算而得。多边形的法向量必须指向物体的外部,为保证这一点,多边形的顶点必须以反时针方向(从多边形外部看时)顺序存储。如图3所示。

  4.屏幕坐标系(屏幕空间)

  屏幕空间是比较难于靠直觉理解的一种空间概念。它是描述如何观察场景的方法的过程,与透视几何有关,也可以理解为怎样定义场景中能够到达眼睛(或相机)的光线的过程。将场景中的一个点投影到距离视点为D的观察平面或屏幕要用到的基本变换是透视变换,屏幕或观察平面的法向与观察方向一致。从图4可以看到,运用相似三角形原理,点P在屏幕上的投影P’(Xs= Dxe/Ze, ys=Dye/Ze)。屏幕与观察平面略有不同,屏幕是观察平面上的一块矩形区域,在经过一个与设备有关的变换之后,可以从观察平面坐标求得屏幕坐标。屏幕空间的定义使得其只对一个封闭空间中所包围的场景进行绘制处理,这个封闭的空间称作视锥台。它可以这样来描述:设想在距离视点D处的观察平面上有一尺寸为2h的正方形窗口,且该窗口关于观察方向是对称的,则平面

  xe=±hze/D  ye=±hze/D

  ze=D  ze=F

  将构成一个封闭的锥台。其中xe、ye 、ze是指眼睛坐标系中的坐标,而平面ze=D和平面ze=F分别称作近处和远处的裁剪平面,它们垂直于观察方向,在此我们假设观察平面与近处的裁剪平面重合。如图4所示。对于透视投影而言,通过连接窗口角与投影中心就形成所谓的视锥体。

  有了这个视锥体,就可以用它对已变换到眼睛坐标系下的场景进行选择。这不外有三种情况,对于那些完全落在视椎台之内的物体,直接通过透视变换将其变换到屏幕坐标系下;对于那些完全落在视椎台之外的物体不作进一步的处理而直接抛弃;对于那些与视椎台的面相交的物体则应作裁剪处理,裁取其位于锥台内的部分并用透视变换将它们变换到屏幕坐标系下。在屏幕坐标系下,Z坐标将作为判断物体面之间相互遮挡的判据。

  注意,场景中的每个物体的每个三角形都要经过以上处理过程。

  三、象素处理

  经过以上一系列的变换之后,一个多边形已变换到屏幕坐标系下。将一个屏幕多边形在屏幕上绘制出来就是多边形的象素处理过程,它包括光栅化、隐藏面消除、明暗处理。光栅化、隐藏面消除、明暗处理是整个3D图形生成过程中最内层的处理。他们是三个二维插值过程。光栅化是用屏幕空间三角形的顶点坐标插值,以求得三角形的边所截取的三角形内扫描线段的端点坐标,并进而求得所截扫描线段上的象素坐标。隐藏面消除则是通过对屏幕空间三角形顶点的深度值(Z坐标)进行插值,从而获得三角形内扫描线段上每个象素的深度值。明暗处理是用同样的方法由顶点光强求得三角形内扫描段上每个象素的光强。这三种处理的算法具有相同的数学表示形式,只需将坐标、深度或光强代入该方程就可以得到相应的结果。总之,场景的绘制过程可概括为:

  对场景中的每个物体的每个多边形做几何变换将其变换到屏幕空间;

  对多边形内的每一个扫描段求出其端点及其上每个象素的坐标;

  对扫描段上的每个象素做隐藏面消除处理及明暗处理。

  1.光栅化

  光栅化处理通过插值求得三角形内扫描段的x坐标的起点和终点。问题是何处是终点和起点?当使用实数坐标时在象素之内的何处进行采样,屏幕坐标是取整数还是保留小数精度?这些问题如果处理得不好,就会在多边形之间产生孔洞,产生重叠的多边形,这会在透明效果处理时产生严重问题。如果反走样处理不精确,则会在带有纹理的表面上产生纹理不连续现象。例如,如果对屏幕坐标取整,则屏幕多边形的顶点将延伸或缩回到离它最近的象素,这样多边形的大小将发生微小的变化,而且不能用密集采样进行反走样处理,动画中的“颤抖”现象便是由此而引起的。在象素内何处采样并不重要,重要的是对象素采样的处理必须一致。

  2.隐藏面消除

  全屏幕Z-Buffer(深度缓存器)算法已成为图形学事实上的标准隐藏面消除算法,他虽然简单但存储要求很高。Z-Buffer算法可看作是工作在三维屏幕空间。每一个象素有一个二维屏幕空间坐标( xs , ys )和由眼睛空间顶点的深度值插值而得到的z深度值。深度缓存器开始时被初始化为远处裁剪平面的深度,对每一个象素比较其插值得到的深度值与已存储在深度缓存中( xs , ys )处的值,如果该值小于存储值,则新计算的象素更靠近观察者。这时新计算的象素的明暗处理值将覆盖帧缓存中的旧值,深度存储器中的值也换成新计算的值。深度缓存器算法对场景数据库组织及场景复杂性没有限制。在处理复杂场景或物体时,应保证足够的深度精度。

  3.明暗处理

  首先计算多边形顶点的明暗参数,然后在多边形平面上进行插值。这样绘制出的物体不但具有很强的三维立体感,而且消除了用于近似曲面的多边形之间的公用边所形成的不连续特征。实现这一处理方式的算法有两种,一种称作Gouraud明暗处理,一种称作Phong明暗处理(均以发明者的名字命名)。这也是基于多边形的绘制日益受欢迎的一个重要原因。Gouraud明暗处理的速度快,但不能产生精确的高光效果,通常用在对速度要求高的场合,如飞行模拟、交互式CAD应用等。Phong明暗处理可以生成高质量的图像,但将耗费庞大的硬件资源。Gouraud明暗处理仅在多边形的顶点使用局部反射光照模型计算光强,然后使用顶点处的光强通过插值求出多边形内各象素的光强值。而Phong明暗处理则对顶点的法向量进行插值,并对多边形内的每一个象素用局部反射光照模型计算其光强。一般说来,多边形顶点的光强是顶点的法向量相对于光源和视点的方向的函数,这就是所谓的局部反射光照模型。顶点的法向量用来近似原物体表面在该点处的法向量,通过平均公用该顶点的所有多边形的法向量求得。

  Gouraud明暗处理仅与局部光照模型中的漫反射分量一起使用,这是因为当高光点完全落在多边形之内时,其对多边形顶点处没有任何影响。该方法是目前3D图形硬件都支持的的明暗处理方法。

  4.特殊效果

  纹理映射、透明以及雾化(大气效应)等真实感效果都是在象素处理阶段实现的。物体表面纹理的定义是在世界坐标系中进行的,通过预处理,每个带有纹理的多边形在其顶点数据中建立了与相应纹理图的映射关系。在绘制带有纹理的多边形时,其相应的纹理图也同时被加载到纹理存储器中,在求出物体上象素坐标的同时其相应的纹理坐标也被计算出来。用该纹理坐标从纹理存储器中读出相应纹理象素的值,将其与明暗处理的结果进行混合就得到要显示的象素值。雾化(大气效应)则是在计算出的象素值上乘上一个与深度有关的衰减因子。对落在同一屏幕位置的象素点的象素值按其所属物体的透明系数进行加权融合就可以产生透明效果。

发展前景

  1.隐面消除技术

  在3D场景中,又相当多的部分是被遮挡住不可见的,尤其是在飞行模拟和赛车类游戏中,在复杂场景下可达30%之多。假如图形芯片能够判断哪些部分是不需要渲染的,避免渲染这些不可见的部分,在理论上说,我们的显卡可以提升10%到30之多,而且随着场景复杂度的增加,这个数字还会进一步提升。

  2.反锯齿技术

  相信大家都非常清楚,目前的图形芯片是否开反锯齿得分的差距,完全是倍数级别的。虽然众多厂商提出过许多不同的反锯齿算法,但无论效果还是速度都还是无法让我们满意。希望占用极少的资源,提供极好的反锯齿效果的算法能尽早和我们见面。

  3.嵌入式显存

  奔腾和赛扬的差距在哪?不是在主频,而是在二级缓存,几百KB的二级缓存对性能的影响可以说是非常大的。在90年代,曾经有两个厂商投入过图形芯片嵌入式显存的研究,虽然之后都渺无音信,但无疑指明了一个不同的研究方向。或许在将来,图形芯片也将同样嵌入一级、二级显存,而高低端的图形芯片就会以二级嵌入式显存的大小来区分。

  4.多核心技术

  无论是3dfx的VSA架构、ATI的MAXX技术还是XGI的BitFluent技术,都算是相当成熟的多核心技术。在目前来说,多核心技术虽然可以将性能非常简单的提高,但相应的成本和功率的升高实在是让人无法承受。但随着生产工艺提升的难度不断加大,研发新图形芯片的成本不断提升,或许在今后多核心技术相反会成为一个以有限成本大幅提升性能的方案。要知道的图形工作站采用的可都是Savage2000,TNT之类的图形芯片,只是数量比较恐怖。

  5.整合

  究竟能用得上当前图形芯片全部性能的人有多少?相信只是少数,对大部分大部分商务用户和家庭用户而言,目前的图形芯片的发展速度已经远远超过了他们的需要。对于他们来说,整合方案就是的选择:更小的体积,更低的成本,没有噪音,不容易出现故障,Intel图形芯片市场占有率高居不下就是整合的功劳。

相关百科