时间放在建立一个健壮的 3D 地形引擎上。
当你在源代码里遇到这些类的时候,请参考相关的源代码来更好的理解它们的功用吧。
附录 A“Gaia 工具类”也提供了其中一些比较常用工具类的概括介绍。
同时附录 B“浮点数技巧”解释了我们引擎中部分对浮点数类型的操作。
在这一部分的最后,我们将为第一个演示程序构建其所有的部分。
这个程序是一个模型查看工具,用来加载常用的 Direct3D X 文件格式(.X) ,附上纹理,查看动画。
它同时也提供了加载和查看包含了我们将编写的 HLSL 着色器的 D3DX 效果文件(.fx) 。
8第一章 DirectX 9.0 和 D3DX 入门 9 先向那些初入微软视窗平台的三维图形编程的读者介绍一下,DirectX 是高性能的底层库,它给我们提供了面向多种底层硬件的应用程序接口(API) 。
DirectX 以面向组件的方式构成,用来直接与 PC 的关键硬件组件进行交互。
对于我们的引擎,我们主要关心的是其中的一部分,DirectX Graphics。
再者,我们将与 DirectX Graphics 的 3D 功能打交道,其通常被称为 Direct3D。
DirectX 还提供了其他接口,譬如读取用户输入,产生音效,提供网络连接,但这些都不是本书讨论的范围。
在我们进入本书之前,我们默认读者已经对 DirectX 有了大致的了解。
尽管我们会提供关于我们将使用到的 DirectX 组件的大致介绍,不过读者还是可能需要查阅 DirectX 9.0 SDK 的帮助文档来了解关于 DirectX 和 3D 编程的更多细节。
一旦 SDK 安装之后,我们就可从视窗的开始菜单中打开帮助文档了。
设置 Visual Studio.Net 当 DirectX 9.0 安装好之后,它会自动更新微软的 Visual Studio 产品来使用 SDK 的头文件和库。
除此之外,Visual Studio.Net 用户还能获得一个添加在.NET 工程浏览器上的 DirectX 调试工具(译者注:这个工具是 DirectX control 么?有知道的朋友请告诉我一下) 。
如果你的 Visual Studio.Net 是后于 DirectX 安装的,那么你就得手动设置 DirectX 的 Include 和 library 文件夹了。
当我们使用 Visual Studio.Net 以外的编译器时我们得附加说明一下。
Direct3D 扩展库(D3DX)包含了对英特尔 SSE 指令集的支持, 但只对微软的 Visual Studio.Net 有效(具体来说,是指 Visual Studio C 7.0 以及更高的版本) 这是因为早先的 Visual C不支持 16 字节内 。
存对齐(不过有处理器补丁可以解决这个问题) 。
由于 16 字节对齐对于许多如 SSE 的操作内存指令集至关重要,故而当编译器不支持时,D3DX 不会启用这些指令集。
而由于处理器补丁安装了也无法被 D3DX 检测到,所以即使我们安装了补丁,但 SSE 依然不会被开启,除非我们手动将 Visual C的预处理定义修改至 7.0 的版本值或是更高的版本值。
如果你正在使用一个非微软的编译器或者还在使用微软较早版本的 Visual C的话, 你可以手动设置预处理定义来开启 SSE 对于 D3DX 库的支持。
但是,在修改之前你首先该确定你的编译器的确支持使用__declspecalign16语句。
如果你对此不太清楚的话,可以参阅编译器文档来查看相应信息。
一旦确认之后,你可以将下面的语句写到 makefile 文件或者工程设置里来假装我们已经安装了 Visual C 7.0 编译器从而开启了 SSE 对 D3DX 的支持。
define _MSC_VER 1300 //假装安装了 VC 7.0 SDK 依赖文件安装在名为 Include 和 Lib 文件夹内。
其中包含了 DirectX 程序编译所需的头文件以及链接用的库文件。
相应的,它们都可以在 DirectX 的安装目录下找到。
例如,如果 SDK 被安装在默认路径c:DXSDK 下,那么这两个文件夹则为 c:DXSDKInclude 和 c:DXSDKLib。
将这两个路径加入你的编译器和链接器的搜索路径列表里。
阅读你的编译器文档可以获得更多这方面的内容。
我们推荐将这些目录放在搜索的顶端。
对于微软 VisualStudio 的用户,可以在名为”Compiling DirectX Samples and Other DirectX Applications”帮助文件中得到指导。
同样,位于 SDK 根目录下的 dxreadme.htm 文件也包含了为操作系统和编译器设置 DirectX 的相关信息。
(译者注:在我的 09 年三月的 DX 里,我并没找到这两个文档,不过前者可以在微软的网上找到 http://doc.51windows.net/Directx9_SDK/url/directx9_sdk/intro/program/compiling/compilingdx9.htm) 10Direct3D 示例程序框架 为了给 SDK 里的所有示例程序提供一个通用的基础,微软提供了一系列简单的工具类来建立这些示例。
尽管对于我们的游戏引擎来说这些框架类并不一定是必要的,但他们其中一部分包含了主程序类,它们可以用来处理大多数的应用程序请求。
这些类可以处理 DirectX 的启动过程,包括检查硬件视频设备,判断支持的显示模式和特性设置。
他们也提供了面向视窗操作系统的接口用来处理窗口消息和平滑处理窗口到全屏的过程。
尽管我们认为整个示例框架并非是创建单独程序最优,最高效的方法,但是诚然地来说,它足够满足我们的需要。
我们的引擎也使用示例框架来建立包含 DirectX 的基本程序,操作某些文件,并且提供额外的渲染支持。
独立的 D3D 程序框架的代码在引擎代码文件内也有提供。
这么做就确保了即使新版 DirectX 有了改动亦可以正常编译, 但 链接。
DirectX SDK 发布新版本之后,示例框架或许也需要更新来使用新版本的新特性。
示例框架包含的文件对已经列在表 1.1 中表中同样了标出了各个文件集提供的功能。
这些文件包含在 SDK 安装文件夹下的 SamplesCCommon 内。
就如表 1.1 所说明的,我们不准备是用 D3D 示例框架的所有文件。
例如,D3DFile.h 和D3DFile.cpp 提供的加载网格函数我们并不需要。
我们将使用扩展的 x 格式文件来加载我们自己的数据,这个我们会在稍后讨论。
这个加载技巧可以满足我们存储和显示网格信息的需要,所以 D3DFile 提供的对象就对我们没什么用了。
除此之外,利用 CD3DFont 类提供的文本输出能力来且仅用作显示调试信息。
当我们需要一个真正的文本显示方法的时候,为了追求更高的效率,我们更愿意设计一个自己的方法。
尤其是当只能提供 3D 文本显示的 CD3DFont 类对我们不再有用的时候。
(译者注:CD3DFont 底层使用的是 Direct3D) 表 1.1 微软 DirectX 示例框架库提供的文件 文件对(.H 和.cpp) 功能 D3DApp 包含 CD3DApplication 类为 Direct3D 程序提供整体框 架。
D3DEnumeration 包含 CD3DEnumeration 类,它设计用来查询独立视频 硬件,并报告其支持的显示模式和特性设置。
D3DFile 一系列读取,显示 CD3DMesh 对象的类。
我们的程序中 将不会使用着两个文件。
D3DFont 掌管了 CD3DFont 类,能够简单的将 2D 文字打印到 3D 屏幕上。
我们用它来输出调试信息。
D3DSettings 提供了 CD3DSettings 和 CD3DSettingsDialog 类,它 们提供方法来显示当前程序的显示设置以及用来改变 显示模式的对话框 D3DUtil 一些 Direct3D 示例要用到的工具函数,包括了一个简 单的摄像机类 CD3DCamera 和一个名为 CD3DArcBall 的 用户输入设备。
DXUtil DirectX 工具集合,包括字符串操作函数,注册表访问 11 函数以及一个简单的可变长数组类 CArrayList。
出于简化设计的考虑,我们将为我们引擎使用 D3D 示例程序的相同对话框类。
单独的程序更可能使用自己的接口来设置显示模式的选项,不过我们旨在讨论地形渲染,所以我们不花时间在这上面了。
因此,在我们建造引擎的时候,我们将利用 D3DSettings 文件。
使用 CD3DSettingsDialog 类也就意味着我们也必须包含 D3DRes.
上一篇:
【精品文档】:给学计算机的人的肺腑之言
下一篇:
产品定价因素分析MBA论文:以印度移动应用程序定价分析为例