您的位置:首页 > 编程语言 > C语言/C++

译:Real-Time 3D Terrain Engines Using C++ And DirectX9(2)

2009-02-05 23:44 176 查看
第一章以DirectX 9.0和D3DX开始
对Microsoft Windows平台的3D图形程序新手来说,DirectX
是提供底层多媒体应用程序接口(API)的高性能,低级的库。DirectX是以组件建立的,旨在直接访问PC硬件。在这个引擎中,我们主要关心的仅仅是这些组件中的一个,DirectX Graphics.而且,我们将具体处理DirectX Graphics的3D功能,即Direct3D。另外DirectX 为读取用户输入,音频,并且提供网络连接提供了接口。但是这些在本书中不会用到。
我假设读者在学习这本书以前对DirectX已经有一定的了解。当我们提供到一个我们正在用的DirectX简略的大纲和组件时,读者一般需要研究一下DirectX 9.0 SDK 文档去了解更多的DirectX
和3D 编程的细节背景。SDK安装好以后,这个文档可以从Windows 启动菜单找到。
设置VISUAL STUDIO.NET

当DirectX 9.0 SDk 安装好后,它利用SDK的头文件和库文件自动更新Microsoft Visual Studio 的设置。另外,Visual
Studio.NET 用户增加了DirectX 调试工具栏。(工具---选项---调试)如果在安装了DirectX后安装Visual
Studio.NET,为了编译和连接正确,需要手动设置DirectX的include文件夹和library文件夹。

当利用除了Microsoft Visual Studio.NET的编译器还有一个警告,Direct3D扩展库(D3DX)包含支持Intel 数据流SIMD扩展(SSE)指令,但是仅仅是在利用Microsoft
Visual Studio.NET编译时,这是因为支持16字节内存对齐在早些的没有安装额外的处理器补丁Visual c++版本上不支持。这是因为16字节对齐需要很多SSE内存访问指令,这些指令在D3DX上不能用除非编译器支持内存对齐的分配被保证。因为先前的处理器补丁不能被探测到,在D3DX库中的Intel SSE-aware 代码不能被使用除非处理器鉴别到Microsoft Visual c++的编译器版本是7.0或者更高。
如果你用的是非Microsoft
的编译器,或者你用更早的Microsoft Visual c++版本,你可以自己设置这个处理器定义来确保D3DX库中SSE的支持。然而,这只有当你确定16字节内存对齐分配通过非标准的 __declspec(align(16))声明是被你的编译器支持时才起被执行。如果你不确定是否支持这种对齐方式查看你的编译器文档。一旦核实后,你可以在你的makefile或者工程设置添加以下处理器定义,来模仿先前的Visual c++ 7.0 编译器去保证在D3DX中支持Intel SSE。

#define _MSC_VER 1300
//模仿VC7.0
SDK的依赖文件主要存在在Include和lib这两个主要的文件夹,这些文件夹包含编译DirectX的必要的头文件和链接必要的库文件。这些文件夹在DirectX SDK 安装目录下。例如,SDK是安装在默认路径,C:/DXSDK,这些需要的文件夹在C:/DXSDK/Include和C:/DXSDK/Lib.设置你的编译器和链接器利用这些文件夹的方法是添加它们路径到查找目录编译列表下。为了添加这些文件夹到正确的查找路径,你需要查看你的编译器文档了解更多的细节。我们建议这些文件夹设置在各自查找路径的第一个路径上。对Microsoft Visual Studio的用户来说,位于SDK路径下的文件夹下的“Compiling
DirectX Samples and Other DirectX Appications”的DirectX SDk帮助文件dxreadme.htm提供这些操作,同时包含为你的编译器和操作系统设置DirectX 的信息。
Direct3D 应用程序框架例子:
为所有使用DirectX SDk 的例子程序提供一个共同的基础,Microsoft
提供了一套在这些例子上都适应的类。这些框架不一定用在我们最终的零售产品,例如游戏引擎,它包含一套能处理大多数程序需要的核心应用托管类。这些类处理DirectX一般的应用,包括枚举设备视频,决定显示模式和设置它们支持的特性。它提供一个界面操作来缓解我们处理窗口消息和窗口到全屏显示模式变换等相关操作的压力。当我们不保证整个例子框架对产生一个零售产品是最优和最有效,我们也认可这些元素的使用。
我们的引擎也尽量使用框架来建立一个简单的操作文件,提供渲染支持的DirectX程序,D3DX应用程序框架的源代码文件已经复制到了例子引擎的代码下。做这些是为了保证在以后的的DirectX SDK版本安装后这些例子引擎仍然可以被编译和链接。然而当更新新的DirectX SDk时,这引擎中的框架例子代码可能需要更新一下,来充分利用DirectX SDK新加的有利功能。
在表1.1的文件列表中,框架给出了每个文件的基本功能。这些文件在SDK路径中的
Samples/C++/Common 子文件夹中。
如表1.1所示,我们不打算利用D3D框架中的所以文件。例如,D3Dfile.h和D3Dfile.cpp提供的加载网格我们是不会用到的。我们会通过D3DX利用定制的.X扩展文件加载我们自己的数据资源。这种加载方案利用我们自己的类来储存显示网格信息,所以D3Dfile中提供的对象不会用到。另外,我们仅仅在屏幕上输出调试信息时利用CD3Dfont类的文本显示功能,当我们的程序需要文本显示,为了提高效率,我们最可能定制自己的方法。对CD3Dfont的3D文本显示功能尤其如此。
为了简单期间,在我们的D3D引擎例子中提供了同样的对话框显示模式。一个零售产品可能有它自己的界面来来提供设置显示模式选项。但在我们的的地形渲染开发中不需要定制自己的界面。因此,在我们的引擎中,我们将尽量利用D3Dsettings 文件。使用CD3DsettingsDialog类意味着我们必须包含D3DRes.h文件,它包含了对话框的定义,并且把对话框模板拷贝了我们程序的资源文件。在我们的CD-ROM中提供了已经完成这些工作的例子代码。

