电脑入门:D3DFrame 入门



欢迎关注“Driving DirectX”第 2个问题MSDN _disibledevent=>
使用公用框架 D3DFrame为我们提供了公共平台在此平台上我们可以展开各种功能讨论

些图形芯片厂商使用 D3DFrame 变体作为自己举例;例如 ATI SDK 使用具有某些 ATI 专用附件 D3DFrame 版本使用公共框架提供了公共平台在此平台上可以进行如何启用各种功能讨论使用公共框架也使我能够避开 D3D 般“基本知识”这并不意味着 D3DFrame 可以作为产品代码;相反它只是编写短小精悍举例“方便”工具而已

开卷语

在开始介绍说明 D3DFrame 的前让我们回顾下 DirectX SDK 基础知识并提供有关 SDK 开发共同语言请确保在您建立环境中查找头文件和库文件目录命令是正确常见问题是这些命令导致了许许多多编译和链接安装 DirectX SDK 默认路径是 \\mssdk在安装 SDK 时您可以控制该路径运行时头文件和库文件保存在 \\mssdk\\ 和 \\mssdk\\lib 中

SDK HTML Help 是大体了解 DirectX 主要资源特别是对 D3D我在解决了某些问题以及有了某种想法的后多次重读了该文档中段落于是有了温故知新感觉“喔原来这么回事”举例代码是学习 DirectX 另个最好工具“Direct3D 立即模式”举例代码保存在 \\mssdk\\samples\\multimedia\\d3dim 中在 \\d3dim 下面为 \\bin、\\、\\lib、\\media 和 \\src以准备建立形式存在所有举例可以在 \\src 中找到这取决于 \\ 和 \\lib并且使用 \\media 中艺术内容SDK 安装将预先建立可执行文件植入 \\bin 下我强烈推荐用举例来进行试验并检验使用它们列出功能所需代码这是快速使用 D3D 最快思路方法

调试 DirectX 应用可能是个难题让我来介绍几种使工作更轻松有用小工具和技术DXDiag SDK 实用工具提供有关 SDK 安装信息定要对您系统了如指掌如果发现任何缺陷则需要这些信息来报告缺陷而且定要在 SDK 安装时选择调试运行时选项如此就能保证在调试运行时进行开发调试运行时包含检查和报告这能真正帮助您解释代码在哪里出现了偏差调试运行时允许设置启用运行时内部调试报告级“DirectX 控制面板”允许开发人员将报告级设置为 0 到 5我在调试时般设置为 3而对于特别严重缺陷要设置为 5任何调试可以跟踪调试Visual C GUI 调试提供了调试输出窗格专门用来跟踪调试Visual C GUI 调试只有在使用下列系统时才能调试全屏独占应用:

  1. 多监视器系统
  2. 远程调试
在这种思想指导下通常明智做法是产生代码并先在窗口模式下调试然后再专注于全屏幕

高级视图

让我们现在回到 DirectX 7.0 D3DFrameD3DFrame 是 Direct3D SDK 举例举例框架如果您确实想了解举例是如何工作 — 不是了解举例中列出功能 — 必须对 D3DFrame 如何工作有基本了解首先我会带您进入包含所有必须了解内容 D3DFrame 高级视图并且使用 D3DFrame 编写自己举例对于象谚语中样好奇我将就 D3DFrame 主要部分给出更详细等级概要介绍以便解释如何提供应用接口在随后讨论中我将在举例应用 D3DFrame 同时介绍有关 D3DFrame 更多内容


\" width=234 border=0> 图 1. D3DFrame 项目视图

D3DFrame 由 7 个模块组成:

  1. D3DApp 展示了该举例使用应用接口
  2. D3DFrame 提供了应用接口使用框架“在该框架下”进行 voodoo 会很顺利
  3. D3DEnum 包含对驱动、设备和模式枚举支持
  4. D3DTextr 提供纹理支持
  5. D3DFile 提供 x-文件支持
  6. D3DMath 给出数学实用
  7. D3DUtil 包括剩下其他各种有用
每个模块都是由个 .cpp 源文件和 .h 头文件组成源文件位于 d3dim\\src头文件位于 d3dim\\框架库位于 d3dim\\lib鉴于本文我主要讨论 D3DApp 和 D3DFrame

检查用户编写

