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

原创 2014年09月04日 18:39:33


从这一期开始,我们正式来研究“龙书”第二版的课后习题啦!这一次讲的是第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之间的差别的原因?



DirectX11 学习笔记1 - 第一个程序

为了加快学习速度,和使程序更加容易理解。  我把sampler tutorial里面的一个例子 的固定代码和经常改动的代码经过简单的类的封装了一下。 以后学习的时候就可以只在另一个文件写render...

DX11:先定一个小目标,比如:把DX11龙书上的知识点系统的总结下来

最近要开始学习DX11了。前段时间一直在看DX9,就是为学习DX11做准备。因为DX11龙书是英文的,搞的我很是头大,毕竟不常阅读英文文献,确实翻译能力有限。但是作为一个程序员,怎么可能被这种问题所难...

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之5: Chap7: Drawing in Direct3D ---- Part I

这一章终于开始讲绘制3D图形的内容了!这一章讲的是非shader方法,也是“龙书”第一版大部分时候所用的方法。 但是值得注意的是,这里的顶点声明是用D3DVERTEXELEMENT9数组实现的,而不...

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之6: Chap8: Drawing in Direct3D ---- Part II

从这一章起,龙书第二版正式进入了shader部分了!利用HLSL语言编写各种shader的内容贯穿此书的大半部分,而且是最令人激动的部分了!用shader可以实现很多用非shader技术难以实现或者根...

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之8: Chap10: Lighting

这一章讲的是光照。光照(lighting)是Direct3D中非常重要的概念,而与之相对应的是材质(material)的概念。如果没有材质的话,那么光照的作用也无法体现。         在较早一些的...

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之10: Chap12: Blending

这一章讲的是Blending,包括alpha 混合和alpha 测试两个方面。这一章的内容总体来说比较简单。然而,后面的习题却并不是很简单……           下面是习题解答部分:     习题1...

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之7: Chap9: Color

这一章先是讲了DirectX中的颜色的各种相关知识。其实专门为颜色这一块内容开辟单独的一章没有太大的必要,所以作者扯了点其他话题,让我们能够画出“机械波”。并且这块“离题”讲述的知识在后面还会以各种姿...

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之9: Chap11: Texturing

这一章讲的是纹理,也是Direct3D中必不可少的一个技术:你见过那种所有物体基本都是单色的游戏吗?         以前我在这里一直不明白光照和纹理的关系。更具体地说,是在启用光照和材质之后,模型...

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

在开场白之前的说明:   这是“DirectX 9.0c游戏开发手记”的第一部分,叫做“‘龙书’第二版学习笔记”,讲的是我做“龙书”第二版(原名Introduction to 3D GamePro...

【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲

这篇文章里,我们将迈出精通Direct3D的坚实步伐,先透彻理解Direct3D中动画显示方面的交换链技术的原理,然后看看GDI与Direct3D编程习惯的一些思想上的关联,接着简单学习Direct3...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之2: Chap4: Direct3D Initialization
举报原因:
原因补充:

(最多只允许输入30个字)