现在的位置: 首页 > 综合 > 正文

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之2: Chap4: Direct3D Initialization

2018年04月09日 ⁄ 综合 ⁄ 共 2178字 ⁄ 字号 评论关闭

从这一期开始,我们正式来研究“龙书”第二版的课后习题啦!这一次讲的是第4章的习题。可能有人会奇怪:为何从第4章开始呢?手头有书的同学大概没有这样的疑问,因为前面3章是讲述3D图形的数学知识的,基本上就是高中的空间解析几何知识、向量知识加上少许的线性代数的知识,非常好懂,课后的习题也都很基本,相信读过大一的同学们做起来没有任何困难(如果真的有问题的话,你得先问问是不是真的要把游戏编程学下去)。

第4章其实没讲什么东西,它其实是为第6章做铺垫的(至于为何不是第5章,下一期大家就知道了;或许读过书的人早就知道了),所以这一章只有一个不涉及3D图形的示例程序,作业题也显得比较乏味。所以我只讲第4、5、6个作业题。前面3个比较无聊,况且看了第5题的答案后,大家也能够很轻松地搞定前3题了。

这一章讲述了一个很重要的、以后每个示例程序都要使用的东东:ID3DXFont对象(准确地说,是指向ID3DXFont类型的指针)。这个东东是为了在游戏程序的窗口的客户区内绘制2D文本的,我们可以用它来记录游戏中我们感兴趣的各种参数(下一章开始它会变得更加强大)。不过可惜的是,这里并没有对这个对象的用法做出详细解释。

由于DirectX SDK这些年的更新,这一章的第7节DebuggingDirect3D Application部分的内容有一些过时了;不过幸好并不是完全没用的,我在修正版里把这一节的内容做了更新,相信大家可以从中受益的。不过我至今不懂的是那些跟debug有关的宏语句是什么意思,看着像天书一样……希望有高人能够答疑解惑!

第4题部分:

 

这一道题很简单,正如我在修订版里脚注所说的那样,把d3dApp.cpp文件中的msgProc函数的WM_EXITSIZEMOVE这一情况注释掉就OK了。

那么产生的结果如何呢?结果就是:原来的版本中,改变窗口大小后文本的大小并不会发生改变,但是注释掉这一段语句后,文本的大小会随着窗口大小的改变而发生适当的改变。尽管最理想的情况也许是文本的字体大小的变化与窗口的大小变化完全一致(指的是纵与横这两方面的比例),这样不管怎么样总能够在窗口中看见完整的文本;但是在目前的情况下,我们没有愿望把程序弄得那么复杂,所以可以说,原来的版本还是比较好的。

 

附:第4题答案下载地址:

点击打开链接

 

 

第5题部分:

 

这一题也不难,只要能够写出针对第一种性能的测试语句,就能够写出其他的。本来可以直接用Win32 Console Application通过一个文本文件给出检测结果的,但是为了熟悉ID3DXFont对象的使用,所以我用了一个写满文字的D3D程序给出结果。注意:这里用到了一点书上没有讲过的知识:如何获取当前显卡的型号。其实实现起来很简单,大家看看代码就知道了。

这是我运行的结果:

我好奇的是:我觉得我的显卡很牛了,但是为何书上要我检测的那些能力我这里都不行呢?大家也可以在自己的电脑上运行一样,看看有没有人都是Lucky的。我觉得可能我这个显卡是针对DX 11设计的,所以检测DX 11的那些能力可能更加得心应手。当然这也只是我的猜测而已,毕竟我还没有学习DX 11的知识。

 

另外我为了能够在窗口中的文本里显示数字,谢了两个将数字转换成字符串的辅助函数,并且还用了string库,最后输出的时候还将string换成了C-style string。之所以这样,实在是没办法,因为这里面的If-else语句太多了。不知道大家有没有更加简练的解决方法?

附:第5题答案下载地址:

点击打开链接

 

 

第6题部分:

 

这一题还是具有挑战性的,因为作者要培养我们的自学能力,而且要自学的是以后基本上再也不会遇到的东东……不过研究了一下SDK文档,还是摸索出来了一点门道,至少可以画出一个“一笔画”图形了

为了方便,我把绘制line所需要的一些参数都放在源文件最开始的常量部分了,具体地说就是定义linestrip的点构成的数组、线条的颜色、线条的默认宽度以及默认的Pattern。

此外,这里还是使用了2D文本的,显示了当前线条的宽度信息。

这里有几个注意事项:

1、  这里用到了线条的颜色,而颜色直到第9章才学。不过有一点图形处理软件(最基本的,Windows自带的“画图”程序)使用经验的同学应该都直到RGB颜色格式,而我在源文件开头定义的颜色常量的三个参数就正好代表RGB三种成分的比重(0~255)。

2、  如果绘制线条之前没有设定线条的宽度,那么线条就将是不可见的(也就是宽度为0)。

3、  这些线条是位于屏幕空间的,这意味着两点:一是这本质上是一个2D图形,不会因为3D视角的改变而改变;二是注意取点的坐标的时候,使用的是2D向量,并且注意在屏幕坐标系中,坐标原点(0, 0)位于窗口用户区的左上角,并且x的正向是向右的,而y的正向是向下的。

 

附:第6题答案下载地址:

点击打开链接

题外话:

 

此外书上给出了一段代码来检测显卡支持的各种分辨率等信息。书上并没有给出完整的代码,所以我就写了个完整的控制台程序。注意这个是控制台程序,大家不要搞错了。

 

附:display adapters示例程序下载地址:

点击打开链接

 

PS:还是有一个疑问。

书上的结果是这样的:

而我的结果却是这样的:

照理说我的显卡应该很牛的呀,为何得出的结果这么少?难道还是DX 9DX 11之间的差别的原因?

抱歉!评论已关闭.