精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>游戏元素>>● 游戏开发>>制作上路(新手请看)>>入门教程>>图像编程入门>>Direct3D技术背景

主题:Direct3D技术背景
发信人: chensumin()
整理人: nhyjq(2001-12-07 16:57:53), 站内信件
找到的  Direct3D技术背景  的中文翻译
图形没法贴上来,就对照着MSDN看吧


下面的主题介绍的是一些在编写3D图形程序前必须了解的技术概念。在这些章节
中,你会看到一些关于坐标系统和变换的基本的论述。这不是结构细节(如建立
模型,灯光,观察参数)方面的问题。关于这些方面的问题,请参看D3D留存的结
构模式。
 3D坐标系统 3-D Coordinate Systems 
 3D变换 3-D Transformations 
 多边形 Polygons 
 三角形带和三角形扇 Triangle Strips and Fans 
 矢量、顶点和四元数 Vectors, Vertices, and Quaternions  
 浮点的精度 Floating-Point Precision 
 Z-Buffers and Overlays 

1 3D坐标系统
在3D图形学中,笛卡儿坐标系统有两种形式:左手和右手。在这两种坐标中,x轴
的正向都指向右,y轴正方向指向上。在确定Z轴方向时,让你的左手或右手的手
指指向x轴正方向,向y轴正方向弯曲四指,这时,拇指的指向就是z轴的正方向。

这一部分描述的是D3D坐标系统以及坐标类型。
 1.1 D3D坐标系统 Direct3D Coordinate System 
 1.2 U-、V-坐标系 U- and V-Coordinates 
1.1 D3D坐标系统
缺省情况下,D3D使用左手坐标系统,也就是z轴的正方向远离观察者,如下面所
示:

在左手系统中,沿着指向观察者的轴进行的旋转为顺时针旋转。
如果需要使用右手坐标系统,只要改变传递给D3D的两个数据就可以了。

注:从DirectX 6.0开始,可以使用IDirect3DRM3::SetOptions来通知D3D保留模
式,我们要使用右手坐标系统的。如果使用IDirect3DRM3::SetOptions,就不需
要改变数据了。

DirectX 6.0以前的版本,在使用右手坐标时,需要改变传递给D3D保留模式的数
据。
 交换三角形顶点的次序,以使它从前面看是顺时针方向的。换句话说,
假如顶点顺序为V0,V1,V2,则以V0,V2,V1的顺序传递给D3D。 
 在z方向上,用-1对投影矩阵进行缩放。也就是改变D3DMATRIX结构中的
_13、_23、_33和_43成员的正负号。

1.2 U-、V-坐标系
D3D也使用纹理坐标。当我们要将一个纹理映射到物体上时,就使用这些坐标(u
和v)。矢量v描述纹理的方向或取向,它沿z轴方向。矢量u(或向上矢量)沿着y
轴的方向放置,它的起点是[0,0,0]。关于u-、v-坐标的详细内容参看“扭曲”
部分。

2 3D变换
在3D图形程序中,我们可以使用几何变换来达到以下的目的: 
 表示一个对象相对于另一个对象的位置。
 对物体进行旋转、剪切和缩放。
 改变观察的位置、方向和透视。