D3DApp 模块包含类 CD3DApplication该类在 D3Dapp.h 文件中为举例发布接口如下所示:

牋牋 // 应用创建可替代 3D 场景virtual HRESULT _disibledevent=>

要使用举例框架创建新 D3D 应用只要创建新项目和这些实现;让我们为 D3Dframe 举例“公共接口”这正是 D3D SDK 举例所做让我们看看这些:

OneTimeSceneInit 允许举例完成次性化任务例如加载纹理和 x-文件建立计算数值生成结构和类似操作通常任何次性资源分配应该在这里完成在每个应用执行周期中OneTimeSceneInit

InitDeviceObjects 给举例提供了化每个设备对象机会通常情况下执行诸如将纹理位加载到设备表面、设置矩阵、设置光源以及填充顶点缓冲区等等操作化第个设备以及每当设备有变化时 InitDeviceObjects

DeleteDeviceObjects 包含举例用于删除在 InitDeviceObjects 中创建对象代码这两个是成对匹配定要使您设备专用资源分配和删除匹配否则每当设备改变时将泄漏内存每当设备被取消时 DeleteDeviceObjects

Render 是所有展现发生地方在这儿清除框架缓冲区并 BeginScene/EndScene 对的间所有展现代码每帧 Render

FrameMove 提供了收集每帧动画任务简便思路方法更新矩阵纹理调整对象调整和其他随时间变化动作都发生在 FrameMove每帧 FrameMove

RestoreSurfaces 使举例测试丢失表面并重新恢复它们使应用可以继续执行在表面因应用切换而丢失时 RestoreSurfaces

FinalCleanupOneTimeSceneInit 配对并提供次取消个应用对象思路方法定要使清除代码和化代码匹配避免内存泄漏

D3DFrame 内部

旦掌握了应用用途后就该看看什么东西会使它们准确运行除了公共接口以外CD3DApplication 有两个值得检查部分首先CD3DApplication 包含下列成员:

HRESULT Initialize3DEnvironment;HRESULT Change3DEnvironment;HRESULT Render3DEnvironment;VOID Cleanup3DEnvironment;

这些使用了公共接口和类 CD3DFramework7来处理 D3D 应用许多工作

Initialize3DEnvironment CD3DFramework7->Initialize化举例框架然后公共接口 InitDeviceObjects化设备专用对象构造该代码用于处理在化过程中可能发生

Change3DEnvironment 为应用处理驱动、设备和/或模式改变公共接口 DeleteDeviceObjects 释放旧设备对象然后建立新设备状态 Initialize3DEnvironment 以创建新设备环境

Render3DEnvironment 完成 5个重要任务首先它检查合作状态以保证它可以继续展现接着它为随时间变化动画公共接口 FrameMove然后公共接口 Render 以完成绘制如果启动了统计则进行绘制最后使用 CD3DFramework7->ShowFrame 显示帧如果显示帧导致表面丢失情况则框架和公共接口 RestoreSurfaces 都将被

Cleanup3DEnvironment DeleteDeviceObjectsFinalCleanup 为应用结束做准备

我们不要忘了 D3D 应用实际上是 Windows 应用Win32 应用内容核心隐藏在成员中:

virtual HRESULT Create( HINSTANCE, TCHAR* );virtual INT Run;virtual LRESULT MsgProc( HWND hWnd, UINT uMsg,WPARAM wParam, LPARAM lParam );

在往下深入讲解的前让我们看看当使用 CD3DApplicationWinMain 变为什么在本例子中WinMain 是这样结束:

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ){CMyD3DApplication d3dApp;( FAILED( d3dApp.Create( hInst, strCmdLine ) ) ) 0; d3dApp.Run;}

这是非常简单 WinMain并且隐藏 CreateRun 动机是明确它们是 WinMsgProc 是 Windows 消息处理在内部它们都使用 xxx3DEnvironment 和类 CD3DFramework7 来管理 D3D 应用以及 Windows 应用

Create 使用模块 D3DEnum 提供对枚举驱动、设备支持以及当前硬件模式支持;它还选择个默认值然后公共接口 OneTimeSceneInit旦创建了用户对象 CD3DFramework7 对象将例子化需要注意 Win32 细节注册窗口类然后创建窗口最后 Initialize3DEvironment 创建新设备环境



