虚拟世界由此开始 追逐3D世界的脚步

作者:刘泽申 2005-9-17 15:23:00 

返回上一页 声卡收藏图片 显卡收藏图片 影子原创文章 老卡驱动下载 常用工具软件 硬件收藏人物

       十一年前,我们在争论究竟是256色画面好还是16位色彩深度画面好。十一年后的今天,我们争论的是超采样抗锯齿好还是多重采样抗锯齿好。十一年前,我们在争论是否可能实现32位渲染,十一年后,我们争论的是需不需要向64位浮点精度过渡(FP64)。十一年间计算机图形学以惊人的速度向前飞奔,今天3D图形和画面随处可见,你是否还记得第一次看到3D游戏时的感动?你是否知道在这越来越逼真的虚拟世界背后包含了多少智慧和努力?

 
第一页:从显示卡到图形卡,3D世界的雏形

  十年前没有任何人知道什么是图形卡,那时候用来在屏幕上绘制画面的板卡名字叫做显示卡(Display Card或者VGA Card)。但就在1994年的夏天,3Dlabs拿出了划时代的GLINT 300SX图形芯片,从那天开始,能够在屏幕上绘制画面的板卡多了个新名字——图形卡(Graphics Card)。基于3Dlabs GLINT 300SX图形芯片的3Demon SX44/88显卡的诞生首次告诉世人3D虚拟现实世界正在快步向我们走来。

    从现在的眼光看来,3Dlabs的GLINT 300SX的特性非常幼稚——3Dlabs GLINT 300SX仅支持高洛德着色(又称高氏着色,Gouraud shading),深度缓冲(Depth buffering),抗锯齿处理(Anti-aliasing),Alpha混合(Alpha blending)。尽管这片图形卡非常“简单”,但在当时3Demon SX44/SX88图形卡的售价高的惊人。

 
小知识:什么是alpha混合

    3D环境中处理的象素在颜色方面他们拥有4个值——RGBA。即红、绿、蓝、Alpha通道。这样不仅方便处理(每个通道8bit,4个通道是32bit。如果b不包含Alpha通道是24bit,24bit数据对于计算机来说处理起来效率较低)。Alpha通道能够实现象素的透明度变化。而Alpha混合则能在2个物体叠加时重新计算Alpha通道值,使他们的透明度更趋向真实。

 

    随后OpenGL API开始受到广泛的关注,PC的3D进程再次加速。OpenGL是Open Graphics Libery的缩写,它源于SGI公司为其图形工作站开发的IRIS GL ,在跨平台移植过程中发展成为OpenGL。1992年7月SGI发布了OpenGL 1.0版。OpenGL凭借崭新的理念迅速得到了业界的支持(那时候需要3D计算的大部分为科研机构)并成为事实上的标准。OpenGL由成立于 1992 年的OpenGL Architecture Review Board (ARB)组织管理。ARB成员以投票方式产生标准,并制成规范文档 (Specification) 公布,各软硬件厂商据此开发自己系统上的实现。

    OpenGL在设计初期就设计成独立于硬件和操作系统、面对专业图形处理、科学计算等高端应用领域的标准图形库。OpenGL诞生的时候Microsoft尽管也有了Direct3D,但是Direct3D当时是以系统COM接口形式提供的,除了速度梢快于OpenGL之外,一无是处。看看3D游戏界的上帝、Doom、Quake之父、id Software创始人John Carmack对Direct3D的评价你就知道那时Direct3D是多么糟糕:

(3D游戏界的上帝 John Carmack)

    Direct-3D IM is a horribly broken API. It inflicts great pain and suffering on the programmers using it, without returning any significant advantages. I don't think there is ANY market segment that D3D is apropriate for, OpenGL seems to work just fine for everything from quake to softimage. There is no good technical reason for the existance of D3D. ——John Carmack,1996。
 

    随后S3 VIRGE、MATROX Mystique和ATi Rage 3D加入了3D图形卡的混战。VIRGE首次支持Direct3D和DirectDraw,在3D特性和性能方面较为弱。而Rage3D则能支持更多的3D效果。至于MATROX Mystique除了价格昂贵之外在当时竟没有任何明显的缺点。为了抗击“外敌”,3Dlabs又推出的Premedia凭借极强的3D性能和上述3片显卡争夺市场。NVIDIA也在1994年由一群离开SGI的工程师所创建,并于1995年拿出了影响力甚少的NV1芯片。NV1拥有完整的2D/3D的图形显示核心还创造性的在显示芯片内集成了声卡功能和I/O控制器,NVIDIA还满怀希望的为NV1定制了二次材质贴图技术(Quadratic Texture Maps),通过这个技术能够让NV1通过计算多边形曲线而实现3D效果。对比ATi 3D Rage的攻城拔寨,NV1称得上是厄运连连。二次材质贴图技术不仅没有多少厂商支持相应,而且也与Direct3D API不兼容而被抛弃,要不是当时Sega购买了大量NV1装在Sega游戏机上,NVIDIA恐怕早就完蛋了。

 

    3D图形卡群雄混战的日子在1995年11月戛然而止——一家叫做3Dfx的小公司于1995年11月推出了Voodoo 3D加速卡。这片显卡不仅支持所有主流的3D API,还能实现让人眼花缭乱的3D效果,同时Voodoo的象素填充率达到了不可思议的45M Pixels/s!除此之外,3Dfx还成功推广了自己的3D API:GLIDE。GLIDE没有OpenGL那么庞大复杂,也没有MS D3D那么难以开发。结果如你所见,GLIDE迅速得到绝大部分游戏制造商的支持,Voodoo时代来临!昔日辉煌的3dlabs、S3、Matrox在3D世界的旅程也开始进入尾声……