表1.1 Microsoft DirectX框架提供的文件
文件(.h和.cpp)
提供的功能
D3DApp
包含CD3Dapplication类,提供使用Direct3D的整体框架。
D3DEnumeration
包含CD3Denumeration类,用来查询视频硬件,显示模式和支持的特性
D3DFile
一套加载和显示CD3Dmesh对象。我们的程序将不用这些文件。
D3DFont
提供CD3Dfont,在3D场景上输入2D文本,我们调试时会用到。
D3DSettings
提供CD3Dsettings和CD3DsettingsDialog类,这些类提供一些方法确定程序当前显示设置并显示DirectX对话框
D3DUtil
Direct3D例子的一系列功能,包含一个CD3DCamera类和一个用户输入设备类CD3DarcBall。
DXUtil
一些DirectX功能,包含字符串操作功能,注册表访问功能和一个简单的可调节大小的数组类CarrayList.
我们将用到的最重要的一个类是CD3Dapplication,这个类提供D3D框架的骨干。如果你已经研究过DirectX SDK 的例子程序,那么你已经有一点熟悉这个类。它提供所有应用托管的设备,从创建主窗口和管理它的消息循环,通过CD3Denumeration类检测托管的视频卡的显示模式和支持的特性。这个类包含一个消息循环,当需要时,它响应读取的windows消息,调用你程序中指定的代码来更新和渲染屏幕。
CD3Dapplication这么有用是因为它也易扩展。它的成员函数是被声明为虚函数,这允许程序员为了特定的功能 从CD3Dapplication继承一个指定的类并且重载它这些成员函数。大部分情况下,D3D例子以这种方式建立,重载CD3Dapplication的虚函数集中在关键的部分。我们的程序也一样,我们会看到一些章节我们建立我们自己CD3Dapplication实例来管理我们的引擎。
当我们可能仅仅需要去直接利用CD3Dapplication接口,在后面,更多的框架类会被用在场景中。理解这引起类的基本功能可以让我们洞察DirectX ,它可以单独做为一个DirectX
SDK的教程。这些类中最显著的是前面提到的CD3Denumeration 类,对于DirectX新手来说,这个类提供了一套查询既存视频硬件和建立支持的显示模式列表功能。枚举显示模式是设置DirectX图形环境的重要一步。通读这个类的功能是学习显示模式枚举可以做为一个很好的教程。
利用D3DX数学库
如前所述,我将用D3DX为我们的引擎提供必要的数学功能。利用D3DX数学库需要基本的3D数学知识。这包括向量数学,矩阵的使用,四元数的旋转,当我们处理三角形和向量时对三角形有一定的了解是非常有用的。事实上,在我们的游戏可能会有复杂的数学知识,在建立一个引擎时,我们只要对此有一些关键的概念就行。
我将对三角形,向量,矩阵,四元数提供一个简单的复习。对需要更多背景知识的读者,DirectX SDK 文档提供了这些专题的导言。在附录D“推荐读物”中的列表有推荐的关于3D数学的书籍,期刊和Web参考。
对开始3D引擎开发的人员来说,这些负责的数学知识似乎是学不完的。对分解这些概念使他们易于理解花太多时间是没有用的。大多时候,一个学术作者将利用公式来表达概念。而不是概念本事。这可能吓着了一些不熟悉这些符号的读者,当出现一个公式时,读者需要停下了仔细研究它。
例如:计算一些数的平均值的公式可以这样写:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: