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

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

下面是习题解答部分:

习题1部分:

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

这道题让我们研究使用不同的blend factor和blendop所产生的效果。这个实现起来不难,我就不打算详细解释了,大家都能够看懂的。另外,为了简单,我就不研究除了+以外的blendop了。下面是几张运行时候的截图:

此外,本题还让我们研究D3DRS_COLORWRITEENABLE 渲染状态。这个实现起来也很容易。不过我无法理解的是,这个到底有什么用?如果将该状态设为D3DCOLORWRITEENABLE_GREEN 的话,按照书上说的,只会渲染到绿色通道,但是实际运行的时候是这个样子的:

也就是说,显示出来的图形的颜色是红色和蓝色的混合色!这个是什么情况?谁能够解释一下呢?多谢啦!

下面是代码的下载地址:

习题1答案下载地址

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

习题2部分:

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

这道题让我们在书中给出的Transparent Teapot Demo的基础上进行一个小小的改动,具体来说就是先画茶壶,后画板条箱,并让我们说明结果。

结果如下图所示:

也就是说,虽然茶壶看上去是透明的,但是只是对背景(为了看到这一点,我特地改变了背景颜色)透明,而对于板条箱(以及其他任何在茶壶后面进行绘制的不透明物体)而言却是不透明的。这样的结果应该不是很出人意料。相信大家读过本章内容之后,能够明白产生这种现象的原因了吧!

这题太过于简单了,所以就不给代码了。

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

习题3部分:

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

这道题目引入了一个multi-pass技术,让我们通过这种方法来获得上一章中的多重纹理示例程序的效果。

虽然作者解释得貌似比较清楚了,但是实现起来可一点也不简单!看样子似乎只需要改动.fx文件就OK了,是吗?

然而你太小瞧了这道题了!要知道,这一章用的是alpha blending的技术,顾名思义,就要利用alpha 通道来完成混合的效果!可是我们这个上一章中给出的多重纹理示例使用的是RGB颜色来管理相应的纹理!虽然在blend factor中有跟颜色有关的,但是好像并没有具体到某个颜色分量的那种!

不过前面不是说了有D3DRS_COLORWRITEENABLE渲染状态呀!我们何不试一下呢?

可惜的是,各种尝试都无果,不管是改变blend factor 还是使用D3DRS_COLORWRITEENABLE 渲染状态,得到的效果都不行。实际上,用头脑想想,就会发现这个效果用multi-pass技术几乎是不可能实现的!

        真的是这样吗?有没有高人来指点迷津呢?

下面是不完美的代码的下载地址,仅供拍砖:

不完美的习题3答案下载地址

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

习题4部分:

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

这里又引入了一个新技术,叫做广告牌技术(billboardingtechnique),在3D游戏编程中也是很重要的一种技术,可以有效地降低电脑资源的损耗(当然代价就是模型不够逼真)。并且,由于用的是shader方法,所以可以通过一点手段减小绘制函数调用的开销。

这里面的技术实现部分题目中已经给出来了(不过没有增添光照。所以我在代码中增添了光照。不过好像反光太强烈了)。不过有个地方值得注意:完全按照上面的方法会看不到图形。后来发现在cross函数的调用前面加上一个负号就行了。下面是程序运行时候的截图:

本来打算用某种比较高端的方法让整个地图随机分布着这样的树的,不过后来太难了,简直没有思路(我希望这种随机分布首先在大尺度范围上要足够均匀,其次要能够根据地图的长和宽而进行调整),所以现在基本就是指定一些地方“栽树”了。

下面是代码下载的地址:

习题4答案下载地址

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

好了,这第12章就结束了,下一期要讲第14章了。第13章感觉有点太难了,想等以后琢磨透了再说不迟。

时间: 2024-10-12 21:11:02

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

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

这一章讲的是光照.光照(lighting)是Direct3D中非常重要的概念,而与之相对应的是材质(material)的概念.如果没有材质的话,那么光照的作用也无法体现. 在较早一些的关于DirectX 9的编程入门书籍里,一般是使用D3DLIGHT9结构体来建立一个光源,而用D3DMATERIAL9结构体来定义物体的材质.我们要做的就是一些很琐碎的家务活,基本上就是创建这些结构体对象.设定其中的参数.启用光照之类的,至于具体实现的细节就非吾等所需(和所能)操心的了. 不过在我们的"龙书&quo

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 蓝色为子弹,红色为被击垮的墙壁