(Diamond Voodoo2)

    为了成就霸业,3Dfx在次年推出了Voodoo2。Voodoo2在当时提出单周期双纹理的概念,在板卡上首次搭载了2个纹理映射单元。这就意味着在一个时钟周期内能获得2倍的填充率。与此同时两片Voodoo2显卡还能通过模拟的SLI连接实现协同工作,达到性能的翻倍!

 
第二页:API的争夺,Voodoo王朝的没落

  GLide尽管风光无限,Voodoo2 SLI组合也不可一世。但是GLIDE也在3D游戏教父John Carmack那碰了钉子。John Carmack只答应提供OpenGL下的3D硬件加速。对于当时的硬件来说要完整支持OpenGL的所有功能基本上是天方夜谈。于是3Dfx做了个MiniGL驱动程序使得Voodoo终于能提供Quake2下的硬件加速,其他厂商也纷纷跟进。

    就在3Dfx一意孤行不可一世的时候,RivaTNT横空出世。TNT是TwiN Texel的意思。所谓TwiN Texel本质上就是2条32bit象素流水线的渲染体系(也就是以前人们说的2X2体系),它可以让TNT显卡在每个时钟周期内并行处理两个像素。这样工作在90MHz的RivaTNT实际填充率能达到 180M Texels/sec。同时Riva TNT还首次拥有24bit Z缓冲(Z-Buffer)。

  与此同时NVIDIA还宣布Riva TNT能够完整支持OpenGL 1.2所有特性!对MS Direct3D的支持也提升到了DirectX 6.0。Riva TNT如一枚重磅炸弹强力的撼动了Voodoo王朝。Riva TNT还首次在桌面平台引入了可用的32bit渲染。不要忘了,Voodoo2仅仅是一片3D卡,还需要额外的2D显卡配合。而Riva TNT却拥有完整的2D+3D内核。搭配16MB显存、AGP接口的Riva TNT在性能上超越了Voodoo2,而价格却较Voodoo2便宜不少。

 

小知识:什么是纹理填充率?

纹理填充率即每秒钟显示芯片/卡能在显示器上画出的点的数量。像素填充率的最大值为3D时钟乘以渲染流水线的数量。上文说到的RivaTNT有2条象素流水线每条象素流水线有1个TMU,因此他的纹理填充率为90MHz X 2Pipeline X 1TMU=180Mega Texels/sec。以最新的Geforce7800 GTX来说,GPU工作在430MHz,而内部有24条流水线,所以他的纹理填充率为10320MT/s。

什么是Z缓冲?

整个3D图形世界中任何一个坐标都会包含x,y,z三个值。在对3D场景进行绘制时候,图形卡需要根据Z坐标轴的大小来确定各个3D对象之间的纵深距离、遮挡情况。Z缓冲(Z-buffering)正是记录、处理3D对象之间纵深关系、遮挡情况的技术。一般来说Z-Buffer所用的位数越高,则生成的3D对象之间的纵深越精确。对于复杂的3D场景来说,只有Z缓冲精度不低于16bit,才能保证最终结果的渲染正确。现代图形芯片已经能提供16bit~32bit的精度。

 

    在NVIDIA开始研发Riva TNT的时候,ATi也开始了他们Rage 128的设计。Rage 128的体系结构和TNT惊人的相似,同样采用了2条象素流水线2个TMU的设计。同时ATi Rage 128还首次针对32bit渲染进行了大量的优化。当时的测试表明,Rage 128的32bit渲染性能对比16bit只有不到5%的下降,将TNT远远抛在了身后。同时,ATi还在Rage 128上内建了MPEG2解码以及动态补偿电路可以流畅的播放DVD。值得一提的是,Rage128对OpenGL的支持达到了空前的程度。可惜这个TNT杀手竟然比NVIDIA Riva TNT晚了整整半年推出,此时的对手早就换成了TNT2。ATi的惨败可想而知。

    Voodoo王朝是NVIDIA Riva TNT2和John Carmack联手埋葬的。作为TNT的进化版NVIDIA Riva TNT2利用0.25微米工艺使得图形芯片速度成功的到达125MHz(Ultra为150MHz)。象素填充率也自然提升到了250M Pixel/s。Voodoo2即便是SLI也难以撼动Riva TNT2的性能领先,其他厂商就更不用说了。与此同时,Riva TNT2配备32MB显存时在Quake2和随后Quake3所表现的性能让Voodoo2彻底折服。在Quake3的硬件加速问题上,John Carmack甚至拒绝提供任何MiniGL加速而要求所有图形卡运行在OpenGL ICD环境下。无论是Voodoo2还是Voodoo3都无法完整支持OpenGL ICD,失去id software的支持就意味着失去所有游戏的支持,Voodoo系列遭遇灭顶之灾。在Riva TNT2上市之后的市场调查中,NVIDIA一度占据80%以上的独立显卡市场份额。

