说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Direct3D起步:教程以及资源指南-Delphi资料

HTML文档下载 WORD文档下载 PDF文档下载
Direct3D起步:教程以及资源指南-Delphi资料

Microsoft Direct3D是Microsoft DirectX 2 交互媒体技术的实时三维(3-D)图形组件。DirectX 2包括DirectDraw,DirectSound,DirectInput,以及DirectPlay应用程序编程接口(APIs)。这些技术在Windows 95操作系统中被支持,并且将被合并入下一版发行的Win32 API中。DirectX 2也即将可以在Windows NT操作系统以及Apple Power Macintosh环境中使用。

Direct 3D以及其它的DirectX技术意图给程序员们同时提供两个最好的环境─一个底层的,高性能的接口,它同硬件相结合,具有同设备无关的灵活性。对于Direct3D,程序员可以将3-D图形功能揉合在Windows程序中,以充分利用其始终存在的硬件加速性能,同时,程序员们并不需要针对特定的硬件编写特殊的代码。

当我开始着手学习有关Direct3D的知识时,我被DirectX 2中所包含的材料的数量惊呆了:二进制文件,库文件以及头文件,样例代码和演示游戏,帮助文件,说明文件,以及文档。Direct3D是在SDK中最大的和最复杂的组件。再加上测试人员的邮件,新闻报道,以及第三方的支持等,我发现我自己简直就要被埋葬了。所以尽管我们并不缺少有关Direct3D的信息,但是要想在里面爬梳整理一番并找到自己需要的东西还是非常劳心费时的。这篇文章只是一个有关Direct3D技术,SDK,和资源的概述,起到一个类似街道地图的作用。尽管大多数的信息都可以在文档中被找到,但是,如果你需要制造产品并得到快速的技术咨询,而你又没有足够时间去搜索的话,这篇文章就会对你有所帮助了。

在你阅读完这篇文章之后,你应该能够回答如下的这些问题:

什么是Direct3D?它的主要特性是什么?它对我们的应用程序有所帮助吗?

使用Direct3D,我们需要什么类型的计算机?

我们需要什么样的背景知识?

学习它最快我们需要多少时间?

我们从哪里开始入手?在哪里我们能找到更多的信息?

一旦你品尝到了Direct3D的滋味,就会深深沉溺于Direct3D的3-D编程中,你将会知道如何着手去学习如何将Direct3D的功能添加到你的应用程序中。

运行时的环境

你需要一台可以运行Windows 95的多媒体计算机或兼容机。对于多媒体的三个组成部分你可能还并不清楚,它们是一个CD-ROM驱动器,一块声卡,以及一块8比特或更高比特的视频卡。

推荐的系统是一台配备有Inter奔腾90或更高芯片的100%兼容的PC系统,至少要有16MB的内存。

最小系统是一台配备Inter 486/66芯片的带有8MB内存的兼容机。但是让我们诚实一些:这些配置对于其它的一些DirectX组件或许可以工作得不错,但是我们都知道3-D图形的操作在使用计算机资源时是非常贪婪的,所以在把系统推荐给你的客户之前请先确定在所有的配置上您的应用程序正确可用。

支持的硬件

这里是现在被DirectX 2所支持的硬件清单。“被支持”的意思是指DirectX 2支持硬件的部分硬件加速(hardware-acceleration)特性,或是驱动和硬件已经通过DirectX 2组件的测试,并具有相当的性能。它并不意味着具有完美的性能,也并不表示Microsoft或是硬件生产厂商真正书写了驱动和DirectX 2的硬件抽象层(Hardware Abstraction Layer(HAL))。当然,我敢打赌,这些定义相当的好。

2-D图形:ATI,Chips & Technologies,Cirrus Logic,Matrox,S3,Tseng Labs,Western Digtal。

3-D图形:3DLabs,ATI,Creative Labs,Matrox,Rendition,S3。

声音:Aztech,Creative Labs,ESS,MediaVision,Microsoft。

开发环境

你需要使用Win32 SDK来构造DirectX 2的应用程序。在样例文件带有为Microsoft Visual C++(2.0版或更高版本)所写的makefiles文件,但是,当然它也可以在其它的开发环境中被编译。如果你是一个Watcom C/C++(需要10.05版或更高版本)的用户,请确定你已经查看过样例文件目录中的说明(readme)文件,该文件可以给你一些指导。

