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下载地址

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

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

时间: 2024-10-16 17:04:09

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

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

这一章讲的是Blending,包括alpha 混合和alpha 测试两个方面.这一章的内容总体来说比较简单.然而,后面的习题却并不是很简单-- 下面是习题解答部分: 习题1部分: =============================================================================== 这道题让我们研究使用不同的blend factor和blendop所产生的效果.这个实现起来不难,我就不打算详细解释了,大家都能够看懂的.另外,为了简单,我就不

DirectX 9.0c游戏开发手记之RPG编程自学日志之16: Drawing with DirectX Graphics (用DirectX图形绘图)(第10-12节)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题请联系[email protected]   这一次我们继续来讲述Jim Adams 老哥的RPG编程书籍第二版第二章的第10节:Particles (粒子),第11节:Depth Sorting and Z-Buffering (深度排序和Z-缓存),以及第12节:Working with Viewports (使用视口).这两节的内容都不多,所以就放在一期里面讲了. 原文翻译: ==========================

DirectX 9.0c游戏开发手记之RPG编程自学日志之15: Drawing with DirectX Graphics (用DirectX图形绘图)(第8-9节)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题请联系[email protected]   这一次我们继续来讲述Jim Adams 老哥的RPG编程书籍第二版第二章的第8节:Using Fonts(使用字体),和第9节:Billboards (广告牌).这两节的内容都不多,所以就放在一期里面讲了. 原文翻译: =============================================================================== 2.8 Us

DirectX 9.0c游戏开发手记之RPG编程自学日志之五 ——Drawing with DirectX Graphics (用DirectX图形绘图)(第1节)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题请联系[email protected]     从这一期起,我们进入了本书的第二部分,叫做DirectX Basics (DirectX基础).这一部分分为以下五个章节: 第2章 Drawing with DirectX Graphics (用DirectX图形进行绘图) 第3章 Interacting with DirectInput (与DirectInput互动) 第4章 Playing Sound and Music wit

DirectX 9.0c游戏开发手记之RPG编程自学日志之八 ——Drawing with DirectX Graphics (用DirectX图形绘图)(第4节)(A)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题请联系[email protected]           这一次我们继续来讲述Jim Adams老哥的RPG编程书籍第二版第二章的第4节:Getting Down to Drawing.这一节可以说是超级长了,所以我们就分3次来讲吧! 由于这一节的内容实在是太多,所以我这一节的各小节的标题列在下面,以供大家参考: 1.Using Vertices (使用顶点) 2.Flexible Vertex Format (灵活顶点格式) 3

DirectX 9.0c游戏开发手记之RPG编程自学日志之十 ——Drawing with DirectX Graphics (用DirectX图形绘图)(第4节)(C)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题请联系[email protected]   这一次我们继续来讲述Jim Adams老哥的RPG编程书籍第二版第二章的第4节:Getting Down to Drawing.这个超级长的节前两次讲了一多半内容,这一期我们要把它讲完. 再次将这一节的各小节的标题列在下面,以供大家参考: 1.Using Vertices (使用顶点) 2.Flexible Vertex Format (灵活顶点格式) 3.Using Vertex Buf

DirectX 9.0c游戏开发手记之RPG编程自学日志之九 ——Drawing with DirectX Graphics (用DirectX图形绘图)(第4节)(B)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题请联系[email protected]   这一次我们继续来讲述Jim Adams老哥的RPG编程书籍第二版第二章的第4节:Getting Down to Drawing.这个超级长的节上次讲到了顶点部分,这一期我们讲变换部分. 再次这一节的各小节的标题列在下面,以供大家参考: 1.Using Vertices (使用顶点) 2.Flexible Vertex Format (灵活顶点格式) 3.Using Vertex Buffe

DirectX 9.0c游戏开发手记之RPG编程自学日志之13: Drawing with DirectX Graphics (用DirectX图形绘图)(第6节)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题请联系[email protected]   这一次我们继续来讲述Jim Adams老哥的RPG编程书籍第二版第二章的第6节:Alpha Blending,也就是alpha混合.这一节的内容不多,所以就一次性讲完吧! 我们先将这一节的各小节的标题列在下面,以供大家参考: 1. Enabling Alpha Blending (开启alpha混合) 2. Drawing with Alpha Blending (用alpha混合进行绘图

《Unity3D 游戏开发经典教程》 第一第二章学习

花时间看了第一和第二章的内容,将书上的例子做成了个一个简单的游戏Protype. git 源码地址:https://github.com/crj8812/Unity3D            UGDE 蓝色为子弹,红色为被击垮的墙壁