(大势已去的Voodoo3)

(NVIDIA Riva TNT2 32bit下的Quake3 Arena)

 
第三页:光照变幻,新时代到来

  NVIDIA凭借TNT2迅速崛起之后,依然面临3dfx Voodoo5和ATi Rage128的挑战。1998年的8月份NVIDIA推出了Geforce256图形芯片。从这一天起图形处理芯片有了个崭新的名字——GPU(Graphics Processor Unit)。NVIDIA Geforce256的先进性让所有的竞争对手为之惊讶。Geforce256之所以被称作GPU原因就在于Geforce256划时代的在图形芯片内部集成了T&L功能,使得GPU拥有初步的几何处理能力,彻底解决了当时众多游戏瓶颈发生在CPU几何吞吐量不够的瓶颈。

(划时代的Geforce256)

    当然,Geforce256的成功也MS DirectX 7密不可分。真是DirectX 7首次提供的T&L功能让Geforce256的力量能够尽情释放,也让众多的游戏开发者能够迅速的拿出支持T&L的游戏。值得一提的是,Geforce256还是当时首个支持AGP 4X Fast Write接口和DDR显存的图形卡产品。从Geforce256的体系架构来看,这个代号NV10的怪物也强的让人咋舌。Geforce256拥有4条象素流水线,工作在120MHz的Geforce256拥有竞争对手望尘莫及的480MT/s的填充率。

  GPU的诞生绝对是图形卡历史上的又一次革命。那当时在大肆吹捧的T&L究竟是用来做什么的呢?它为什么会有那么惊人的魔力?下面就来和大家一起重温。

    要了解T&L的作用,我们必须从3D世界的构建谈起。在所有程序员和设计师进行各种3D对象设计时,他们使用了和真实世界完全相同的坐标体系(也称作世界坐标)。这样做是为了制作出来的3D图形能够方便的从任意角度观察。但是要将这样的3D世界直接搬到本来就是平面的屏幕上的话,你看到的将会是一堆杂乱无章的色块。为了在屏幕上正确的表现3D对象与对象之间的相互关系和纵深,我们必须将世界坐标转换为能准确展现3D物体纵深关系的另外一种坐标,也就是屏幕坐标,这样的转换我们就叫做Transform(也就是T&L中的T)。

(这张图表示了程序输入GPU中的顶点数据,你可以看到整个汽车是透明无遮挡且杂乱无章的)

    当你在玩3D游戏中这样的转换并不是一劳永逸的。一旦视点转换,所有图形的坐标也必须重新计算以便让你看到3D对象的“前后左右”。同时3D游戏中的角色的移动和地形的每次变化也必须重新计算新的坐标位置。由于整个Transform基本都是浮点运算,因此会极大的消耗CPU这类通用处理器的资源导致整个3D游戏的运行缓慢。而Geforce256拥有专门的逻辑来进行Transform计算,所以效率和速度都远超过CPU。

(从线框图中我们可以看到此时的汽车并没有被计算相互遮挡关系)

    尽管T&L只包含Transform和Lighting这2个单词,但是T&L却要在3D世界构建中干3件事情。许多人以为在变换完成之后接着就是光照计算。事实上在变换完成的同时T&L还需要对3D对象进行遮挡剔除(Clipping)。我们谁都不是透视眼,所以在日常生活中物体总是相互遮挡的,我们只能看到眼前的那个物体,而无法穿透前面那个物体看到在其背后的东西。3D世界同样需要遵循这个原则,在完成坐标转换之后,遮挡剔除系统还要对这些顶点进行对比从而确定哪些顶点不被显示,而那些顶点是必须显示的。通过遮挡剔除计算,上面汽车图形中另外一边的2个轮子顶点将会被标示为不可见,但却依然被渲染。

  T&L这个名词还由另外一个单词组成——Lighting(光照)。在没有重新计算新的坐标之前计算机是不知道如何给各个3D对象赋予光照值的,因为计算机无从知道光是从什么地方射出。在确定了视点和光源方向之后,Lighting将会根据一定的算法给每个生成顶点赋予光线强度的矢量。这些矢量数据能够展现出光线在3D对象上的强弱变化。