你可使一个4*4矩阵将一个点变化到另一个点。在下面的例子中,我们使用一个矩
阵点(x,y,z)变换到一个新的点(x',y',z'):





对已知点(x,y,z) 执行下面的操作,得到点(x',y',z'):




最常用的变换有平移、旋转和缩放。你可以将产生这些效果的矩阵进行组合,产
生一个单独的矩阵来一次进行几个变换。例如,我们用可以用一个矩阵同时来进
行平移和旋转变换。
矩阵可以用它的排行顺序来进行声明。如下面的矩阵可由一个数组来表示。
标是这个矩阵的数组如下所示:
D3DMATRIX scale = {
    D3DVAL(s),    0,            0,            0,
    0,            D3DVAL(s),    D3DVAL(t),    0,
    0,            0,            D3DVAL(s),    D3DVAL(v),
    0,            0,            0,            D3DVAL(1)
};
这部分描述的是D3D中可以使用的3D变换。
 2.1 平移
 2.2 旋转
 2.3 缩放
文档中的其它部份也讨论了一些变换。在这些章节中你可找到在保留模式中用于
视口的一些变换的讨论。关于在框架中进行的变换,请参看“变换”部分。尽管
这些章节的每一部分讨论的都是保留模式API,但是变换中的体系结构和数学运算
对于保留模式与立即模式均适用。

2.1 平移
下面的变换是将点(x,y,z)平移到新的位置(x',y',z'):

2.2 旋转
在这段中所描述的变换都是在左手坐标系中进行的,因此它们可能与你在其它地
方看到的变换矩阵有所不同。下面的点(x,y,z)沿着x轴进行旋转,变换得到新
的点(x',y',z'):
下面的变换沿y轴进行旋转:
下面的变换沿z轴进行旋转:
注意,在这些例子的矩阵中,希腊字母theta代表旋转的角度,一般指弧度。角度
的测量是沿着旋转轴到原点的方向,按顺时针方向旋转得到的角度。 

2.3 缩放
如下的缩放变换通过x,y,z方向的用任意值对点(x,y,z)进行缩放,得到新点
(x',y',z'):

3 多边形
Direct3D中的三维物体是由一系列的多面体组成的。每个多面体又由一系列的面
组成,并且每个面都由一个简单的多边形来描述。三角形是最基本的多边形。尽
管保留模式可以声明多于三个顶点的多边形,但是系统在物体渲染之前仍会将它
们转换成三角形。立即模式中必须使用三角形。
这一节中将讲述如何在程序中使用D3D的多边形。
 3.1 几何学上的要求 Geometry Requirements 
 3.2 面和顶点法向量 Face and Vertex Normals 
 3.3 明暗处理模式 Shade Modes 
 3.4 对三角形的特性进行内插 Interpolated Triangle Characterist
ics 

3.1 几何学上的要求
我们首选使用三角形是因为它总是凸形的,这是提出者所要求的设计多边形的两
个条件。如果多边形上的任意两个点的连线都在这个多边形的内部,那么这个多
边形就是凸形的。
三角形的三个顶点总能描述一个平面,但很容易增加一个顶点而使它变成一个非
平面的多边形。

3.2 面和法向量
多面体中的每个面都有一个与它正交的法向量,它的方向由顶点的顺序和所使用
的坐标系(右手和左手)决定。如果平面的法向量朝向观察者方向,那么平面得
这一面就是它的正面。在D3D中,只有平面的正面才是可见的,一个向前的面的顶
点是以顺时针方向来定义的。

D3D程序不需要声明面法向量;当它需要时,系统会自动计算。系统在平面明暗处
理模式中才使用法线。对于Phong和Gouraud明暗处理模式,以及光线控制和纹理
效果,系统使用的是顶点法向量。


3.3 明暗处理模式
在平面明暗处理模式中,系统复制穿过所有其它图元表面的顶点的颜色。在Gour
aud和 Phong明暗处理模式中,用顶点法向量来使由多边形组成的物体的表面看起
来比较光滑。在Gouraud明暗处理模式中,相邻顶点间的颜色和亮度要在分开它们
的空间中进行内插。在Phong明暗处理模式中,系统会为一个平面上的每个像素结
算最适合的明暗值。

注:目前还不支持Phong明暗处理模式。

大多数的应用程式都使用Gouraud模式,因为它能够使物体表面比较光滑,并且能
够提高运算的效率。但是Gouraud模式会错过一些Phong模式不会错过的细节。例
如,对于下图所示的一个聚光灯被完全包含在一个平面内的例子,使用Gouraud和
Phong模式就会截然产生不同的结果。

在这个例子中,Phong模式会计算每一个像素的值,并能显示出聚光灯。而在Gou
raud模式中,由于要在顶点间进行内插,因此它会完全忽略聚光灯;平面渲染的
结果将没有聚光灯的存在。
 在平面处理模式中,下图所示的棱锥的两个相邻面会有比较明显的边缘;系统
将自动的产生面法向量。但是在Gouraud或Phong模式中,明暗值会穿过边缘进行
内插,这样,最后的结果就成了一个曲面。
如你想采用Gouraud或Phong模式来显示曲面,并且又想有一些有明显边缘的物体
,那么就要对需要显示边缘的面的交界处的顶点法向量进行复制,如下图所示:

如果在一个物体上既有曲面又有平面,那么使用Gouraud模式要比平面模式更具真
实感。在平面模式中,一个平面上的颜色是一样的,但Gouraud模式能使光线照在
平面上的效果更加真实。当有一个点光源位于一个平面的附近时,这种区别将会
更加明显。对大多数D3D程序来说,Gouraud模式是以较理想的模式。

3.4 对三角形的特性进行内插
系统在渲染一表面时,会对三角形顶点的特性进行内插。进行内插的三角形的特
性包括:
 颜色
 镜面属性
 雾化
 Alpha 
所有三角形的内插特性都要根据当前的明暗处理模式来进行调整:
 平面明暗处理模式:不采用内插,而用三角形第一个顶点的颜色作为整
个平面的颜色。
 Gouraud模式:在所有三个顶点间进行线形内插。
 Phong模式:使用当前的灯光设置对表面上每个像素的顶点参数进行重
新估算。目前还不支持Phong模式。
根据不同的颜色模式,对内插颜色和镜面属性要进行不同的处理。在RGB颜色模式
中,系统使用红、绿、蓝三种颜色成分来进行内插。在单色模式中,系统只使用顶
点颜色的蓝色成分。
例如,如果顶点1的红色成分为0.8,顶点2的红色成分为0.4,那么在Gouraud模式
中,这两个顶点连线的中点的红色成分就会是0.6。
一个颜色的alpha成分是一个独立的内插特性,因为设备驱动器能用两种方法来执
行透明处理:使用纹理融合与使用点画法。
程序可以使用D3DPRIMCAPS结构的dwShadeCaps成员来决定当前设备驱动器所支持
的内插方式。

4 三角条带与三角形扇
我们可以使用三角形带和三角形扇来声明一个完整的表面,而不必提供每个三角
形的三个顶点。如下图所示,仅要七个顶点就可定义一个三角形带。
系统使用v1,v2,v3画出第一个三角形,再用v2,v4,v3画出第二个,v3,v4,v5画第
三个,v4,v6,v5画第四个,依此类推。注意:第二个和第四个三角形的顶点没按
次序排列。这是因为要保证所有的三角形都按顺时针定位。
三角形扇与一个三角形带相似,只是所有的三角形都共用一顶点。
系统用顶点v1,v2,v3决定第一个三角形;v3,v4,v1决定第二个三角形;v1,v4,v
5决定第三个三角形;依此类推。
你可使用D3DTRIANGLE结构中wFlags成员来声明建立三角形带和三角形扇的标志。


5 矢量、顶点和四元数
对于整个D3D来说,顶点可以用来描述位置和方向。一个图元中的每个顶点都由一
个矢量(描述它的位置),一个法向量(确定它的方向),纹理坐标和一个颜色
来进行描述。(在保留模式中,D3DRMVERTEX结构中包含上面这些值。)
四元数给定义了的一个矢量[x,y,z]增加一个元素。用它可以替换典型矩阵方法
来对物体进行3D旋转。一个四元数用来表示3D空间中的一个轴,并沿此轴来进行
旋转。例如,我们可以用四元数来代表轴(1,1,2),并旋转1个弧度。四元数可以
携带重要的信息,但它们真正的作用来自于我们所执行的两个操作:合成(comp
osition)与内插.
对四元数执行合成运算就是将它们合并。两个四元数的合成如下所示:
两个四元数的合成应用于一个几何体,就是意味着“绕着轴axis2将几何体旋转角
度rotation2,然后再绕轴axis1旋转角度rotation1”。这样,Q所代表的旋转就
与将q2和q1应用于物体所得到的结果相同。
使用四元数内插,程序就可以很顺畅的从一个轴和取向过渡到另一个轴和取向。
因此,在q1、q2间进行内插就能简单的模拟从一个取向过渡到另一个取向的过程

当你同时使用合成与内插时,它们想你提供了一种简单操作几何体的方法。例如
,我们想要将一个几何体旋转到一个给定的方向。我们现在已知要先将它绕轴ax
is2旋转r2度,然后再沿轴axis1旋转r1度,但是,我们不知道最终的四元数。这
时,我们可以使用合成,将这两个旋转进行合并,这样就得到了一个最终的四元
数。然后,我们在起点与合成的四元数之间进行内插,从而得到了一个平滑的变
换。
D3D保留模式包含了一些函数来帮助我们使用四元数。例如,函数D3DRMQuaterFr
omRotation用来给定义了旋转轴的矢量增加一个旋转值,并将结果返回到一个由
D3DRMQUATERNION结构定义的四元数中。另外,D3DRMQuaternionMultiply函数用
来对四元数进行合成,D3DRMQuaternionSlerp函数用来在两个四元数之间执行球
面线形内插。
保留模式程序可以使用下面的函数来简化矢量和四元数操作:
 D3DRMQuaternionFromRotation 
 D3DRMQuaternionMultiply 
 D3DRMQuaternionSlerp 
 D3DRMVectorAdd 
 D3DRMVectorCrossProduct 
 D3DRMVectorDotProduct 
 D3DRMVectorModulus 
 D3DRMVectorNormalize 
 D3DRMVectorRandom 
 D3DRMVectorReflect 
 D3DRMVectorRotate 
 D3DRMVectorScale 
 D3DRMVectorSubtract 

6 浮点精度
象同DirectX结构中的其它部分一样,D3D具有53字节的浮点精度。精度的设置在
FPU(floating-point unit)中的浮点控制字注册中进行。如你的程序为了某些
计算需要改变精度,那么在计算完成后,必须将精度改回到53。否则,系统将会
停止工作。

7 Z-Buffers与覆盖(overlay)
z-buffer中的顺序决定了对象相互覆盖的顺序。覆盖被假定为位于所有屏幕成分
的最顶层。如果覆盖没有一个明确的z值顺序,那么当我们对图元表面的同一区域
进行覆盖处理时,得到的结果将会难以预料。如果没有z-buffer,那么D3D保留模
式不会对覆盖层次进行选择。没有声明z值顺序的覆盖将会被假定为它的z-order
为0,并且会按照这个顺序来进行渲染。允许的覆盖的z-order的范围从0(它刚好
位于图元表面的最顶端)到40亿(尽可能接近观察者)。z-order为2的覆盖要比
z-order为1的覆盖模糊一些。没有两种overlays有相同的z-order。



--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.102.114.29]

[关闭][返回]