2024年1月10日发(作者:)
DirectX9_SDK中文文档
做 转1 Direct3D 起步 Getting started with Direct3D本节提供对
Microsoft Direct3D应用程序编程接口(API)中三维图形功能的介绍。
可以在这里找到有关图形流水线的概述, 以及可以快速运行, 帮助开发 者了解 Direct3D 基本功能的教程。 Direct3D 体系结构 三维坐标系与几何学 Direct3D 对象 设备 资源 状态 顶点声明 顶点格式 几何体 渲染- Direct3D 体系结构 Direct3D Architecture alpha
version Architecturealpha Direct3DArchitectureDirect3D 体系结构本节包含了有关 Microsoft Direct3D部件和其它 Microsoft DirectX部件、操作系统、及系统硬件之间关系的信息,讨论了以下主题。 Direct3D
体系结构概述 硬件抽象层 系统集成 可编程顶点着色器体系结构
可编程像素着色器体系结构Direct3D 体系结构概述这是一幅图形流水线的图示。下面介绍了每一块的功能,以及在哪里可以找到更多信息的链接。有关 Microsoft Direct3D可编程部分的体系结构的更多信息,请参阅可编程顶点着色器体系结构和可编程像素着色器体系结构。硬件抽象层Microsoft Direct3D通过硬件抽象层(HAL)提供设备无关性。HAL 是一个设备相关的接口,由设备制造商提供,Direct3D 使用 HAL 与显示硬件协同工作。应用程序从不直接与
HAL 打交道。相反,通过 HAL 提供的基础,Direct3D 暴露了一组统一的接口和方法,应用程序用这些接口和方法绘制/显示图形。在Microsoft Windows XP、Microsoft Windows NT和 Windows 2000 下,设备制造商用 32 位代码实现 HAL。而在 Windows 98 和 Windows
Millennium EditionWindows Me下,则混合使用 16 位和 32 位代码。
HAL 可以是显示驱动程序的一部分,或者是一个单独的动态链接库(DLL),该 DLL 通过驱动程序开发人员定义的私有接口与显示驱动程序进行通信。Direct3D HAL 由芯片制造商、板卡制造商或原始设备制造商(OEM)实现。HAL仅实现与设备相关的代码并且不做任何模拟。如果硬件不能完成某项功能,则HAL 不将其声明为硬件的能力。另外,HAL 不检验参数,Direct3D 在调用 HAL 之前执行这项操作。在 Microsoft DirectX 9.0 中, HAL 可以有三种不同的顶点处理模式:软件顶点处理、硬件顶点处理、以及在同一设备上的混合顶点处理。纯设备模式是 HAL设备的一个变体。纯设备类型只支持硬件顶点处理,且只允许应用程序查询设备状态中很小的一个子集。另外,纯设备仅在具有某一最低能力级的适配器上可用 。系统集成下图显示了 Microsoft Direct3D、Microsoft Windows图形设备接口(GDI)、硬件抽象层(HAL)及硬件之间的关系。如上图所示,Direct3D 应用程序位于 GDI 应用程序旁边,它们都可以通过图形卡的设备驱动程序访问图形硬件。与 GDI 不同的是,当选择了 HAL
设备时,Direct3D 可以利用硬件特性。基于图形卡支持的特性集,HAL 设备提供了硬件加速。为了在运行时检查设备是否能执行某项操作,Direct3D 提供了相应的方法。有关 Direct3D 所支持设备的更多信息,请参阅设备类型。可编程顶点着色器体系结构有关顶点着色器寄存器的更多信息,请参阅 Registers - vs_1_1。有关顶点着色器参考章节的更多信息,请参阅 Vertex Shader 1_1。可编程像素着色器体系结构有关像素着色器寄存器的更多信息,请参阅 Registers -
ps_1_X。有关像素着色器参考章节的更多信息,请参阅 Pixel Shader
1_X。- 三维坐标系与几何学 3-D Coordinate Systems and Geometry
alpha version三维坐标系与几何学编写 Microsoft Direct3D应用程序需要熟悉三维几何学原理。本节介绍创建三维场景所需的最重要的几何概念。本节涉及到以下主题。三维坐标系三维图元表面和顶点法向三角形光栅化法则矩形三角形插值向量、顶点和四元数这些主题给读者提供了一个对 Direct3D 应用程序所涉及到的基本概念的高层描述。更多有关这些主题的信息,请参阅更多的信息。三维坐标系通常三维图形应用程序使用两种笛卡尔坐标系:左手系和右手系。在这两种坐标系中,正 x轴指向右面,正 y 轴指向上面。通过沿正 x 轴方向到正 y 轴方向握拳,大姆指的指向就是相应坐标系统的正 z 轴的指向。下图显示了这两种坐标系统。Microsoft Direct3D使用左手坐标系。如果正在移植基于右手坐标系的应用程序,必须将传给
Direct3D 的数据做两点改变。 颠倒三角形顶点的顺序,这样系统会从正面以顺时针的方向遍历它们。换句话说, 如果顶点是 v0,v1,v2,那么以 v0,v2,v1 的顺序传给 Direct3D。 用观察矩阵对世界空间中的 z 值取反。要做到这一点,将表示观察矩阵的
D3DMATRIX 结构的_31、_32、_33 和_34 成员的符号取反。要得到等同于右手系的效果,可以使用 D3DXMatrixPerspectiveRH 和
D3DXMatrixOrthoRH函数定义投影矩阵。但是,要小心使用
D3DXMatrixLookAtRH 函数,并相应地颠倒背面剔除的顺序及放置立方体贴图。虽然左手坐标系和右手坐标系是最为常用的系统,但在
三维软件中还使用许多其它坐标系。例如,对三维建模应用程序而言,使用 y 轴指向或背向观察者的坐标系统并非罕见。在这种情况下,任意轴(x,y 或 z)的正半轴指向观察者的被定义为右手系。任意轴(x,y 或 z)的正半轴背向观察者的被定义为左手系。如果正在移植一个基于左手系进行建模的应用程序,z 轴向上,那么除了前面的步骤外,还必须旋转所有的顶点数据(译注:如果原来的坐标系为正 x 轴向里,正 y 轴向左,正 z 轴向上,那么传给 Direct3D 的顶点的 x 值对应原来的 y 值,y 值对应原来的 z 值,z 值对应原来的 x 值,亦即旋转顶点数据)。对三维坐标系统中定义的三维物体执行的最基本操作是变换、旋转和缩放。可以合并这些基本变换以创建一个新的变换矩阵。细节请参阅三维变换。即使合并相同的变换操作,不同的合并顺序得到的结果是不可交换的——矩阵相乘的顺序很重要。三维图元三维图元是组成单个三维实体的顶点集合。三维坐标系统中最简单的图元是点的集合,称为点表。通常三维图元是多边形。一个多边形是由至少三个顶点描绘的三维形体。最简单的多边形是三角形。Microsoft Direct3D使用三角形组成大多数多边形, 因为三角形的三个顶点一定是共面的。应用程序可以用三角形组合成大而复杂的多边形及网格(mesh)。下图显示了一个立方体。立方体的每个面由两个三角形组成。整个三角形的集合构成了一个立方体图元。可以将纹理和材质应用于图元的表面使它们看起来像是实心的。可以使用三角形创建具有光滑曲面的图元。下图显示了如何用三角形模拟一个球体。应用了材质后,渲染得到的球体看起来是弯曲的。如果使
用高洛德着色,结果更是如此。更多信息请参阅高洛德着色。表面和顶点法向量网格中的每个面有一个垂直的法向量。该向量的方向由定义顶点的顺序及坐标系统是左手系还是右手系决定。表面法向量从表面上指向正向面那一侧,如果把表面水平放置,正向面朝上,背向面朝下, 在 那么表面法向量为垂直于表面从下方指向上方。 Microsoft
Direct3D中,只有面的正向是可视的。一个正向面是顶点按照顺时针顺序定义的面。任何不是正向面的面都是背向面。由于 Direct3D 不总是渲染背向面,因此背向面要被剔除。如果想要渲染背向面的话,可以改变剔除模式。更多信息请参阅剔除状态。Direct3D 在计算高洛德着色、光照和纹理效果时使用顶点法向。Direct3D 使用顶点法向计算光源和表面间的夹角,对多边形进行高洛德着色。Direct3D 计算每个顶点的颜色和亮度值,并对图元表面所覆盖的所有像素点进行插值。Direct3D 使用夹角计算光强度,夹角越大,表面得到的光照就越少。如果正在创建的物体是平直的,可将顶点法向设为与表面垂直,如下图所示。该图定义了一个由两个三角形组成的平直表面。但是,更可能的情况是物体由三角形带(triangle strips)组成且三角形不共面。要对整个三角形带的三角形平滑着色的一个简单方法是首先计算与顶点相关联的每个多边形表面的表面法向量。可以这样计算顶点法向,使顶点法向与顶点所属的每个表面的法向的夹角相等。但是,对复杂图元来说这种方法可能不够有效。这种方法如下图所示。图中有两个表面,S1 与 S2,它们的邻边在上方。S1 与 S2 的法向量用蓝色显示。顶点的法向量用红色显示。顶点法向量与 S1 表面法向的
夹角和顶点法向量与S2表面法向的夹角相同。当对这两个表面进行光照计算和高洛德着色时, 得到结果是中间的边被平滑着色,看起来像是弧形的(而不是有棱角的)。如果顶点法向偏向与它相关联的某个面,那么会导致那个面上的点光强度的增加或减少。下图显示了一个例子。这些面的邻边依然朝上。顶点法向倾向 S1,与顶点法向与表面法向有相同的夹角相比,这使顶点法向与光源间的夹角变小。可以用高洛德着色在三维场景中显示一些有清晰边缘的物体。要达到这个目的,只要在需要产生清晰边缘的表面交线处,把表面法向复制给交线处顶点的法向,如下图所示。如果使用 DrawPrimitive 方法渲染场景,要将有锋利边缘的物体定义为三角形表,而非三角形带。当将物体定义为三角形带时,Direct3D 会将它作为由多个三角形组成的单个多边形处理。高洛德着色被同时应用于多边形每个表面的内部和表面之间。 结果产生表面之间平滑着色的物体。因为三角形表由一系列不相连的三角形面组成,所以 Direct3D 对多边形每个面的内部使用高洛德着色。但是,没有在表面之间应用高洛德着色。如果三角形表的两个或更多的三角形是相邻的,那么在它们之间看起来会有一条锋利边缘。另一种可选的方法是在渲染具有锋利边缘的物体时改变到平面着色模式。这在计算上是最有效的方法,但它可能导致场景中的物体不如用高洛德着色渲染的物体真实。三角形光栅化法则顶点指定的点经常不能精确地对应到屏幕上的像素。此时,Microsoft
Direct3D使用三角形光栅化法则决定对于给定三角形使用哪个像素。
三角形光栅化法则 点、线光栅化法则 点精灵光栅化法则三角形光栅
化法则Direct3D 在填充几何图形时使用左上填充约定(top-left filling
convention) 。这与Microsoft Windows的图形设备接口(GUI)和
OpenGL 中的矩形使用的约定相同。Direct3D中,像素的中心是决定点。如果中心在三角形内,那么该像素就是三角形的一部分。像素中心用整数坐标表示。这里描述的 Direct3D 使用的三角形光栅化法则不一定适用于所有可用的硬件。测试可以发现这些法则的实现间的细微变化。下图显示了一个左上角为(0,0),右下角为(5,5)的矩形。正如大家想象的那样,此矩形填充 25 个像素。矩形的宽度由
right 减 left 定义。高度由 bottom 减 top 定义。 上 左在左上填充约定中, 表示水平 span 在垂直方向上的位置, 表示 span 中的像素在水平方向上的位置。一条边除非是水平的,否则不可能是顶边——一般来说,大多数三角形只有左边或右边。左上填充约定确定当一个三角形穿过像素的中心时 Direct3D 采取的动作。下图显示了两个 ,三角形,一个在(0,0) ( 5,0)和(5,5) , 。 ,另一个 在(0,5) ( 0,0)和(5,5) 在 这种情况下第一个三角形得到 15 个像素(显示为黑色) ,而第二个得到 10 个像素(显示为灰色),因为公用边是第一个三角形的左边。如果应用程序定义一个左上角为(0.5,0.5),右下角为(2.5,4.5)的矩形,那么这个矩 。形的中心在(1.5,2.5) 当 Direct3D 光栅化器 tessellate 这个矩形时,每个像素的中心都毫无异义地分别位于四个三角形中,此时就不需要左上填充约定。下图显示了这种情况。矩形内的像素根据在
Direct3D 中被哪个三角形包含做了相应的标注。如果将上例中的矩
形移动,使之左上角为 , ( , ( (1.0,1.0) 右 下 角 为 3.0,5.0) 中 心 为 2.0,3.0),那么 Direct3D 使用左上角填充约定。这个矩形中大多数的像素跨越两个或更多的三角形的边界,如下图所示。这两个矩形会影响到相同的像素。点、线光栅化法则点和点精灵一样,都被渲染为与屏幕边缘对齐的四边形,因此它们使用与多边形同样的渲染法则。非抗锯齿线段的渲染法则与 GDI 使用的法则完全相同。更多有关抗锯齿线段的渲染,请参阅 ID3DXLine。点精灵光栅化法则对点精灵和 patch 图元的渲染,就好像先把图元 tessellate
成三角形,然后将得到的三角形进行光栅化。更多信息,请参阅点精灵。矩形贯穿 Microsoft Direct3D和 Microsoft Windows编程,都是用术语包围矩形来讨论屏幕上的物体。由于包围矩形的边总是与屏幕的边平行,因此矩形可以用两个点描述,左上角和右下角。当在屏幕上进行位块传输(Blit Bit block transfer)或命中检测时,大多数应用程序使用 RECT 结构保存包围矩形的信息。C中,RECT 结构有如下定义。typedef struct tagRECT LONG left // 这是左上角的 x 坐标。
LONG top // 这是左上角的 y 坐标。 LONG right // 这是右下角的 x
坐标。 LONG bottom // 这是右下角的 y 坐标。 RECT PRECT NEAR
NPRECT FAR LPRECT在上例中,left 和 top 成员是包围矩形左上角的 x-和 y-坐标。类似地,right 和 bottom成员组成右下角的坐标。下图直观地显示了这些值。为了效率、一致性及易用性, Direct3D 所有的 presentation 函数都使用矩形。三角形插值对象(interpolants)在渲染时,流水线会贯穿每个三角形的表面进行顶点数据插值。 有
五种可能的数据类型可以进行插值。顶点数据可以是各种类型的数据,包括(但不限于) :漫反射色、镜面反射色、漫反射阿尔法(三角形透明度)、镜面反射阿尔法、雾因子(固定功能流水线从镜面反射的阿尔法分量中取得, 。 可编程顶点流水线则从雾寄存器中取得)
顶点数据通过顶点声明定义。对一些顶点数据的插值取决于当前的着色模式,如下表所示。 着色模式 描述 在平面着色模式下只对雾因子进行插值。对所有其它的插值对象,整个面都使平面 用三角形第一个顶点的颜色。高洛德 在所有三个顶点间进行线性插值。根据不同的颜色模型,对漫反射色和镜面反射色的处理是不同的。在 RGB
颜色模型中,系统在插值时使用红、绿和蓝颜色分量。颜色的阿尔法成员作为单独的插值对象对待,因为设备驱动程序可以以两种不同的方法实现透明:使用纹理混合或使用点画法(stippling)。可以用
D3DCAPS9 结构的 ShadeCaps 成员确定设备驱动程序支持何种插值。向量、顶点和四元数贯穿 Microsoft Direct3D,顶点用于描述位置和方向。图元中的每个顶点由指定其位置的向量、颜色、纹理坐标和指定其方向的法向量描述。四元数给三元素向量的 x y z值增加了第四个元素。用于三维旋转的方法,除了典型的矩阵以外,四元数是另一种选择。四元数表示三维空间中的一根轴及围绕该轴的一个旋转。例如,一个四元数可能表示轴112和 1 度的旋转。四元数包含了有价值的信息,但它们真正的威力源自可对它们执行的两种操作:合成和插值。对四元数进行插值与合成它们类似。两个四元数的合成如下表示:Q q1 ο q2将两个四元数的合成应用于几何体意味着“把几
何体绕 axis2 轴旋转 rotation2 角度,然后绕 axis1 轴旋转 rotation1
角度”。在这种情况下,Q 表示绕单根轴的旋转,该旋转是先后将q2
和 q1 应用于几何体的结果。使用四元数,应用程序可以计算出一条从一根轴和一个方向到另一根轴和另一个方向的平滑、合理的路径。因此,在 q1 和 q2 间插值提供了一个从一个方向变化到另一个方向的简单方法。当同时使用合成与插值时, 四元数提供了一个看似复杂而实际简单的操作几何体的方法。例如,设想我们希望把一个几何体旋转到某个给定方向。我们已经知道希望将它绕 axis2 轴旋转 r2
度,然后绕 axis1 轴旋转 r1 度,但是我们不知道最终的四元数。通过使用合成,我们可以在几何体上合成两个旋转并得到最终单个的四元数。 然后,我们可以在原始四元数和合成的四元数间进行插值,得到两者之间的平滑转换。Direct3D 扩 展 ( D3DX ) 工 具 库 包
含 了 帮 助 用 户 使 用 四 元 数 的 函 数 。 例 如 ,D3DXQuaternionRotationAxis 函数给一个定义旋转轴的向量增加一个旋转值,并在由D3DXQUTERNION 结构定义的四元数中返回结果。 另外, D3DXQuaternionMultiply 函数合成四元数,D3DXQuaternionSlerp 函数在两个四元数间进行球面线性插值(spherical linearinterpolation)。Direct3D 应用程序可以使用下列函数简化对四元数的使用。 D3DXQuaternionBaryCentric
D3DXQuaternionConjugate D3DXQuaternionDot D3DXQuaternionExp
D3DXQuaternionIdentity D3DXQuaternionInverse
D3DXQuaternionIsIdentity D3DXQuaternionLength
D3DXQuaternionLengthSq D3DXQuaternionLn
D3DXQuaternionMultiply D3DXQuaternionNormalize
D3DXQuaternionRotationAxis D3DXQuaternionRotationMatrix
D3DXQuaternionRotationYawPitchRoll D3DXQuaternionSlerp
D3DXQuaternionSquad D3DXQuaternionToAxisAngleDirect3D 应用程序可以使用下列函数简化对三成员向量的使用。 D3DXVec3Add
D3DXVec3BaryCentric D3DXVec3CatmullRom D3DXVec3Cross
D3DXVec3Dot D3DXVec3Hermite D3DXVec3Length
D3DXVec3LengthSq D3DXVec3Lerp D3DXVec3Maximize
D3DXVec3Minimize D3DXVec3Normalize D3DXVec3Project
D3DXVec3Scale D3DXVec3Subtract D3DXVec3Transform
D3DXVec3TransformCoord D3DXVec3TransformNormal
D3DXVec3UnprojectD3DX 工具库提供的数学函数中包含了许多辅助函数,可以简化对二成员和四成员向量的使用。- 设备 Devices
alpha version设备Microsoft Direct3D设备是 Direct3D 的渲染部件,它封装并储存渲染状态。此外,Direct3D 设备还执行变换和光照操作以及把图像光栅化到表面上。 设备类型 创建设备 选择设备 丢失的设备 检测硬件支持 处理顶点数据 设备支持的图元类型从结构上讲,Direct3D 设备包含一个变换模块、一个光照模块和一个光栅化模块,如下图所示。当前 Direct3D 支持两种主要类型的 Direct3D 设备:一种是硬件抽象层(HAL)设备,HAL 设备具有硬件光栅化加速,并可用软硬件顶点处理进行着色操作;另一种是参考设备。可以
认为这些设备是两个单独的驱动程序。软件和参考设备由软件驱动程序表示,而 HAL 设备由硬件驱动程序表示。这些设备最通常的用法是使用 HAL 设备发行应用程序,而用参考设备做特性测试。这些参考设备由第三方提供用于模拟特定的设备——例如,尚未发布的还在开发中的硬件。应用程序创建的设备必须与应用程序所运行的图形硬件的能力相对应。Direct3D以两种方式提供对渲染的支持,一种是访问安装在计算机中的三维硬件,另一种是用软件模拟三维硬件的能力。因此,对于硬件访问和软件模拟,Direct3D 都提供了相应的设备。硬件加速设备提供了比软件设备好得多的性能。HAL 设备类型在所有支持Direct3D 的图形适配器上都可用。在大多数情况下,应用程序将具有硬件加速的计算机作为目标平台,并依赖软件模拟以适应低端计算机。除了参考设备,软件设备并不总是支持与硬件设备相同的特性。应用程序应该总是查询设备能力以确定该设备支持的特性。因为 Microsoft DirectX 9.0 提供的软件设备和参考设备的行为与
HAL 设备完全相同,所以针对 HAL 设备开发的应用程序代码也可以用在软件设备或参考设备上而无需修改。注意,虽然 Direct3D 提供的软件设备或参考设备的行为与 HAL设备完全相同,但是设备的能力肯定会不同,某特定的软件设备可能仅实现一个较小的能力.


发布评论