(在重新计算顶点坐标和确定遮挡(Clipping)之后,汽车已经初具外形)

    为了贯彻6个月产品升级的诺言,NVIDIA于2000年4月推出了Geforce2 GTS,GeForce2 GTS首次采用了0.18微米制程同时工作频率达200Mhz~250MHz。GeForce2 GTS与上一代比起来最大不同在于NVIDIA增强了Geforce2 T&L引擎的吞吐量,同时让Geforce2的象素流水线在单周期内实现了2次纹理操作,因此Geforce2的纹理填充率达到了惊人的1600MT/s。

  正当人们以为NVIDIA将君临天下的时候,ATi卧薪尝胆多年的Radeon256横空出世!Radeon不仅是第一片非NVIDIA的GPU,还搭载了更强的T&L引擎和功能。在ATi引以为豪的Charisma引擎。除了T&L功能之外,这个几何光照引擎还给我们带来了一些崭新的技术,首当其冲的便是Keyframe Interpolation和Vertex Skinning。

  Keyframe Interpolation实际上是一种关键帧添加技术。关键帧技术事实上是依靠一种算法连续的生成不断变换的顶点。这样程序员只需要告诉GPU某个对象开始时的状态和结束时的状态,中间连续变化的过程则由GPU代劳。这样能节省大量的运算资源。当然关键帧添加技术的应用范围较为有限。

    至于Vertex Skinning技术,也是通过设定顶点实现的“把戏”。在绝大部分3D游戏中都包含动物对象,动物对象在运动的时候是通过对它的骨骼进行控制实现的。这样就会带来一个问题,当运动时2块骨头的连接部分会出现明显的断裂从而极大的影响。通过利用角混合技术,能够彻底解决这样的问题,从而实现动物运动的平滑真实。

 

    至于Vertex Skinning技术,也是通过设定顶点实现的“把戏”。在绝大部分3D游戏中都包含动物对象,动物对象在运动的时候是通过对它的骨骼进行控制实现的。这样就会带来一个问题,当运动时2块骨头的连接部分会出现明显的断裂从而极大的影响。通过利用角混合技术,能够彻底解决这样的问题,从而实现动物运动的平滑真实。

 

小知识:什么是HSR

HSR的全称为Hidden Surface Removal(隐藏面消除)。GPU在渲染和构架两个有互相遮挡在一起的3D物体的时候,一般是分别对这两个物体进行Transform,然后计算他的光源和进行纹理贴图等等。GPU是在最后阶段才对2个相互遮挡的图形进行叠加。这样的运作流程会使得那些被遮挡、我们无法看到的图形部分也消耗运算资源。而HSR的作用则是先行运算出哪些面是可见的,然后直接剔除那些不可见的,从而降低GPU的无效渲染提升性能。

 

    如你所知,减少了无效渲染就意味着性能提升。Hierarchical Z干的就是这个!在完成T&L之后Hierarchical Z将会不断对比各个顶点的Z轴位置,一旦Hierarchical Z发现这个顶点不需要显示,将会直接将他剔除避免后续的资源浪费。尽管Hierarchical Z当时还不够完善,但的确为GPU性能的提升作出了重大贡献。

 

第四页:灵活编程,无穷梦想

  Radeon的出现使得NVIDIA君临天下感觉少了几分。可惜Radeon尽管在几何部分有超越Geforce2 GTS的功力,但是在后面的三角设置引擎方面却吃了大亏。低效的三角设置引擎使得前端几何引擎无论多么高效都无法发挥。Radeon的出现仅仅拖延了Geforce2称霸的脚步而已。随后Microsoft推出了DirectX 8。相对于之前的版本,DX8中首次引入的可编程概念,同时定义了Vertex Shader和Pixel Shader!

