DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白

2023-11-09


    

在开场白之前的说明:

 

这是“DirectX 9.0c游戏开发手记”的第一部分,叫做“‘龙书’第二版学习笔记”,讲的是我做“龙书”第二版(原名Introduction to 3D GameProgramming with DirectX 9.0c —— A ShaderApproach)的习题的心得和疑惑。

注意:这系列博文并不是什么入门教程,其实说白了就是一个类似自我总结的东西,方便我随时回顾的。没有正在学习DirectX编程的读者可能完全看得云里雾里;然而对于正在学习DirectX编程(最好是正在学习“龙书”第二版)的那些读者来说,这系列博文确实是值得一看的。当然这里面会给出我学习过程中的许多疑惑,希望大家一起来探讨!

 

 

 

开场白:

 

这是本人这是“DirectX 9.0c游戏开发手记”的第一部分“‘龙书’第二版学习笔记”的第一篇,所以还是有必要做一点开场白的。为了便于阅读理解,我采用一问一答的方式来组织这部分文章。

 

Q:为什么要学习游戏编程?

A:这里我要开始讲述“阿毛的故事”了,没兴趣的可以直接跳到下面的问题,只要你对游戏编程有兴趣就行……

去年9月份我想找一款棋子造型很华丽的国际象棋游戏。其实在这之前已经有一款不错的符合要求的游戏了(叫做《战斗版国际象棋》(Battle VS Chess)),可是早就玩腻了,想换换新口味。然而找来找去都没有找到符合要求的。《中世纪国际象棋》是一款“类似”的棋子造型是人物、有打斗动作的游戏,可是操作太坑了,而且毕竟太老,画质是渣渣。后来又见到一款比《战斗版国际象棋》稍早的游戏《鲁克斯保卫战》(Rooks Keep),比《中世纪国际象棋》好多了,但是远远不如《战斗版国际象棋》(当然也有一些优点),最主要的体现在这几点:1、棋子造型难以与实际兵种相对应;2、人物太挤了,尤其是那个蜘蛛皇后,胳膊都跑到别人的地盘了;3、操作很不和谐,视角也很坑。后来再找,没有看到有这种以人物模型为棋子造型的国际象棋了。我彼时悲愤交加,遂决定自己开发一款能够载入人物模型的国际象棋软件!于是我便开始自学C++。


本来只是打算做一款类似于Win 7自带的国际象棋程序ChessTitan那样的小软件,不过去年十一假期看了国产3D巨制《建木传奇》后,我被它那华丽的特效(以及小狐狸精性感美丽的身躯……)所深深地折服和吸引,便有了更宏大的目标:那就是,做一款类似《战斗版国际象棋》那样的华丽的3D国际象棋游戏!


不过那时候什么基础都没有,C++才刚开始学(虽然很早以前学过C语言,而且2011年暑假也自学过C++,但是后来碰了壁,就荒废了),也不知道从何入手,所以那半年就专心于C++入门了。

到了今年寒假,自学了一本游戏编程入门书——JonathanS. Harbour写的《Beginning Game Programming》——的一半内容。这本书,像我后来浏览过的很多游戏编程书一样,对于Windows程序的介绍都是一带而过的,所以说一开始跟看天书一样——不过,游戏编程所需要用到的Windows编程知识是很少的,所以过了这一段后也没多大影响。这本书是用DirectX 9.0讲2D游戏编程的,对于3D部分几乎没有任何讲述。当时我也以为要学习3D游戏编程,要从2D游戏编程学起(后来发现这是错误的)。这本书是我从图书馆借的,没有源码(幸亏书上把源码都“原样”誊写了上去,尽管后来发现有一些小问题),而且是中译本,看得很是吃力(当然可能最主要的原因是这本书本身就不够初等)。寒假结束后,也没有获得很大的提高,几乎快要放弃游戏编程了。


后来想想还是老老实实地做一款国际象棋“软件”(而非“游戏”)好了。于是打算自学MFC,因为MFC是制作Windows应用程序最快的工具了。这样学了一个星期左右,倒也逍遥快活,直到某天半夜……

那天半夜我百度了一下用MFC制作游戏,结果发现有人说用MFC制作Windows应用程序还可,但是用来做游戏不靠谱,因为游戏需要快速反映,而MFC的封装太多,运行效率不够快。那天夜里,我想了一阵子,便咬咬牙,准备从Windows程序设计开始学起了。咳!谁让到现在为之还没有出现比《战斗版国际象棋》更加华丽的国际象棋游戏呢?

我找到了《Windows游戏编程大师技巧(第二版)》,然后打算用我之前下载的DirectX SDK (June 2010)版本学习。这本书先详细讲述了Windows程序设计,终于让我对其有了感觉。不过当学习DirectX部分的时候,我又陷入了深深的困惑之中。


一方面是这里讲COM的时候太抽象了,简直是外星语言啊!好容易过了这道坎,然后发现了更恐怖的事实:书里给出的程序没法编译!虽然书里用的是DirectX 8,我用的是DirectX 9,但是不是说DirectX是向后兼容的吗?这不是说只要把里面的8都改成9就行了吗?(后来我才发现我的想法太天真了。)后来终于知道问题所在了:书上的程序用了DirectDraw,但是这种东西在DirectX 9中已经不存在了!郁闷啊!

于是我只好放弃了这本1000多页的书。后来找到了一本神书,叫做《Programming Role Playing Games with DirectX》,作者是名不见经传、但是很牛的Jim Adams,同样是用DirectX 8进行游戏编程的,但是没有用DirectDraw!这让我大喜过望,于是便学了起来,津津有味,而且这书讲得特别有意思,以至于我将我的志向又提高了一个层次:我要做一款值得一玩的3D RPG!


然而学到后来又出现了问题了:一个函数那里的参数出现了错误!仔细研究了一下,发现这个函数的DX 8版本和DX 9版本的参数数目竟然是不一样的!坑啊!这绝对不是个例!看来即使没有用到DirectDraw,DX 8和DX 9的区别还是大大的呀!

真是“山重水复疑无路,柳暗花明又一村”!正当我心灰意冷之际,我找到了传说中的“龙书”( Introduction to 3D GameProgramming with DirectX 9.0)!晕死,既然DX 8对我无情,那就休怪我无义了!我就从此走上了学习DX 9的路途。


学起来还是挺顺利的。不过我发现这本书的例子都很简单,没有特别激动人心的示例程序。后来偶然发现“龙书”的第二版,用的是DirectX 9.0c版,而且里面的很多例子都挺激动人心的,感觉比前一版提升了好几个档次,便学了起来。PS:到了这里,我才发现,其实即使同样是DirectX 9.0c版本,有一些地方也是有细微差别的,所以幸亏我选对了教材,否则又不知道要走多少冤枉路了。


再补充一下:《ProgrammingRole Playing Games with DirectX》有一个第二版,是用DX 9进行编程的,但是里面的很多代码还是过时了,毕竟年代比较久远了。


这上面说了很多废话,其实要点就两个:一个是一定要有学习游戏编程、做出一款好玩游戏的强烈愿望!二是一定要选择一本编排合理、内容新近、适合初学者学习的游戏编程教材!


Q:为何要用DirectX学习游戏编程?用游戏引擎不是更快吗?

 

A:确实用虚幻3、Unity等游戏引擎开发游戏速度很快,而且现在大部分游戏公司都是用市面上出售的或者自制的游戏引擎制作游戏的。那么为何我们要用DirectX学习游戏编程呢?因为用DirectX还是比较底层的,能够实现更多的自由,能够让我们更加理解3D游戏的本质。而用游戏引擎制作,虽然速度快,但是并不是万能的,有一些功能靠游戏引擎是难以实现或者根本做不到的;况且由于游戏引擎比较注重通用性,一般来说优化并不是很好。此外,即使要用游戏引擎开发,掌握一点DirectX编程的知识还是挺有用甚至是必要的。


Q:为何用DirectX9.0版本?

 

