随着Microsoft Windows平台在游戏开发人员中的广泛接受,它的3D类库就愈来愈流行。但是,目前图书市场上很少有关于Direct3D Immediate Mode API的书籍。《Direct3D技术内幕》就为读者展示了Direct3D的真相和内幕。本书的作者是与Microsoft Direct3D开发组紧密合作的令人尊敬的开发人员。本书的组织结构合理,引导您逐步学习Direct3D API和其他DirectX组件—一让您能够对多数有趣的基于Windows游戏功能进行程序设计的工具。《Direct3D技术内幕》一步一步地带领读者开发3D游戏,因此对于有意学习这项令人激动的技术的游戏编程人员来说,是非常理想的教材。它也适合想发现将实时3D用户界面添加至基于Windows应用程序的方法的任何程序员。《Direct3D技术内幕》所涉及的主题包括:\r\n\r\n .DirectX 7基础\r\n\r\n .通过Direct3D的T&L流水线的转换和照明\r\n\r\n .渲染对象图元\r\n\r\n .使用DirectInput与用户交互并控制力反馈设备\r\n\r\n .纹理处理、雾化、alpha混合以及其他3D基本概念\r\n\r\n .高级纹理处理和其他高级Direct 3D功能\r\n\r\n .优化Direct3D应用程序\r\n\r\n .集成DirectPlay\r\n\r\n 《Direct技术内幕》提供“挖掘工具”.使读者能在Windows平台上创建大多数3D游戏动画功能。从本书中您会找到有关Direct3D内幕的宝贵信息——这些都来自与Direct3D小组密切合作的本书作者。\r\n
\r\n
第1章 DirectX基础 \r\n\r\n 1. 1 DirectX API \r\n\r\n 1. 1. 1 DirectDraw \r\n\r\n 1. 1. 2 Direct3D \r\n\r\n 1. l. 3 DirectMusic \r\n\r\n l. 1. 4 DirectSound \r\n\r\n 1. l. 5 DirectPlay \r\n\r\n 1. 1. 6 DirectInput \r\n\r\n 1. 1. 7 DirectSetup \r\n\r\n 1. 2 Direct3D作为DirectX API时的工作方式 \r\n\r\n 1. 3 使用DirectX API所应了解的知识 \r\n\r\n 1. 3. 1 什么是COM对象 \r\n\r\n 1. 3. 2 AddRef和Release方法的用途 \r\n\r\n 1. 3. 3 C和C++调用DirectX方法的差别 \r\n\r\n 1. 3. 4 返回代码 \r\n\r\n 1. 4 Direct3D Framework \r\n\r\n 1. 5 结束语 \r\n\r\n 第2章 Direct3D程序中的Windows代码 \r\n\r\n 2. 1 Windows代码的组织方法 \r\n\r\n 2. 1. l 用于指定所包含文件和定义GUID的代码 \r\n\r\n 2. 1. 2 CMyD3DApplication和CD3DApplication类 \r\n\r\n 2. 1. 3 建立主窗口和消息处理 \r\n\r\n 2. 1. 4 建立消息处理循环 \r\n\r\n 2. 1. 5 建立应用程序的窗口进程 \r\n\r\n 2. 2 目前的程序代码 \r\n\r\n 2. 3 结束语 \r\n\r\n 第3章 创建Direct3D程序的DirectDraw \r\n\r\n 3. 1 DirectDraw和多显示器 \r\n\r\n 3. 2 建立DirectDraw \r\n\r\n 3. 3 创建保存所列举设备的数据结构 \r\n\r\n 3. 4 列举DirectDraw设备 \r\n\r\n 3. 5 创建DirectDraw对象 \r\n\r\n 3. 6 列举显示模式 \r\n\r\n 3. 7 列举Direct3D设备 \r\n\r\n 3. 8 选择Direct3D设备 \r\n\r\n 3. 9 利用CD3DFramework7对象初始化DirectDraw \r\n\r\n 3. 10 设定协作级别 \r\n\r\n 3. 11 创建表面 \r\n\r\n 3. 11. 1 前缓冲区. 后缓冲区和裁剪程序 \r\n\r\n 3. 11. 2 全屏幕缓冲区 \r\n\r\n 3. 11. 3 窗口模式缓冲区 \r\n\r\n 3. 12 界面的翻动 \r\n\r\n 3. 13 目前的程序代码 \r\n\r\n 3. 14 结束语 \r\n\r\n 第4章 用于DirectX应用程序的Direct3D \r\n\r\n 4. 1 Direct3D Immediate Mode的对象和接口 \r\n\r\n 4. 1. 1 DirectDraw对象 \r\n\r\n 4. 1. 2 DirectDrawSurface对象 \r\n\r\n 4. 1. 3 Direct3DDevice对象 \r\n\r\n 4. 1. 4 Direct3DVertexBuffer对象 \r\n\r\n 4. 2 创建Immediate Mode的应用程序 \r\n\r\n 4. 2. 1 步骤1:初始化应用程序 \r\n\r\n 4. 2. 2 步骤2:判定DirectX的版本 \r\n\r\n 4. 2. 3 步骤3:列举可用的Direct3D设备 \r\n\r\n 4. 2. 4 步骤4:选择Direct3D设备 \r\n\r\n 4. 2. 5 步骤5:获取IDirectDraw7接口 \r\n\r\n 4. 2.6 步骤6:从IDirectDraw7获取IDirect3D7接口并创建Direct3D设备 \r\n\r\n 4. 2. 7 步骤7:创建深度缓冲区 \r\n\r\n 4. 3 目前的程序代码 \r\n\r\n 4. 4 结束语 \r\n\r\n 第5章 Direct3D顶点及转换和照明流水线 \r\n\r\n 5. 1 T&L流水线概述 \r\n\r\n 5. 1. l 世界转换 \r\n\r\n 5. 1. 2 视图转换 \r\n\r\n 5. 1. 3 照明 \r\n\r\n 5. 1. 4 投影转换和观察平截面 \r\n\r\n 5. 1. 5 裁剪 \r\n\r\n 5. 1. 6 除以w或非均匀 \r\n\r\n 5. 1. 7 视口缩放 \r\n\r\n 5. 2 顶点 \r\n\r\n 5. 2. 1 灵活的顶点格式 \r\n\r\n 5. 2. 2 左手和右手坐标系 \r\n\r\n 5.2. 3 跨距顶点格式 \r\n\r\n 5. 2. 4 顶点缓冲区 \r\n\r\n 5. 3 建立T&L流水线矩阵 \r\n\r\n 5. 3. 1 世界矩阵 \r\n\r\n 5. 3. 2 观察矩阵 \r\n\r\n 5. 3. 3 投影矩阵 \r\n\r\n 5. 4 视口 \r\n\r\n 5. 4. l 创建视口 \r\n\r\n 5. 4. 2 建立视口 \r\n\r\n 5. 4. 3 清理视口 \r\n\r\n 5. 5 照明 \r\n\r\n 5. 5. 1 环境光 \r\n\r\n 5. 5.2 直射光 \r\n\r\n 5. 5. 3 光的颜色与材料颜色 \r\n\r\n 5. 5. 4 光的类型 \r\n\r\n 5. 5. 5 光的属性 \r\n\r\n 5. 5. 6 设置光的属性 \r\n\r\n 5. 5. 7 检索光的属性 \r\n\r\n 5. 5. 8 启用和禁用照明引擎 \r\n\r\n 5. 5. 9 启用和禁用某种光 \r\n\r\n 5. 6 目前的程序代码 \r\n\r\n 5. 7 结束语 \r\n\r\n 第6章 渲染3D图元 \r\n\r\n 6. 1 BeginScene和EndScene方法 \r\n\r\n 6. 2 索引和无索引图元 \r\n\r\n 6. 3 DrawPrimitive方法 \r\n\r\n 6. 3. 1 DrawPrimitive \r\n\r\n 6. 3. 2 DrawPrimitiveStrided \r\n\r\n 6. 3. 3 DrawPrimitiveVB \r\n\r\n 6. 3. 4 DrawIndexedPrimitive \r\n\r\n 6. 3. 5 DrawIndexedPrimitiveStrided \r\n\r\n 6. 3. 6 DrawIndexedPrimitiveVB \r\n\r\n 6. 4 图元的类型 \r\n\r\n 6. 4. l 点列表 \r\n\r\n 6. 4. 2 线列表 \r\n\r\n 6. 4. 3 线条 \r\n\r\n 6. 4. 4 三角形列表 \r\n\r\n 6. 4. 5 三角条形 \r\n\r\n 6. 4. 6 三角扇形 \r\n\r\n 6. 5 设置渲染状态 \r\n\r\n 6. 5. 1 Alpha混合状态 \r\n\r\n 6. 5. 2 Alpha测试状态 \r\n\r\n 6. 5. 3 环境光状态 \r\n\r\n 6. 5. 4 消除锯齿状态 \r\n\r\n 6. 5. 5 裁剪状态 \r\n\r\n 6. 5. 6 颜色键控状态 \r\n\r\n 6. 5. 7 清除状态 \r\n\r\n 6. 5. 8 深度缓冲状态 \r\n\r\n 6. 5. 9 填充状态 \r\n\r\n 6. 5. 10 雾化状态 \r\n\r\n 6. 5. 11 照明状态 \r\n\r\n 6. 5. 12 轮廓状态 \r\n\r\n 6. 5. 13 单顶点颜色状态 \r\n\r\n 6. 5. 14 阴影状态 \r\n\r\n 6. 5. 15 模板缓冲状态 \r\n\r\n 6. 5. 16 纹理透视状态 \r\n\r\n 6. 5. 17 纹理包装状态 \r\n\r\n 6. 5. 18 顶点颜色照明状态 \r\n\r\n 6. 5. 19 Z偏差状态 \r\n\r\n 6. 6 内插值:Gouraud阴影和扩散照明 \r\n\r\n 6. 7 创建3D应用程序 \r\n\r\n 6. 7. l 调用模型 \r\n\r\n 6. 7. 2 设备初始化 \r\n\r\n 6. 7. 3 处理每帧的活动性 \r\n\r\n 6. 7. 4 渲染帧 \r\n\r\n 6. 8 目前的程序代码 \r\n\r\n 6. 9 结束语 \r\n\r\n 第7章 键盘和游戏杆输入 \r\n\r\n 7. l 创建DirectInput对象 \r\n\r\n 7. 2 获取键盘. 鼠标或游戏杆 \r\n\r\n 7. 3 力反馈 \r\n\r\n 7. 3.1 创建力 \r\n\r\n 7. 3. 2 创建DirectInput力 \r\n\r\n 7. 4 结束语 \r\n\r\n 第8章 纹理 \r\n\r\n 8. l 纹理坐标 \r\n\r\n 8. 2 创建纹理表面 \r\n\r\n 8. 3 纹理管理 \r\n\r\n 8. 4 纹理压缩 \r\n\r\n 8. 4. 1 DXT格式 \r\n\r\n 8. 4.2 使用DXT表面 \r\n\r\n 8. 5 多纹理映射 \r\n\r\n 8. 5. 1 创建多纹理映射纹理 \r\n\r\n 8. 5. 2 访问多纹理映射级别 \r\n\r\n 8. 5. 3 设置多纹理映射LOD偏移量 \r\n\r\n 8. 6 纹理过滤 \r\n\r\n 8. 6. l 最近点取样 \r\n\r\n 8. 6. 2 线性纹理过滤 \r\n\r\n 8. 6. 3 各向异性的纹理过滤 \r\n\r\n 8. 6. 4 多纹理映射纹理过滤 \r\n\r\n 8. 7 纹理接口指针 \r\n\r\n 8. 8 纹理阶段 \r\n\r\n 8. 9 纹理混合 \r\n\r\n 8. 9. 1 多遍纹理混合 \r\n\r\n 8. 9.2 单遍多纹理混合 \r\n\r\n 8. 9. 3 凸起花纹映射 \r\n\r\n 8. 10 纹理寻址模式 \r\n\r\n 8. 10. l 边框颜色纹理寻址模式 \r\n\r\n 8. 10. 2 夹持纹理寻址模式 \r\n\r\n 8. 10. 3 镜像纹理寻址模式 \r\n\r\n 8. 10. 4 包装纹理寻址模式 \r\n\r\n 8. 11 纹理包装处理 \r\n\r\n 8. 12 目前的程序代码 \r\n\r\n 8. 13 结束语 \r\n\r\n 第9章 雾化处理 \r\n\r\n 9. l 雾化处理公式 \r\n\r\n 9. 2 创建雾化效果 \r\n\r\n 9. 3 像素雾化 \r\n\r\n 9. 4 目前的程序代码 \r\n\r\n 9. 5 结束语 \r\n\r\n 第10章 Alpha混合处理 \r\n\r\n 10. l 利用帧缓冲区混合 \r\n\r\n 10. 2 特殊效果 \r\n\r\n 10. 2. l 有雾环境中的发射对象 \r\n\r\n 10. 2. 2 镜头眩光 \r\n\r\n 10. 2. 3 照明图 \r\n\r\n 10. 2. 4 有色玻璃 \r\n\r\n 10. 3 Alpha测试 \r\n\r\n 10. 4 颜色键控透明性 \r\n\r\n 10. 5 Alpha可用的调色板化纹理 \r\n\r\n 10. 6 利用Alpha的纹理阶段 \r\n\r\n 10. 7 遗留混合模式和纹理阶段 \r\n\r\n 10. 8 Alpha自左乘与非自左乘 \r\n\r\n 10. 9 目前的程序代码 \r\n\r\n 10 10 结束语 \r\n\r\n 第11章 熙明映射和环境映射 \r\n\r\n 11. l 照明映射 \r\n\r\n \r\n\r\n \r\n
\r\n
随着Microsoft Windows 95的推出, 游戏开发人员有机会开发基于Windows的游戏, 这些游戏具有比早期的Windows版本可能提供的强大得多的功能. 但是, 即使利用这些功能, 在Microsoft推出DirectX之前, 连续和高效地访问多媒体硬件也不是件简单工作. DirectX不但能够提供对硬件的访问以及由此带来的令人难以置信的高速性能, 还可使硬件开发人员更加容易地开发可良好地工作于Windows环境的新设备. DirectX API消除了开发人员自己编写低级. 用于访问硬件(如显示适配器和网卡)设备相关的代码的必要性, 使得编写可充分利用计算机的多媒体功能的程序更加简单.
本书重点介绍了DirectX的Direct3D Immediate Mode API. Immediate Mode提供了快速的开发库, 它可与用于实现声音. 设备输入. 网络游戏以及显示设备处理的其他DirectX API密切合作. 为了教会您开发一种支持所有这些功能的真正的应用程序, 我还会介绍开发利用和集成其他 DirectX API的方法. 在本书的最后, 您将看到如何实现带有复杂的3D图形. 动画角色. 多种输入设备支持(包括简单的力反馈支持). 声音以及通过调制解调器. 网络或直接串行连接的多人游戏功能的复杂3D游戏.
编写本书的原因在于, 尽管已经有几本关于DirectX API的书籍, 它们包括了Direct3D Retained Mode, 但截止到今天, 还很少有关干Direct3D Immediate Mode的书籍. 缺乏有关Immediate Mode的书籍的原因是, 与提供了高级的库. 便于使用的命令的Retained Mode不同, Immediate Mode具有更大的挑战性——但效率也更高——的API, 多数游戏开发人员都在其专业的游戏和引擎开发过程中采用了这种API. 正是由于这一原因, 多数人都选择以前使用DirectX Immediate Mode开发的程序代码——以及从中得到的经验教训——并保留其所有权. William Chin(RoadRage游戏的原创者)和我选择与本书一起免费提供游戏引擎, 从而帮助人们进入由于商业上行得通的引擎开发的复杂性而通常很难了解的这类软件市场. 我曾经看到很多人为了尝试如何使用多个DirectX API的命令以创建一个能够正常工作的3D应用程序而努力. 尽管开始Direct3D API有些令人畏惧, 但我相信到本书最后, 您将完全了解DirectX API的强大功能, 并知道如何以有效和明智的方式将它们结合在一起完成工作.
在这些内容的武装之下, 您就能够勇往直前, 利用Direct3D轻松完成游戏的开发工作了. 在详细演示Direct3D中建立真实世界应用程序的过程中, 我希望为您提供创建自己的Direct3D应用程序所需要的基础和信心. 在这个基础之上, 我希望能够消除您最初开发Immediate Mode应用程序时的忐忑不安. 利用Immediate Mode以及本书提供的代码框架, 您应当能够建立功能强大. 快速. 商业品质的应用程序. 这也正是所有商业游戏开发人员都愿意采用Immediate Mode而不是其他API的原因所在. 在结束本书的学习后, 我可以保证您也会选择这条道路.
让我们就此开始Direct3D的学习吧!
在我最喜欢的电视剧《辛普森》中有一段情节, 洪默得到了一份为卡通剧《蹩脚的演出》(The Itchy and Scratchy Show)的角色配音的工作. 在录音的开始阶段, 洪默以他经典的笨拙方式, 询问这部分情节是不是现场直播. 制片人满脸嘲讽地回答他:“不, 洪默. 很少有现场直播的卡通节目——这会让卡通漫画家的手腕太过劳累. ”确实, 对于人类来说这不太可能, 但个人计算机现在可产生“逼真的”三维动画. 虽然还无法做到使实时渲染的场景与照片毫无差别, 但每秒60帧而每帧中又含有几千个多边形却能够创造一个非常可信的世界. 现在出售的几乎所有的计算机系统都含有专用于加速三维图形渲染的芯片——有些甚至比主微处理器更复杂. 年复一年, 推向市场的图形处理器以显著的速度不断增强其功能. 其结果就是计算机游戏中的图形比以前更加光彩夺目.
Microsoft公司的Direct3D创作小组进行了一项具有挑战性的工作, 即为软件开发人员提供API, 这样就使开发人员能够充分利用这种技术. 由于图形处理公司的创新工作速度令人难以置信, 所以跟上潮流是一个连续的过程. 使API便于使用——但仍然具有完全的灵活性和闪电般的速度——这是永恒的目标. 随着每个版本的Direct3D的推出, 它更加高效, 而且功能更加强大. 有时添加一种功能(如自动纹理管理)只是为了使程序员的工作更简单. 还有一些功能(如模板缓冲区)需要程序员进行额外的了解和编程工作, 但结果却是能够更自由地创建更真实的. 更引人入胜的游戏世界.
在本书中, Peter Kovach对Direct3D API进行了精彩介绍, 这将帮助您学习像一名专家那样使用三维图形技术的方法. 他还展示了使用相关DirectX API进行输入并联网以编写完整游戏的方法. 制作好玩的游戏的工作就像拦路石挡在您的面前, 但如果彻底了解了Direct3D的功能, 您的工作就能畅通无阻.
Michael Anderson
DirectX SDK小组
无封面