(Vertex Shader工作流程)

    还记得之前图形卡标榜的所谓雾化效果之类的各种特效吗?从DirectX 8时代开始你可以彻底将他们扔掉!之前所有的GPU、图形芯片都是固定功能的ASIC(专用逻辑电路)。因此能实现什么样的特效在图形芯片设计的时候就确定了。而程序员即便再有本事也只不过是在游戏中对这些固定功能进行各种排列组合。有了Pixel Shader和Vertex Shader之后,程序员可以自己编写一段代码让GPU执行从而控制几何处理部分和象素处理部分。没错!有了Shader你就能看到无穷的3D效果,而不是以往哪些令人沉闷的一堆。

  要了解什么是Pixel Shader和Vertex Shader,就先让我们来看看一个典型的GPU处理流程图:

    在这个流程图中GPU的功能被分为2大部分分别是几何处理(Geometry Processing)部分和渲染(Rendering)部分,渲染部分也有很多人将他称作象素处理(Pixel Processing)部分。在传统的GPU中是使用固定T&L逻辑(图中紫色部分)对3D图形进行处理的,这样能显著节省晶体管,但却无法由程序员控制。同样在象素处理的纹理贴图、过滤和混合部分在Shader之前也是固定功能的无法进行任何的控制。对于这样的图形芯片3D程序员只能设置一些参数,实际上就是调用IDirect3DDevice::SetRenderState()时做的事,而这样的程序在IDirect3DDevice::DrawPrimitive()中会自动执行。

  DirectX 8中定义的Vertex Shader和Pixel Shader正是代替3D图形中最重要的这2个部分(红色部分)。DirectX 8的要求很简单,就是建立统一的可编程单元以供程序员天马行空。对于3D程序员来说Direct3D 8现在允许你写一段程序替代固定的顶点处理过程和像素处理过程。其中替换顶点处理的就叫Vertex Shader(顶点着色器),替换像素处理的就叫Pixel Shader(象素着色器)。

 

以下是一段非常简单Shader指令集代码

vs_1_1

dcl_position v0

dcl_normal v1,r0, v0.x, c0

mad r2, v0.y, c1, r0

    第一个实践DirectX8可编程特性的是NVIDIA Geforce3 Ti图形卡。这片代号NV15的Geforce3 GPU首次在内部加入了Pixel Shader处理器和Vertex Shader处理器。为了保险起见,Geforce3内部还同时保留了T&L硬连线为老游戏提供最佳的执行效率。nVIDIA把Geforce3 Ti的可编程体系结构称为nfinite FX引擎(这也是CineFX的前身)。GPU发展至此,显存带宽对性能的制约已经非常明显。NVIDIA在Geforce3 Ti上引入了LMA(光速显存架构, Lightspeed Memory Architecture)LMA能够大幅度优化显存带宽利用率提升性能。

   此时ATi已不是昔日的败军之将了。Radeon8500给予了Geforce3 Ti有力的回击!尽管Radeon8500性能稍微落后,但是在内部体系架构上ATi已经开始赶上了NVIDIA。作为同样的DirectX 8显卡Radeon8500在性价比方面有着明显的优势,NVIDIA终于感受到了真正的威胁。

    为了把对手扼杀在摇篮中,半年后被誉为NVIDIA最受欢迎的图形卡Geforce4 Ti问世。新的Geforce4 Ti抛弃了老旧的T&L硬连线,同时把Vertex Shader数量增加到了2个,而Pixel Shader支持也提升到了1.3版。此外,GeForce4 Ti也同时引入了Lighting Memory Architecture Ⅱ LMA Ⅱ(光速显存架构Ⅱ),可以更好地节省显存带宽。而新的Accuview AA技术与配合LMA Ⅱ,也大幅改善Geforce3上被人指责的FSAA的性能。Geforce4风光一时,可惜4个月后突如其来的打击让NVIDIA彻底蒙了……

 
第五页:虚拟现实,由此无限

  2002年Microsoft DirectX 9发布,和之前的所有DirectX不同,DirectX 9的Direct3D9部分所包含的标准和生命力将会远远超过它的前辈。Microsoft在DirectX9中首先就将老旧的T&L单元彻底去掉,代之以更强的Vertex Shader 2.0,此时用于象素处理的Pixel Shader也升级到了2.0版本。这次的Shader Model的升级绝对是飞跃性的。

    Shader Model 2.0在编程灵活性和性能方面远远的抛离了Shader Model 1.0。而笔者认为,Shader Model 2.0最大的进步在于引入了浮点格式。要知道对于以前只能支持整数的GPU来说,在进行一系列的图形操作之后将会产生巨大的误差,从而阻碍了图形效果的进一步发展。与此同时,只能使用整数的GPU也无法在对精度要求较高的DCC类软件中大显身手。到了DirectX 9时代这些限制终于被打破!值得一提的是,DirectX 9标准在制定的时候已经非常具有前瞻性,因此DirectX9的寿命会非常长,或许它需要几代显卡的更迭才能让其显得落后。

    DirectX 9对于图形学另外一个巨大贡献是引入了成熟可用的HLSL(High-Level Shader Language,高级着色语言)。在上面的文章中我们已经谈到,对Vertex Shader和Pixel Shader进行编程,需要使用GPU那类似于汇编那样的指令集体系。这样的指令集尽管能快速准确的“指挥”GPU,但是开发的复杂度和难度相当大。和其他所有计算机语言相同,Shader指令集也正不断向高级发展。Microsoft制定的HLSL便是使用高级语言来进行Shader编程和控制GPU,HLSL从整体上看来非常类似于C/C++语言——这也是游戏设计师们所熟悉的。与对CPU编程最大的不同之处在于HLSL的最小的数据吞吐单元是一个由32位浮点数组成的四元组。这完全符合GPU的高效工作要求,要知道3D世界中无论是颜色(RGBA)还是坐标(XYZW)都是四元组。