A:现有的最新的DirectX版本是DirectX 11。不过这几年比较出名的3D游戏基本还是基于DirectX9的(这就是玩某些3D游戏需要你安装DirectX 9 Runtime的原因)。之所以这样,因为DirectX 9是面向Windows XP系统的,所以XP系统和它以后的系统都可以正常运行基于DirectX 9的程序(只要安装了DirectX 9 Runtime);而DirectX 11是面向Windows 7系统的,基于DirectX 11的程序只能用于Windows 7及其以后的系统。显然,游戏厂商们希望自己的客户群尽可能广大,所以就选择DirectX 9了。


另外,对于DirectX 9.0c,它能够实现的效果已经很华丽了,大家可以参看《古墓丽影8》等基于DirectX 9的游戏。


至于DirectX 10,由于它是面向WindowsVista系统的,并且在它出现后没多久就出现了DirectX 11,所以我还没有见过基于DirectX 10的游戏。

现在能够下载到的最新版的DirectX SDK(software development kit,软件开发包)是DirectX SDK (June 2010)版本。这个版本集成了DirectX 9.0c、DirectX 10和DirectX 11。我们暂时就只关注其中的DirectX 9部分了。之所以后面带有一个c,是因为DirectX 9也有几个小版本,最古老的是a,最新的是c(其实即使是DirectX 9.0c,也有更细的小版本,前面也提到过的)。


当然,不可能再去管DirectX 8或者更老的版本了,前面的故事中我所得到的惨痛教训想必大家已经清楚了。


Q:为何不写一个教程类的博文?

 

A:首先,我没有那么大的本事来写一个自创的DirectX编程入门教程;其次,“龙书”第二版已经是不错的教程了,尽管有一些地方还是不太好理解。本人最近在对“龙书”第二版进行“修正”,会在每更新完一章的时候给大家分享。这个修正版除了页面编排更美观、修正了网上流传版本的错误以外,还增加了很多脚注,对于书中不太好理解的部分进行了注释。这些不太好理解的地方本人会在今后的博文中适当提及,不过还是推荐大家把电子书下载下来仔细研究,顺便提供宝贵意见!

 

附:

龙书 Introduction to 3D Game Programming with DirectX 9 0c 着色器版彩图注释修正版1.3

