Introduction to 3D Game Programming with Direct X 9.0c读书笔记(1)

      很久以前读过龙书第一版,突然闲来无事,心血来潮,想读读第二版试试。

  读了之后才发现,第二版比第一版所加了不少新内容,并不像我想象的只是第一版的fix function pipeline改成programmable pipeline。

  这本书总体质量还是非常不错的,推荐新手直接阅读第二版(第一版不要再读了,fix function pipeline已经在DX10和DX11中完全摒弃了,如果出于兴趣想了解,可以读读)。

      之前的数学基础部分就不说了,读书的时候请注意对照勘误表!!要不然书中的印刷错误或者录入错误,让我们直接当成对的用了,会发现有几个公式根本推导不下来,容易产生挫败感。我在读2D旋转时,当时有一个公式推导符号搞反了,我怎么推导都推导不出来,当时我觉得作者不可能犯这么低级的错误,使劲找自己的原因,还是推导不出来。无意间发现下载电子书的时候,还有一个随附的叫勘误表的很小的pdf文件,里边把书中的错误部分或者印刷错误列了个清单。打开一看,才恍然大悟,果然是印刷错误。

  本书中的第一个Demo叫helloD3D,作者把D3D初始化、绘制功能、资源清理已接口形式做了个封装,然后所有的Demo都从这个接口继承而来。

  Demo就不讨论了,看过的同学都知道实现机理,这里说说这个helloD3D框架的一个问题(作者的目的是介绍D3D的功能,所以作者的焦点不在这里;我只是作为学习者,把这个问题提出来)。

  问题1:窗口高度调整到0的时候,gd3dDevice->Reset(&md3dpp);会调用失败,因为backbuffer的高度被设置了0,宽高比W/H无意义了,设置透视矩阵,绘制等一系列函数调用都会失败。现实里边可能很少有人会闲得蛋疼去把窗口高度调为0。但是我觉得这个问题总归还是要避免的好,要不然程序不够健壮。

  解决方法很简单:

  在窗口过程函数中两个消息处理(WM_SIZE和WM_EXITSIZEMOVE )代码中加入后台缓存高度检测,如果为0,则设置为非零值(随便选一个合理的值,如40,80,20等等)即可解决。

  

There is no future, we create it.
原文地址:https://www.cnblogs.com/infintyward/p/3150683.html