一个典型的HLSL语言编写环境

   通过DirectX9中包含的HLSL,游戏设计师完全不需要理会理会寄存器的分配、寄存器读端口限制、并行处理指令等繁琐却要命的硬件细节,从而可以加快游戏的开发速度和质量。HLSL的引入也极大的加速了DirectX9游戏的普及。

  除了微软倡导的HLSL,OpenGL ARB也推出了GLSL来与之抗衡。NVIDIA则更是融合HLSL和GLSL开发出了C for Graphics,简称Cg。从硬件到软件,DirectX9和OpenGL总算是给我们提供了坚实的平台,让我们扩展无限的虚拟空间。

    那谁会第一个推出DirectX 9图形卡?NVIDIA在Geforce4 Ti热卖的时候曾经预计消费者们并不十分迫切需要DirectX9图形卡,而3D游戏制造商也不可能快速拿出DirectX9的游戏,于是放慢了DirectX9图形卡研发的脚步。可惜NVIDIA这次的预测错误了,Geforce4 Ti上市不到半年,NVIDIA的恶梦悄然降临。

    2002年7月17日ATi Radeon9700 PRO图形卡突然问世,作为第一片DirectX9图形卡,Radeon9700PRO的设计产生了绝对的震撼!彻底抛弃T&L之后Radeon9700 PRO配置了4个Vertex Shader,同时象素流水线部分也增加到了8条。与此同时为了满足GPU需求ATi采用了256bit交错显存控制器设计。如此惊人的设计使得Radeon9700 PRO在测试中获得2倍于Geforce4 Ti的性能,同时支持DirectX 9的特性也让ATi在后来占尽风头。

  NVIDIA随后推出了GeforceFX仓促迎战,可惜由于保守的设计理念和在新制程上遇到障碍,NV30仅能通过极高的频率勉强压制Radeon9700 PRO。就在GeforceFX发布后不久,ATi竟然又推出了R300改良版——Radeon9800 PRO。这片显卡通过更高的显存和GPU频率再次打压NVIDIA GeforceFX图形卡,在随后的1年多时间内,NVIDIA遭遇了前所未有的挑战和压制,ATi终于坐上了图形卡市场老大的宝座。

   忍辱负重一年多后NVIDIA的NV40研发完成大量上市,这片叫做Geforce6800 Ultra的图形卡首次支持Shader Model 3.0和内置了16条流水线。你无法从Geforce6800身上找到任何GeforceFX的影子。正如许多分析家指出“Geforce6800和GeforceFX简直不像是一个公司的产品。”NVIDIA在Geforce6800发布时还大力宣称NV40的超标量体系架构,事实上在GPU指令吞吐量测试中NV40的成绩非常显眼。

 

小知识:什么是超标量体系

超标量体系指的是处理器内部集成几条功能和特性完全相同的执行流水线的体系结构,借此提升处理器指令吞吐量和执行效率。 超标量体系结构不清楚指定需要并行处理的指令,而是使用动态指令规划,根据处理器可用的资源,数据依赖性和其他的因素来决定哪些指令要被同时执行。超标量体系结构已经长期用于绝大部分的通用处理器中Pentium、PowerPC、Athlon都是超标量体系CPU。

 

   作为应对,ATi自然也有了Radeon X800系列。可惜Radeon X800系列缺少了Shader Model 3.0支持和对HDR的支持加上较高的频率,最终导致良品率较低无法与Geforce6800系列并驾齐驱。从体系架构上来说R420只是R300架构的纯粹扩大版,缺少必要的创新。

  随着Geforce6800和Radeon X800的大行其道,人们在一夜之间发现几乎人人都在谈论HDR。那些打开HDR功能的游戏画面也一致获得人们的赞叹。HDR是什么?它能干什么?我们可以借此机会深入。