因为Direct 3D以及其它的DirectX 2组件是新出现的技术,所以它们还没有被集成在Windows中。在它们被集成之前,你将不得不在你的应用程序的安装过程中包括它们。在DirectX 2 SDK中对这些你将需要做的事情作了介绍并包含了相应的组件(它们的名称是,有够让人惊讶的,叫做DirectSetup)。

即将到来的平台

在不远的将来的某一天,你一觉醒来,会发现太阳高高地照耀着,鸟儿欢乐地歌唱着,同时DirectX 2在Windows NT操作系统和Apple_ Power Machintosh中被支持着。一旦我们得到了确定的日期,我们将会通知你的。嗨,我们别太费劲了,这毕竟是软件工业啊!如果你希望尽早知道有关这些以及其他的Microsoft交互媒体技术发行日期的话,最好的方法就是同交互媒体以及游戏开发者(Interactive Media and Game Developers)网站(Web site):http://www.microsoft.com/DirectX/.相联系。你也将能够得到到现在为止DirectX 2所支持的硬件的最新清单,更多的驱动以及HAL实现变得可以使用。

架构(Architecture)

这是一张精致的图表,它显示了Direct3D同Windows架构是如何联系的:

Direct3D 结构图

DirectDraw是针对2-D图形,3-D图形以及视频的Windows的组件引擎。它被应用程序和Direct3D两者直接使用。如果你决定在你的应用程序中使用Direct3D,则你同样需要对DirectDraw有较好的了解。

硬件抽象层(HAL)是特定硬件代码的老家,它实现一些有益的特性,包括硬件的剪贴以及页面的翻转等。伴随硬件抽象层的是HEL,也叫硬件仿真层(hardware emulation layer),它没有显示在上面的图1中。它包含了所有可以在DirectDraw和Direct3D中使用的功能的软件实现。无论安装了什么硬件,HEL和HAL的组合都允许应用程序从中获得最大的收益,而不用牺牲设备的无关性。程序员可以使用一种标准的方法来编写代码,这种代码无论在什么系统上都会竭尽所能地快速运行。

在图中表示为“其它的3D APIs或引擎”的一个使用DirectDraw和Direct3D的例子是OpenGL。这是另外一种可从Microsoft中获得使用的3-D技术,它的目标是high-end CAD/CAM以及科学应用程序群体(scientific-application crowd)

Direct3D着色途径(rendering pipeline)组成了三个模块:灯光模块(the lighting module),变形模块(the transformation module),以及光栅模块(the rasterization module),每种模块都可以在软件中仿真以及被硬件加速,并且能够采用不同的实现方法进行交换(如果需要的话,可以在空中),以适应应用程序独特的需要。Direct3D集成有两种灯光模块,一种变形模块,以及两种光栅模块。

尽管在图中不是一目了然,Direct3D,它实际上是两种3-D包装的合一体。程序员可以选择高级别的保留模式API(Retained Mode API),也可以选择低级别的立刻模式API(Immediate Mode API)。

保留模式

Direct3D保留模式API被设计为用以针对手工操纵的场景和物体提供高级别的服务。它被设置在立即模式的顶部,并且具有一个内置的几何引擎,所以你不需要保留物体的数据库或是它们的内部结构。此引擎也支持一些例如关键帧(key-frame)动画的性能。仅仅只需要少许调用,你就能够在场景中载入预先定义好的物体以及处理。

优点:你不需要对3-D编程了解太多,所以你可以更快上手进入到编程状态,并且你能够通过编写少量的代码来建立明确的3-D效果。

缺点:比起立即模式,保留模式速度不够快,也不够灵活。

如果你仅仅只需要在你的应用程序中添加标准的3-D功能,或是没有时间来开发你自己的复杂的几何函数,则保留模式能更好的满足你的需要。

立即模式

Direct3D立即模式API提供同着色和硬件加速器之间的底层的,设备无关的通信。对于那些具有相当多3-D编程经验的开发者,或是对于那些已经存在大量的3-D代码,而希望将它们移植到Direct3D上的开发者来说,立即模式是较好的选择。

优点:你可以因此进行你自己所希望的场景着色和场景管理。这将给你的应用程序带来更多的灵活性,并且一旦你按照你独特的需要对之进行优化,你就可能得到比较好的性能。

缺点:你必须自己来完成你的场景的着色和场景管理,并且你将需要了解更多有关3-D编程的知识。

如果你是一个热门游戏程序员,对编制高性能,更加酷的3-D效果更感兴趣,并且你有你自己的一套开发函数来完成它,那么你可能会嘲笑我们所提供的这套想法是一个优柔寡断的,容易使用的,高级别的接口,那么立即模式中将会到处写着你的名字。

Direct3D特性以及APIs

Direct3D的主要特性在下表中列出。

为了给你一个更好的想法,以便你能更好的使用保留模式和立即模式进行工作,我已经在下一节理列出了APIs的清单以及对它们的简短的描述。在SDK文档中包含了对于保留模式和立即模式两者的综合详细的API的参考。

保留模式

表2列出了一些只针对保留模式的特殊的特性

在保留模式API集合中可以使用的对象和功能的常规种类包括:

动画:使用动画对象,你可以变动一个可视的,有灯光照明的,以及具有视点的物体的位置,方向以及缩放比例。这是通过设置关键帧来完成的,这些关键帧同位置,方向以及缩放比例操作的时间值相关联。要使物体活动起来,你的程序需要重复不断地调用时间设置函数;然后由系统从关键帧值中计算应该被插入的位置。动画对象可以是群体的,允许同时活动多个对象。

设备:在Direct3D中,一个设备对象是指通过着色所要显示出来的可见物体。设备能够直接在屏幕上着色,在窗口中着色,或是在应用程序内存中着色。

色彩模式:保留模式支持两种色彩模式─一种是RGB模式,另一种是单色模式(也叫做平滑(ramp)模式)。如果需要牺牲色彩来获取最大的性能时就需要使用平滑模式。

表面:一个表面是一个多面体(mesh)中的单个多边形。方法允许你从顶点构造表面,并对之设置色彩,纹理以及表面的材质。表面可以被存储在数组中,以便多个表面进行相同的操作。

帧:帧用于定位物体的场景。每个物体都有同它的父帧相联系的位置,多个帧组合起来就形成了一个场景。帧以一种分级的方式存在,场景本身是根帧(无父级的帧)。方法允许你建立帧,添加帧,删除帧,也可以获取一帧的父帧和子帧的信息。另外,你可以在子帧和父帧之间进行位置,旋转度的添加或修改,以及缩放变形等。

灯光:灯光依附于帧,在场景中对可视物体进行照明。有五种类型的灯光可以使用:环境光,直射光,平行光,点光,以及探照灯等。

材质:方法允许你设置一种材质的放射性以及镜面特性,它们用于定义物体表面反射光源的方式。

阴影:一个带有阴影的物体可以通过指定光源、物体投射出阴影、以及阴影所在的平面来创建。

纹理:纹理可以被映射的表面上或是直接进行着色。纹理操作子程序包括了一些有用的方法,如设置或获取纹理的颜色,控制纹理如何映射到表面上,以及将纹理设置为透明等。另外,纹理的质量可以通过使用改进映射的方法进行改善,这种方法提供预滤波,以对同一图象的较低的分辨率进行改进。

用户可视对象:保留模式支持应用程序定义的对象,程序员可以将之添加到场景中并进行着色。

视点:当场景在它被由3-D坐标转化为2-D坐标以在屏幕上显示之后,视点定义了实际可见的部分。摄像机控制方法设置位置,方向,以及视点的方位。程序员可以在透视和正视之间进行选择,并且可以设置可见柱体的前后剪贴位面。视点的界面同时也是被指定的从3-D到2-D空间实际上变形的地方。

扭曲:扭曲用于定义纹理是如何映射到一个可视对象上的。程序员可以选择平面,圆柱面,球面或是铬扭曲模式。

立即模式

大多数的立即模式接口中定义了在保留模式接口中所描述的功能的子集。这些接口提供了设备,纹理,材质,灯光,以及视点功能,典型地,会放弃一些手持功能以利于性能和/或灵活性。

一个需要注意的例外是ExecuteBuffer函数,它在保留模式API中不存在。一个执行缓冲是跟随在一系列指令后面的顶点,这些指令用于操作这些顶点。此功能使得应用程序自定义着色管道成为可能;变形和灯光模块两者都无效,并且预照明或预变形的顶点可以被供给光栅模块。

DirectX 2 SDK中的Direct3D

这一节将帮助你从DirectX 2 SDK中快速地找到所需要的Direct3D信息以及组件。

SDK中包括了如下的组件:

DirectDra──提供对满屏显示内存的直接访问,以及硬件的粘贴和缓冲剪贴性能。

DirectSound──包括对声响混音和回放的硬件和软件的支持。