点击打开链接


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • .NET诞生20周年 .NET 7有什么新东西?

    首个预览版已发布 NET 7 有什么新东西 随着第一个预览版发布 NET 7 渐渐浮出水面 NET 高级项目经理 Jeremy Likness 在官方博客中介绍了 NET 7 的主要发展方向 俺整理给大伙做一下介绍 NET 7 建立在 NE
  • 实训二十二:交换机标准 ACL 配置

    一 实验目的 1 了解什么是标准的 ACl 2 了解标准 ACL 不同的实现方法 二 应用环境 1 ACL Access Control Lists 是交换机实现的一种数据包过滤机制 通过允许或拒绝特定的数据包进出网络 交换机可以对网络访问
  • Uoj 33 树上GCD (树分治)

    include
  • RabbitMQ:Queue的介绍和使用

    1 声明 当前内容用于本人学习和使用当前的Queue 当前内容为RabbitMQ中对Queue的介绍 当前内容来源 RabbitMQ中的Queue 2 Queue的官方介绍 首先先分析以下前面的Queue的使用 其实这个东西就是一个队列 一
  • Qt项目中头文件无法找到的几个解决办法

    项目场景 在新建项目中引用头文件 问题描述 头文件无法找到 系统提示错误 file not found 原因分析 可能是头文件写错 也可能是路径有问题 解决方案 三种解决方法 1 检查头文件是否写错 注意新旧版本的差异 2 检查路径是否为全
  • Windows下Python加载VLC的方法

    从网上看到一篇文章 Python 流媒体播放器 基于VLC 其中提到windows下开发VLC需要首先安装VLC 否则就需要设置环境变量PYTHON VLC MODULE PATH 但是我尝试了一下 没有成功 但是 这篇文章给了我一个思路
  • 剑指 Offer 25. 合并两个排序的链表

    题目链接 25 合并两个排序的链表 思路分析 利用归并排序的归并思想 Definition for singly linked list struct ListNode int val ListNode next ListNode int
  • 2021中国WMS市场发展趋势和特点

    仓储行业经历了30多年的发展 正在由手工仓向数字仓 智能仓转变 而在这个过程中 作为指挥硬件设备的 大脑 WMS起着不可或缺的作用 WMS系统通过数字化仓库作业过程管控 借助条码化和智能化技术手段 实现仓库作业条码化 作业过程透明化 库存管
  • 【满分】【华为OD机试真题2023 JS】红黑图

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 红黑图 知识点枚举 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 众所周知红黑树是一种平衡树 它最突出的特性就是不能有两个相邻的红色节点 那我们定义一个红黑图
  • shardingsphere引发 java.lang.String cannot be cast to java.lang.Integer异常

    错误描述 mysql数据库查询sql在数据库连接工具中可以正常运行 在加入了shardingsphere的jar包的项目中抛如下异常 java lang ClassCastException java lang String cannot
  • shell脚本循环传值_Shell 脚本的循环控制(for/while/until)

    熟悉其他高级语言的伙伴们肯定了解循环控制语法是编程中非常基础的内容 今天就介绍Shell 中设计循环控制的语法 for while until 等内容 for 命令 for 命令是最简单的循环控制语句 它的格式为 for var in li
  • SyntaxError: Cannot use import statement outside a module

    Node 生态包含两个不同的模块系统 ESM ECMAScript 模块 和 CommonJS 两个模块系统彼此不兼容 其是 SyntaxError 无法在模块外部使用 import 语句 错误 错误 SyntaxError 无法在模块外部
  • C++ 好用的格式化库--fmt

    背景 fmt 库是一个开源的 C 格式化库 它提供了一种简洁 安全和高效的方式来进行字符串格式化 该库的设计目标是提供与 Python 的字符串格式化语法类似的功能 同时保持 C 的类型安全性和性能 下载与安装 官网下载 fmt 官网地址
  • springboot+jsp教育机构OA系统(源码免费获取+论文+答辩PPT)

    技术架构 springboot mybatis springmvc jsp mysql 功能模块 整个系统分为三种角色 1 系统管理员 2 上级角色 3 普通教师 其中系统管理员需要的功能 部门人员管理功能 档案信息的添加 工作管理功能 上
  • python爬虫案例-跳过百度验证,接口调用实现百度搜索功能

    需求背景 我们有自己的平台 但是希望在我们的平台上面想要实现一个百度搜索的接口 输入想要搜索的内容 模拟百度搜索 将返回的内容再展现在我们自己的平台中 提供给用户查看 coding utf8 import hashlib import ra
  • QT自定义类型作为槽函数的参数

    QT自定义类型作为槽函数的参数 正常情况下信号与槽之间只能传递通用数据类型 如 int 像QVector
  • 数据结构——小白入门篇

    数据结构 小白入门篇 浅谈学习心得 我为什么想要学数据结构 在计算机界有这样一个万能公式 数据结构 算法 程序 在如今这计算机引领风骚的时代 不学数据结构 你凭什么想要做时代的弄潮儿 所以我毅然决然的提前自学了数据结构 学习数据结构前的我是
  • vue3 中使用 element UI 3 (vite 和 webpack)

    Element Plus官方文档 一 安装 NPM npm install element plus save Yarn yarn add element plus pnpm pnpm install element plus 如果您的网络
  • 15个高清壁纸网站推荐

    15个高清壁纸网站推荐 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 极简壁纸 推荐 WallpaperCave CGWALLPAPERS 游戏壁纸 H128壁纸 Magdeleine Up
  • DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白

    在开场白之前的说明 这是 DirectX 9 0c游戏开发手记 的第一部分 叫做 龙书 第二版学习笔记 讲的是我做 龙书 第二版 原名Introduction to 3D GameProgramming with DirectX 9 0c