DOOM III HDR

    HDR是High Dynamic Range的缩写,直译过来就是高动态范围的意思。在日常生活中我们经常遇到这样的情况:突然从黑暗的房间中走到阳光下,眼睛会无法睁开;清晨阳光会穿透窗帘像光柱般照射入房间;反光度较高的物体在强光下会在周围产生光晕。以上这些生活中随处可见的现象在有HDR以前无法在3D世界中呈现!最大的原因就在于我们使用8~16bit来表现Alpha通道。16bit的Alpha通道还意味着整个画面从最暗区到最亮区的对比度只有1:65536!根据Dynamic Range=log10(这里的“10”为下标,Max Intensity/MinIntensity)公式我们可以得知即便使用16bit Alpha通道也只能获得4.8(正确标示为48db,下同)的动态范围。而人眼的动态范围大约有9.0。这点动态范围相对于人眼观察到真实现象来说差太远了。

Far Cry HDR

 

    使用8~16bit来表现Alpha通道还有个无法克服的问题在于采用整数对明暗值进行计算,无法表现细微的亮度变化。于是精度更高的用FP16(对应64bit)、FP32(对应128bit)浮点来表示亮度变化的HDR诞生了。通过保留更多的小数位HDR显著的降低了GPU内部的运算精度,同时还能获得极高的动态范围。理论上HDR最高动态范围能达到760db!HDR的引入能够使人们在屏幕上看到更多的亮部和暗部细节。

  目前很多游戏制造商和NVIDIA Geforce6 GPU都采用了由卢卡斯工业光魔(Industrial Light & Magic)公司开发的OpenEXR HDR算法,这样的算法能够让Alpha通道依然保持16bit。但却创造性的是用1个bit来表示光照强度的指数、5个bit来存放指数值而剩下的10bit则都用于存放色度坐标值。这样一来即使是FP16运算精度都能获得9.0的动态范围!

OpenEXR HDR

    HDR计算需要耗费极大的GPU资源,即便是Geforce6800 Ultra也会不堪负重。为了提供更为强悍的性能同时先发制人,NVIDIA在2个月前推出了Geforce7系列GPU。其中拥有24条象素流水线和8个Vertex Shader的Geforce7800 GTX再次让NVIDIA获得失去许久的王者称号。除了流水线的增加,Geforce7800GTX在对HDR的计算和GPGPU的支持方面也更进了一步。

  更强大灵活的可编程能力,更速度和高精度的3D运算是DirectX9时代的终极追求。对比十一年前的3D画面,你将会被图形技术的爆炸性发展所震撼——可这一切才刚开始!

 
第六页:一切只是开端!3D世界的未来

6.1 DirectX 10、DirectX Next前瞻

  当我们沉迷于DirectX 9、OpenGL 2.0营造的光影世界时DirectX 10已经处于紧锣密鼓的研发状态。这个曾经被称作Windows Graphic Foundation 2.0(以下简称WGF2.0) 的图形API对比DirectX 9有了翻天覆地的变化。在WGP 2.0里面,以往固定的渲染模式被统统扔进了垃圾堆,Vertex Shader和Pixel Shader的概念也被MS彻底抛弃。

    在DirectX 10里面提出了Unified Shader Model(统一渲染体系架构)的概念。所谓Unified Shader从API角度来说就是把Vertex Shader和Pixel Shader从原来的固定单元中抽象出来,然后用统一的方法进行管理。对于程序员来说在编写游戏的时候根本不需要分别对Pixel Shader和Vertex Shader进行编程,因为所有的Unified Shader单元都能够根据需要在顶点处理和象素处理间进行切换。

  DirectX 10还废除了2D的DirectDraw概念,然后把它并入Direct3D中从而形成一个更大的子集。这样无论程序是运行在Windows窗口模式下还是运行在全屏幕3D情况下都能实现所有图形卡功能,程序员也不必更多的考虑针对某些部分设计专用代码。这样带来的另外一个好处就是GPU再也不必过多的依赖CPU进行任务分配了,在CPU占用率100%的情况下GPU照样能够自己执行所需要的操作,从而极大的提升性能。最后WGF 2.0中还首次提供了完整的整数指令集以供开发人员适用,完整的整数指令集意味着完整的编程性能,在WGF2.0环境下GPU的可编程灵活性将会向CPU看齐。

  既然在API中定义了Unified Shader Model,那对应的GPU也必须提供Unified Shader Model以供程序实际运行使用。事实上无论是ATi还是NVIDIA甚至是S3都在以最快的速度研制Unified Shader Model的GPU产品。相对于API简单的定义来说,要将GPU的象素处理和顶点处理抽离出原有体系,并且整合为一个执行单元的难度是非常大的。因为2个处理单元分别位于GPU处理流程的不同位置。与此同时使用了Unified Shader Model之后,GPU内部必须保证数量众多的ALU才能使得GPU执行效率不至于太低。复杂众多的ALU必将会导致整个GPU晶体管数量的极大提升,可以预计NVIDIA NV50、ATi R600系列的晶体管数量将会超过4亿!

 
