现在的游戏
,单单从图象的生成来讲大概须要下面四个步骤:
1、建齐次坐标
2、 着色模型
3、Z缓存
4、纹理映射
在这些步骤中,显示部分(GPU)只负责完成第3、四步,而前两个步骤主要是依靠 CPU 来完成。并且,这还仅仅只是3D图象的生成,尚未包括游戏中复杂的AI运算。
场景切换运算等等……无疑,这些元素还须要CPU去完成,这就是为何在运行大型3D的时候,当场景切换时再强劲的显卡都会出现停顿的现象。
3D芯片的处理对象是
多边形表示的物体。用多边形表示物体有两个优势:首先是直接(尽管繁琐),
多边形表示的物体其表面的分段线性特征除轮廓外能够经过明暗处理(shading)技术消除;其次是仅存储
多边形顶点的几何信息,
多边形内部每一个象素的明暗颜色计算所需的信息由这些顶点信息插值而来,这正是易于用图形硬件支持的快速明暗处理技术。
支持多边形绘制的图形硬件一样也能够绘制由双三次曲面片表示的物体,经过对这种物体的表面进行三角剖分,
用逼近的三角形网格代替原物体的曲面表示就能够作到这一点。
固然,用多边形表示物体也有其缺点,如增长了纹理映射和阴影生成的难度,当须要详细表示复杂物体时所需的三角形数量将变得很是庞大。
将多边形表示的物体显示到计算机屏幕上,这一过程涉及物体在计算机内部的表示方式即物体的数据结构,
由物体组成的场景的组织结构,物体从场景到屏幕空间要通过的一系列变换,以及产生最终屏幕图象要通过的一系列光栅化处理。
这些方面都涉及到特定的处理算法,相应的算法又有许多不一样的变种。
下面仅就3D芯片涉及的图形处理过程及相关算法作一简单分析介绍,这些是理解3D图形处理及图形硬件的基础。
1、3D物体的表示法
具备复杂外形的物体其表面能够由多边形面片来近似表示。以图1的圆柱为例,其柱面能够由2N个三角形近似,其两端能够由两个N边形来近似。
多边形模型在其轮廓上的分段线性特征是这一表示法主要的视觉缺陷,改进的惟一途径是增长多边形的分辨率。
对于一个复杂形体来讲,为了充分表示其细节,经常要用到十万个以上的多边形。这将耗费许多数据库访问时间和绘制时间。
当将多边形模型进行放大处理时,会产生链接问题。这就是所谓的“几何走样”。
物体的多边形表示既能够经过交互设计人工提取,也能够经过激光扫描设备获得。总之,多边形表示的物体并不特别适合于交互操做或作自由的形状改变。
当改变物体的形状时很难保证多边形表示的完整性获得保持。
对多边形明暗着色所须要的信息存储在一个分层的数据结构中,每个物体表面由指向多边形表的指针定义,
该多边形表包含了近似该表面的一组多边形,每个多边形由指向顶点表的指针定义,顶点表包含了每一个多边形的全部顶点。
具体来讲须要为每一个多边形存储如下信息:
1)多边形的顶点表,每个顶点是一个三维坐标,该坐标定义在建立该物体时的局部坐标系中。
2)顶点的法向量表,这是明暗处理算法所要求的信息。向量由同一局部坐标系中的三份量表示。
3)多边形的法向量,它是包含该多边形的平面的真正的几何法向量。这是背面删除操做所须要的信息。
绘制多边形物体的传统方法是将多边形做为独立的绘制实体,这样多边形之间的共享边就要被处理两次。
为避免这种状况,可采用基于边的绘制方法,这时多边形的表示是基于多边形的边而不是多边形自己。
基于边的方法意味着绘制过程的组织要采用基于扫描线的算法,基于扫描线的算法将同时处理与当前扫描线相交的全部多边形。
这时存储器中能存储的可被同时处理的多边形的最大数目将成为可绘制的场景复杂度的上限。
使用全屏Z-buffer并将扫描线算法局限在物体所包含的多边形上就能够解决这一问题。
3D芯片的处理对象是多边形表示的物体。用多边形表示物体有两个优势:
首先是直接(尽管繁琐),多边形表示的物体其表面的分段线性特征除轮廓外能够经过明暗处理(shading)技术消除;
其次是仅存储多边形顶点的几何信息,多边形内部每一个象素的明暗颜色计算所需的信息由这些顶点信息插值而来,这正是易于用图形硬件支持的快速明暗处理技术。
支持多边形绘制的图形硬件一样也能够绘制由双三次曲面片表示的物体,经过对这种物体的表面进行三角剖分,
用逼近的三角形网格代替原物体的曲面表示就能够作到这一点。固然,用多边形表示物体也有其缺点,
如增长了纹理映射和阴影生成的难度,当须要详细表示复杂物体时所需的三角形数量将变得很是庞大。
将多边形表示的物体显示到计算机屏幕上,这一过程涉及物体在计算机内部的表示方式即物体的数据结构,
由物体组成的场景的组织结构,物体从场景到屏幕空间要通过的一系列变换,以及产生最终屏幕图象要通过的一系列光栅化处理。
这些方面都涉及到特定的处理算法,相应的算法又有许多不一样的变种。
下面仅就3D芯片涉及的图形处理过程及相关算法作一简单分析介绍,这些是理解3D图形处理及图形硬件的基础。
2、坐标系统
绘制过程的几何处理部分可被当作应用一系列的坐标变换将物体数据库变换到一系列的坐标系下,这些坐标系对全部绘制系统都是公用的,
是理解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坐标将做为判断物体面之间相互遮挡的惟一判据。
注意,场景中的每一个物体的每一个三角形都要通过以上处理过程。
3、象素处理 通过以上一系列的变换以后,一个多边形已变换到屏幕坐标系下。将一个屏幕多边形在屏幕上绘制出来就是多边形的象素处理过程,它包括光栅化、隐藏面消除、明暗处理。光栅化、隐藏面消除、明暗处理是整个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.特殊效果 纹理映射、透明以及雾化(大气效应)等真实感效果都是在象素处理阶段实现的。 物体表面纹理的定义是在世界坐标系中进行的,经过预处理,每一个带有纹理的多边形在其顶点数据中创建了与相应纹理图的映射关系。 在绘制带有纹理的多边形时,其相应的纹理图也同时被加载到纹理存储器中,在求出物体上象素坐标的同时其相应的纹理坐标也被计算出来。 用该纹理坐标从纹理存储器中读出相应纹理象素的值,将其与明暗处理的结果进行混合就获得要显示的象素值。 雾化(大气效应)则是在计算出的象素值上乘上一个与深度有关的衰减因子。 对落在同一屏幕位置的象素点的象素值按其所属物体的透明系数进行加权融合就能够产生透明效果。[/hide]