DirectPlay──支持通过一条调制解调器连接或是网路连接进行多媒体游戏。

Direct3D──包括3-D图形接口。

DirectInput──支持游戏杆的输入(已经集成在Win32中)。

AutoPlay──允许允许基于CD的游戏在CD被插入CDROM中时的自动运行(已经集成在Win32中)。

安装DirectX 2 SDK

安装SDK是一个快速的毫无痛苦的过程(当然前提是你是一个够狂热的顽固分子,能够忍受将它从网站上下载下来的过程!)。从CD上完全安装DirectX 2大概要5到10分钟的时间,需要大约60MB的硬盘空间。选择自定义选项进行安装可以允许你选择要安装的组件,组件的清单见表3。

表3 自定义安装选项。

你可能只需要Direct3D和DirectDraw组件,但是安装程序不允许你仅仅只安装SDK的一部分内容。在表3中所示的内容就是它给定的东西。如果硬盘空间对你来说非常宝贵,你可以跳过对DirectX媒体的安装;它只是在你的代码中作为样例以及被查看器所使用。二进制样例文件以及代码覆盖了许多技术知识,你可能并不对所有的样例文件都感兴趣。安装程序不允许你挑拣和选择,但是你可以先将这些二进制样例文件和代码全部安装,然后再将你不需要的东西删掉。还有,“狐狸和熊”以及“Immortal Klowns”并不是Direct3D的演示。让我们实际一些,就是:如果你过分在乎几兆字节的空间,那么你几乎不可能是一个真正的3-D程序员。

基于本文剩余部分要达成的目的,我假设你已经将SDK安装在\dssdk目录(缺省目录)中了。如果你将SDK安装在了其它的地方,我想你应该是足够聪明的,能够自己进行必要的替换。

文档

在线帮助包含在\dxsdk\help\directx.hlp文件中。对于所有的DirectX 2 SDK组件来说,此文件是最主要的文档,并且包括浏览,教程,以及参考。

在\dxsdk\docs目录中有许多Microsoft Word文件和文本文件,这些文件中包含的内容同帮助文件中的内容相重复,但是它们的格式更加便于阅读(或许你希望将它们打印出来以便更好地学习)。表4列出了在此目录中同Direct3D有关的文件。

表3 dxsdk\docs目录下同Direct3D有关的文件名称

二进制和库文件以及头文件

工具和实用程序可以在\dxsdk\sdk\bin目录中找到。如果你安装了二进制的样例文件,它们将也会出现在这个目录。正如你所猜测的,头文件和库文件分别包含在\dxsdk\sdk\inc和\dxsdk\dsk\lib目录中。

如果你使用nmake工具通过操作makefiles文件来进行程序的构造,则你的环境变量需要被正确地进行设置。在SDK安装完毕后,如果你拷贝了样例文件所使用的makefile文件,则你应该准备好对样例文件进行编译,你自己的程序也是如此。如果你使用了一个不同的创建进程,你将不得不往您的连接列表中添加适当的目录,以创建你自己的makefile工程文件,等等。

样例代码

样例程序位于许多不同的地方。在SDK有三个演示游戏:“狐狸和熊”,“Rockem”以及“Immortal Klowns”。当然,仅仅“Rockem”使用了Direct3D。这些游戏的编译版本分别可以在目录\dxsdk\foxbear,\dxsdk\rockem,\dxsdk\iklowns中找到。此外,这些游戏的源代码也包含在SDK中,它们与同大约50个其它的样例程序以及实用程序一起,位于\dxsdk\sdk\samples 目录中。

\dxsdk\sdk\samples\readme.txt文件对创建过程作了简要的解释。在\dxsdk\sdk\samples目录中有大约一半的样例是针对Direct3D的。\dxsdk\sdk\samples\d3dsamp.txt文件则解释了到底哪些文件是针对Direct3D的,并且还对每个样例文件进行了简短的描述说明。

教程

SDK中带有一些手把手教学的教程样例:一些针对立即模式和保留模式的教程。如果你有时间阅读的话,它们将带给你一个有关Direct3D编程的非常速成的教学。它们将使你经历调用和显示3-D对象所需要的每一个步骤,并演示主要的功能。这些教程大概有12页纸那么长,你可以在DIRECTX.HLP文件中找到它。

媒体以及查看器

查看器既是一个样例,也是一个实用程序:它调用预先定义的对象(存储在.x文件中)并使你围绕这灯光,形状,颜色等播放。使用它可以操作位于/dxsdk\sdk\media目录中的对象。