Run 完成两个重要任务:Windows 消息循环处理和 Render3DEnvironmentRun 也为 WM_QUIT 消息和退出做准备

MsgProc 是 Windows 消息消息处理它依赖并使用 xxx3DEvironment CD3DFramework7 对象管理 Win32 和 D3D 应用

现在我已经大体介绍了 CD3DApplication工作方式以及它如何使用 CD3DFramework7下面再深入研究 CD3DFramework7 和它内部

在类 CD3DFramework7 中主要繁重任务是由下面两组成员完成:

// 创建框架HRESULT Initialize( HWND hWnd,GUID* pDriverGUID,GUID* pDeviceGUID, DDSURFACEDESC2* pddsd,DWORD dwFlags );HRESULT DestroyObjects;// 框架类内部HRESULT CreateZBuffer( GUID* );HRESULT CreateFullscreenBuffers( DDSURFACEDESC2* );HRESULT CreateWindowedBuffers;HRESULT CreateDirectDraw( GUID*, DWORD );HRESULT CreateDirect3D( GUID* );HRESULT CreateEnvironment( GUID*, GUID*, DDSURFACEDESC2*,DWORD );

让我们先看第InitializeDestroyObjects

Initialize 是创建框架内部对象公共它在内部建立些状态然后依赖 CreateEnvironment 去完成大部分艰难工作

DestroyObjects 仅仅释放 Initialize 中创建所有 DirectX COM 对象

CreateEnvironment 创建框架内部对象它决定设备内存类型然后 CreateDirectDraw旦它们不正常CreateFullscreenBuffersCreateWindowedBuffers 就会创建前台和后端缓冲区最后CreateDirect3D 创建 3-D 设备并且 CreateZBuffer 创建并连接 Z-缓冲区

鉴于理解 D3DFrame 我们不需要了解 CreateDirectDrawCreateFullscreenBuffersCreateWindowedBuffersCreateDirect3DCreateZBuffer 内部详细实现它们是直接相关 — 这句就够了而对于那些想了解如何精确实现源代码正等待他们去研究

CD3Dframework7 中值得最后几组提供了另外些对展现支持它们是:

// 帮助展现HRESULT RestoreSurfaces;HRESULT ShowFrame;HRESULT FlipToGDISurface( BOOL bDrawFrame = FALSE );VOID Move( INT x, INT y );

对于这些内容我只是粗略带过它们在先前检验中使用并且它们使用方法可以轻松地从上下文导出

要创建新举例现在只须实现个类诸如下面所示 CMyD3Dapplication:

CMyD3DApplication : public CD3DApplication{protected:HRESULT _disibledevent=>完成的后您就拥有个有效 D3DFrame 举例了可以看见它在 D3D SDK 举例中反复出现或者等下个专栏仅提供空实现功能将导致空 D3D 应用我已经完成它将作为以后专栏基础这里我也提供了源代码运行在窗口中空 D3D 应用如图 2 所示


\" width=311 border=0> 图 2. D3DFrameApp 举例

结束语

作为下面几部分难题请参阅有关下列内容 4篇 DirectX 7.0 Direct3D 文章:

  1. 虚拟光
  2. 两篇有关 Alpha 混合物文章:
    1. 顶点中 Alpha
    2. 纹理中 Alpha
  3. DotProduct3 展现
“虚拟光”文将介绍说明如何操纵 Direct3D 光以避开大多数硬件施加 8光限制Alpha 混合物文章将介绍说明两种区别透明技术:顶点中透明和纹理中透明DotProduct3 文章将讨论非常好 DOTPRODUCT3 操作符及其用途(提示可将 DOTPRODUCT3 视为广义从矢量到像素查找)每篇文章都包含个基于 D3DFrame 举例

欢迎您提出反馈!欢迎您通过下面地址将您评论、问题、主题思想或者您对本专栏涉及主题区别意见告诉我不过请不要期待单独回复或发给我请求支持问题请记住Microsoft 有个活动邮件列表DirectXDev供志趣相投开发者作为论坛来共享信息Web 界面位于 http://DISCUSS.MICROSOFT.COM/archives/DIRECTXDEV.html(英文)提问的前请阅读 FAQ它位于 http://msdn.microsoft.com/library/techart/dxfaq2.htm(英文)



Tags:  黑客入门 电脑入门

延伸阅读

最新评论

发表评论