这一章终于开始讲绘制3D图形的内容了!这一章讲的是非shader方法,也是“龙书”第一版大部分时候所用的方法。
但是值得注意的是,这里的顶点声明是用D3DVERTEXELEMENT9数组实现的,而不是像前一版那样使用灵活顶点格式(FVF)。这也是此书从始至终使用的方法。
除此以外,我们在这一章没什么好说的了。既然如此,那还等什么?进入习题解答部分吧!
习题1部分:
这道题让我们研究D3DPT_LINESTRIP和D3DPT_TRIANGLEFAN这两种D3DPRIMITIVETYPE,并且要画出题目中给出的两个图形。这个其实不难,研究一下SDK文档就行了。实在不行的话可以参考我给的答案。
这里有个要点:注意绘制TRIANGLEFAN时设置的顶点的顺序,否则可能会导致图形不可见。
这是程序运行时的截图:
附:第7章第1题答案下载地址
点击打开链接
习题3部分:
习题2和书上的示例程序一样,在此从略。
习题3要做起来很简单,就是根据不同的要求在源文件的drawScene成员函数中、正式绘制图形之前的地方增加适当的语句就行了。具体地说,就是增加以下三条语句之一:
HR(gd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE));
HR(gd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW));
HR(gd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW));
不过为了让程序更加灵活,我做了一点手脚,就是可以“毕其功于一役”,一次性实现3种功能(通过按下不同的数字键的方式)。为了实现这一点,首先要在GfxStats类中增加表示当前CULLMODE的成员变量,为其设置get和set函数,并且在表示应用程序的类(这里是CubeDemo类)中每当改变当前CULLMODE的时候调用GfxStats对象的setCullMode函数,最后在绘制的时候通过GfxStats对象的getCullMode函数取得当前的CullMode值。这听上去有点复杂,不过我没有想到更好的方法了。
这是我的程序运行后能够见到的众多截图之一:
附:第7章第3题答案下载地址:
点击打开链接
习题4部分:
这一道习题让我们研究D3DRS_ZFUNC这个renderstate以及D3DCMPFUNC这个东东。我们在windows_graphics这个.chm文件中,进入“目录”栏,然后找到Direct3D 9 Graphics/ Reference for Direct3D 9/ Direct3D Reference/ Direct3DEnumerations/ D3DRENDERSTATETYPE以及Direct3D 9 Graphics/ Reference for Direct3D9/ Direct3D Reference/ Direct3D Enumerations/ D3DCMPFUNC就可以知道它们的庐山真面目了!其实现在讲这个有点跳跃了,因为这是很多章以后要讲的内容;不过我们现在来研究一下,对其有一个大致印象也是不错的。
像习题3一样,我也加入了“通过输入改变状态”的功能。按数字键1-8就可以见识不同的ZFUNC的效果了。这次改造的麻烦程度比第3题大多了,不过好在还是顺利完成了——额,也许吧。然后我发现,按下奇数键后,屏幕会变成空白的,连说明文字都不见了;而按下偶数键后,又变得正常了。并且,各个偶数键对应的效果之间似乎并没有什么区别。不知道哪位高人能够给予解答?
程序运行时的截图之一:
附:第7章第4题答案下载地址:
点击打开链接