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

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

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

        在较早一些的关于DirectX 9的编程入门书籍里,一般是使用D3DLIGHT9结构体来建立一个光源,而用D3DMATERIAL9结构体来定义物体的材质。我们要做的就是一些很琐碎的家务活,基本上就是创建这些结构体对象、设定其中的参数、启用光照之类的,至于具体实现的细节就非吾等所需(和所能)操心的了。

        不过在我们的“龙书”第二版中,我们是使用shader方法来进行光照处理的。这意味着这样两点内容:

1、  这里面不会出现D3DLIGHT9和D3DMATERIAL9这两个结构体。相反,我们将使用自己的变量或者结构体来实现D3DLIGHT9以及D3DMATERIAL9的功能。

2、  我们必须考虑实现光照的细节了。这意味着我们必须好好理解书上的理论知识,然后将公式用代码表示。不过从实际角度出发,我们只需要把常用的关于光照处理的.fx文件保存好、以供以后随时查阅就OK 了。

 

        另外这也让我们能够发挥自己的创造性了:比如说,后面我们会发现,至少有两种不同的实现镜面反射的方法。另外,还有一些特殊的渲染效果可以通过shader方法来实现,比如说卡通渲染风格。

   

        下面就进入习题讲解部分吧!

 

        这一章的习题还是非常有意思的,也是我自我感觉非常满意的一次。

 

习题1部分:

===============================================================================

        这一道题引入了另一种实现镜面反射的方面,我称之为halfway方法,因为它使用的是一个halfway向量。这个方法个人感觉很好,在外部环境(模型)所有的参数保持不变的情况下,似乎这种方法竟然让模型变得更光滑了!

        闲话少说,我们来看看效果吧!这是书上讲过的经典方法的效果:


        而这个是halfway方法的效果:



        可以看出来,halfway方法的效果更加细腻了,光线不再刺眼了!为了方便,我设置了一个切换功能,只要按下数字键1或者2,就可以在两种镜面反射方法之间进行切换,从而直观地观察到效果。

         当然, 我不会忘了给你们代码的:

习题1代码

 

===============================================================================

 


习题2部分:

===============================================================================

        这一道题又引入了一个令人兴奋的话题:卡通风格渲染!当然,这里能够做到的很少,真实的卡通风格渲染不会这么简单。要实现那种轮廓分明、明暗变化快、纯色为主的卡通风格渲染,我们要做的事情还有很多(而且本人还没有学会)。不过这里的函数貌似有点问题,而我订购的实体书一直没来货,所以我只好将就将就了。

        另外我好奇的是这个函数究竟怎么使用。我的理解是将它作为最终像素的一个放缩因子使用的,不知道你们意下如何?

        不管怎么样,还是看看效果吧!


 

        下面的代码的下载地址:

习题2下载地址

 

===============================================================================

 


习题3部分:

===============================================================================

        这一道题很简单,让我们将书上的一个程序稍微进行变动,使得光源运动起来。这道题没什么可说的。

        下面是代码的下载地址:

习题3下载地址

===============================================================================

 



习题4部分:

===============================================================================

        这一道题有点意思,让我们在场景中同时设置两个光源。本来我以为这个很简单的, 但是我弄了一天的时间才弄好,摸爬滚打,最后发现最主要的错误还是在更新了technique后忘了进行设置了!

        不过现在的代码我觉得仍然有点缺陷,就是为了好玩,我让使用者可以在三种模式之下进行切换:按0键是启用第一个光源,按1键是启用第二个光源,而按2键则是同时启用两个光源。然后我发现,要实现这样的效果,好像必须写3个techniques,分别对应这三种情况!我觉得这有点浪费了,不过也没有想到更好的解决办法。不知道读者有没有谁能够提出更好的解决方案呢?

        下面是程序运行时的截图:


 

        仍然是代码的下载地址:

习题4下载地址

 

===============================================================================

 

 

习题5部分:

===============================================================================

        这一道题很简单,其实书上最后一节已经把方法都告诉你了。我这里就不贴图了。下面把地址送上:

习题5下载地址

 

        补充:虽然和第1题中的halfway方法一样都是让高亮部分更加柔和了,但是二者的区别还是蛮大的。

 


===============================================================================

 


习题6部分:

===============================================================================

        这一道题说难不难,说简单也不简单,关键看你有没有学过微积分了。学过的话一切都好说。不管怎么样,我已经比较轻松地实现了这个程序,效果还不错!

        另外,为了让这个程序更加好玩,同时也为了更加方便地看到光与材质的相互作用,我增添了“调节光色”的功能:在程序运行时按住数字键1(2、3),同时按空格键/左Control键就可以对红色(绿色、蓝色)成分的取值进行上调/下调了!效果很炫啊,有木有!下面放几张截图:

 





        最后是代码的下载地址:

习题答案6下载地址

 

===============================================================================

 

        好啦,这一期就到此结束啦!

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