6.2 GPU的Unified Shader体系

  那对于GPU来说Unified Shader Model会带来什么好处?我们今天对于Geforce7800GTX、Radeon X1800习惯了解他有多少条象素流水线、多少个Vertex Shader Processer等。在未来GPU中这些概念都将废除同时代之以ALU。ALU是个完整的图形处理体系,他既能够执行对顶点操作的指令(代替VS),又能够执行对象素操作的指令(代替PS)。GPU内部的那么多ALU甚至能够根据需要随意切换调用,从而极大的提升游戏的表现。

首个US体系的GPU是Xbox360上ATi设计的C1

 

小知识:什么是ALU

它的中文意为算术/逻辑单元(英文为Arithmetic/Logic Unit,ALU)负责处理数据的运算工作,包括算术运算起(如:加、减、乘、除等),逻辑运算(如:AND、OR、NOT..等)及关系运算(比较大小等关系),并将运算的结果存回记忆单元。对于GPU来说,ALU就是能够被编程使用进行图形计算的算术执行单元。

C1的内部体系架构(推测)

    举个例子来说,假设新的GPU内部有32个ALU。那在执行顶点操作众多且复杂应用时可以分配12个ALU做顶点处理,剩下的20个ALU做象素处理。一旦遇到象素操作密集的应用时程序员又可以让30个ALU做象素处理(等效于现在的30条象素流水线),让2个ALU做顶点处理。当然,新一代GPU很可能会包含40个甚是更多的ALU。

 

6.3 GPGPU的惊人潜力

  从以往的DirectX 8到未来的DirectX 10,从IRIS GL到OpenGL 2.0。所有API的进步几乎都是GPU可编程性的进步。我如果告诉你,有人用GPU进行音频处理和算术计算,你会不会觉得我疯掉了?事实上这正是GPU惊人的可编程能力的真实写照。而GPU强悍的处理能力配合不俗的编程能力,GPGPU逐渐成为了热门话题。

  GPGPU全称是General Purpose GPU即通用计算图形处理单元的意思。GPGPU着重于利用GPU的可编程性能让GPU去实现处理3D图形以外的计算应用。在已经公布的众多论文中Geforce6800 GPU已经能够实现音频处理、有限元分析、流体模拟等众多应用。

GPUGem2一书中关于GPGPU的处理流程

    对GPGPU进行深入研究是从2003年开始的,在那年的SIGGRAPH 2003大会上许多业界泰斗级人物发表了关于使用GPU进行各种运算的设想和实验模型。而2003年的SIGGRAPH会议上更是特地安排时间进行GPGPU的研讨交流。GPU恐怖的浮点运算能力和数据流吞吐量使得人们希望用GPU来加速预算,举例来说,一颗主频为3GHz的 Pentium 4处理器的理论计算速度为12GFLOPs/sec,而GeForce 7800GTX的计算能力则达到惊人的165GFLOPs/sec(此数据由NVIDIA提供)。

  在众多GPGPU项目研究中最接近成功的是英国剑桥大学的BionicFx课题组。早在2004年9月份,剑桥大学的BionicFx课题组便宣布在NVIDIA的GeforceFX 5900产品中实现了专业的实时音频处理功能,并且准备进行商业化的运作,对其产品进行销售,给音乐创作者带来实惠。现在,该解决方案命名为“音视频互换技术”(Audio Video EXchange,AVEX)。从BionicFX课题组透露的流程图中我们可以看到BionicFx的工作原理就是把待处理的音频数据转换成图形数据,然后再交由GPU处理,最终把计算完成的图形数据还原为音频。可惜1年过去了,BionicFx课题组依然没能拿出最终可用的AVEX产品。

(BionicFx流程图)

    其实把GPU当作普通处理器进行使用依然有着不小的难度。其中最要命的恐怕就是GPU是设计来处理图形的,因此他的编程语言架构和编程环境都难于使用。实现GPU运行非图形程序时,往往需要依靠极端复杂的算法和较为曲折的流程。在今年微软举办的GDC 2005(游戏开发者大会)会议上,Mark Harris便清晰的指出了GPGPU所遇到困难和前进。无论如何,GPU作为一个强悍的处理器,必将会被用于处理更多浮点密集运算的应用,而不仅限于图形。

 
结语:

  尽管花了很长的篇幅,但我们依然无法将十一年间3D世界的每次变革记入本文。十一年前3D世界粗糙且错漏百出,十一年后3D世界已经色彩斑斓,以假乱真。我们无法想象在这突变后面所包含的智慧和创意,我们也无从知道究竟有多少人在致力于模糊真实和虚幻之间的界限。为此,我们只能带着好奇心,去幻想未来十一年后3D世界的模样……