另外的资源

3D编程是一件庞大的,复杂的事情,所以理所当然Direct3D也是非常庞大和复杂的。现在你应该知道你到底是已经准备好投入到Direct3D编程中呢,还是首先需要多学习一点知识。如果你已经具备了许多3-D编程的经验并且已经懂得了在这篇文章中迄今为止的每一件事情,则恐怕你将仅仅只需要阅读SDK的文档以及开始编程了。如果你举棋不定,或是仅仅计划采用保留模式做很少的一些事情,在SDK文档中有一个非常小的技术背景叫做“3D编程的一个基础技术”会对你有所帮助。如果你完全迷失了方向,你可能需要阅读一个图形文本或是首先继续进行其它的教学途径。

下面是针对所包含的信息的额外资源的一些建议。

因为DirectX API集主要基于COM,你将需要了解一些有关使用COM的知识。不用担心!操作COM对象是一门飞速发展的科学,但是使用它们则是相当简单的。许多有关COM的信息可以在库的科技文章中找到。

交互媒体/游戏网站

如果你现在还没有看到交互媒体/游戏网站http://www.microsoft.com/ directX/,你需要赶快浏览一下。在这里开发者们可以发现许多有关Microsoft的交互媒体技术最新的信息。这里你将会找到一些技术文章,技术浏览,资源清单,以及FAQ,即高频问答,一句话,这里有许多你所需要的能够使你成功应用Microsoft技术来编写应用程序的信息。

站点包括了一个反馈页,我们希望你觉得它有用。当我们不能一对一的提供技术支持时,我们对一些简单的问题进行回答,并且将一部分注意力转移到内容的需求上来。你对什么技术带有问题呢?你希望我们在文章中提到什么样的问题呢?让我们知道。

错误报告以及支持

报告错误请发送到dexbugs@microsoft.com。注意此处只接收错误包括,不进行技术支持。

附录:在DirectX 3 SDK中有哪些新特性?

编者按:这一节是从DirectX 3 SDK中抽取的,它已经被作为一个快速的参考加到Sue Ledoux的文章中。完整的DirectX 3 SDX文档可以在MSDN的库中找到。

相较DirectX 2 SDK而言,DirectX 3 SDK提供了更多的服务─以及更多的创新门径。尽管DirectX 3 SDK中包含了额外的功能和服务,你使用DirectX 2 SDK或是最早用DirectX 1 SDK所编写的所有的程序仍然可以成功的编译,不需要任何改变。

这篇附录的目的在于帮助你在熟悉了DirectX 2 SDK的基础上快速了解DirectX 3 SDK和DirectX 2 SDK两者之间的显著不同。这些不同点我们按照组件进行分类,列在下面。

DirectDraw:对API没有进行改变。文档已经被更新,其中包括了一系列的教程,这些教程可以对你一步一步地进行指导,以帮助你学习如何编写简单的DirectDraw应用程序。要想阅读这些教程,请在DirectDraw文档中查看“DirectDraw教程”部分。

DirectSound:在DirectX 3中包含了DirectSound3D功能,它允许一个应用程序改变声源出现的位置。应用程序可以为定向的声源指定声音的锥体(cone),为移动的声音提供多普勒偏移(Doppler-shift)效果,还可以指定这些不同效果所发生的距离。如果需要更多有关DirectSound新特性的信息,请参看文档中DirectSound一节“三维音响”部分。

DirectPlay:DirectPlay已经变成了一整套具有继承和延续性的技术,它不但提供了一种方法以使应用程序之间相互进行通信,而不依赖于传输,协议,以及在线服务,而且还不需要依赖中间商(matchmaking)的服务。为了实现这些新的技术,添加了IDirectPlay2,IDirectPlay2A以及IDirectPlayLobby接口。如果需要更多的有关DirectPlay的新特性,请参看文档中“DirectPlay版本3中有哪些新特性”部分。

Direct3D:对API没有进行改变。保留模式的教程已经被更新,简化。要阅读此教程,请参看Direct3D文档中“Direct3D保留模式教程”部分。

DirectInput:DirectInput现在包括了对鼠标和键盘输入设备的支持,就象对游戏杆的支持一样。

DirectSetup:在DirectSetup主包括了一个新的功能,它帮助应用程序在安装的过程中在注册库中创建适当的输入。

AutoPlay:AutoPlay的文档现在已经包括了Windows NT的信息。

备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