【Visual C++】游戏开发五十五 浅墨DirectX教程二十二 水乳交融的美学:alpha混合技术



本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  

文章链接: http://blog.csdn.net/poem_qianmo/article/details/15026917

作者:毛星云(浅墨)    邮箱: [email protected]  


在这篇文章里面,我们一起非常详细地探讨了Direct3D中Alpha混合相关的内容。首先是认识了Alpha通道与混合技术,然后结识了融合因子,了解了融合运算方式和融合因子的取法,以及Alpha的三处来源,接着是大家喜闻乐见的极易上手的使用三部曲,最后依旧是详细注释的程序源码的欣赏,程序截图和每文一语栏目。

 

放截图吧,不过为了不毁三观,我们还是先放原版带纹理的截图:



对比图,我们今天为了演示做出来的alpha效果图:



说实话,这样的人物模型用来做Alpha混合的演示有些凶残,但是为了更好的掌握游戏编程,我们豁出去了。:)




 然后依旧是先和大家聊聊天,

昨天晚上去看了周杰伦摩天轮演唱会南京站,表示现场真是太震撼了。当杰伦唱起那些老歌比如《回到过去》,《晴天》的时候,让浅墨想起了初中时代的那些无忧无虑的日子,发现时间真的是一去不复返了。

另外就是南京最近天气忽然转冷,浅墨一不小心中招感冒了,希望大家一定要注意防寒哈。

然后今天就是双十一抢购日了,希望大家都能抢到自己心仪的宝贝。

好了,废话不多说,我们进入正题吧。

 

 

 


一、初识Alpha通道与混合技术

 

大家应该都知道, Alpha通道是计算机中存储一张图片的透明和半透明度信息的通道。它是一个8位的灰度通道,用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明。

而混合,为Blending的英译,是计算机图形学中常用的一种技术,即混合像素。我们通常用已经光栅化的像素光栅化同一位置的像素,或者说是在某图元上混合图元。这样说不好理解的话,我们来举个例子。说白了就是在一张图元的地盘上又来了另一张图元,然后他们按照我们指定的某种方式来像“揉面团”一样揉在一起,进行加工了再在原地显示出来。

 

 alpha混合技术对熟悉游戏的朋友们来说应该不会陌生,这种技术在如今的游戏特效里已经被用烂了。且不说3D游戏中它的频繁登场,就算是2D的游戏中,这种技术也是满眼皆是。

  alpha混合听上去很神秘,实际非常简单,其作用就是要实现一种半透明效果。假设一种不透明东西的颜色是A,另一种透明的东西的颜色是B,那么透过B去看A,看上去的颜色C就是B和A的混合颜色,可以用这个式子来近似,设B物体的透明度为alpha(取值为0-1,0为完全透明,1为完全不透明)

 

R(C)=alpha*R(B)+(1-alpha)*R(A)

G(C)=alpha*G(B)+(1-alpha)*G(A)

B(C)=alpha*B(B)+(1-alpha)*B(A)

 

  其中R(x)、G(x)、B(x)分别指颜色x的RGB分量(这里自变量x取的是颜色C)。看起来这个东西这么简单,可是用它实现的效果确实非常的华丽,应用alpha混合技术,可以实现出最眩目的火光、烟雾、阴影、动态光源等等一切我们可以想象的出来的半透明效果。

 

 



二、Direct3D中的融合套路——融合因子


上面我们讲到的是一般意义上的混合技术,而在Direct3D中,我们应该按如下的思路来进一步理解。

首先,Direct3D中依然是用Alpha通道来实现多个像素颜色值的融合。每个像素都包含四个分量:Alpha分量、红色分量、绿色分量和蓝色分量(即ARGB四分量)。其中,Alpha分量用于指定像素的透明度,在0~255之间取值,0表示完全透明,255表示完全不透明。另外,根据使用的不同的颜色宏的区别,还可能是在0.0~1.0之间取值。

 

在Direct3D中,融合这一领域有一个权威,那便是Alpha融合公式。Alpha融合公式如下:


其中RGB_src 和RGB_dst分别表示源像素和目标像素的颜色值,为包含四个颜色分量的颜色值。

K_src K_dst分别表示源融合因子和目标融合因子。他们指定了源像素和目标像素的颜色值在融合过程中所占的比例,在[0,1]之间取值。通过原融合因子和目标融合因子,我们能够以多种方式来修改源像素和目标像素的颜色值,从而获得我们满意的最终的融合后的颜色值。稍后会讲解融合因子的具体取法,这里我们先把这个融合公式解析完。

在融合公式中,OP表示源和目标的融合运算方式,由D3DBLENDOP枚举体来指定,需要注意的是它的默认值是源计算结果和目标计算结果相加。而运算符“∙”表示颜色值的每个分量都与和相乘。




三、融合运算方式的取法


上面我们刚提到过,融合运算方式由D3DBLENDOP枚举体来指定。

我们指的是SetRenderState中的第二个参数在D3DBLENDOP枚举体中取值,而第一个参数,取D3DRS_BLENDOP。

这一节就来看一下这个D3DBLENDOP枚举体的定义:

typedef enum D3DBLENDOP {
  D3DBLENDOP_ADD           = 1,
  D3DBLENDOP_SUBTRACT      = 2,
  D3DBLENDOP_REVSUBTRACT   = 3,
  D3DBLENDOP_MIN           = 4,
  D3DBLENDOP_MAX           = 5,
  D3DBLENDOP_FORCE_DWORD   = 0x7fffffff 
} D3DBLENDOP, *LPD3DBLENDOP;


我们用一个列表来进行讲解吧:

D3DBLENDOP操作符

精析

D3DBLENDOP_ADD

源像素计算结果与目标像素的计算结果相加,即【最终结果】=【源】+【目标】

D3DBLENDOP_SUBTRACT

源像素计算结果与目标像素的计算结果相减,即【最终结果】=【源】-【目标】

D3DBLENDOP_REVSUBTRACT

目标像素的计算结果减去源像素计算结果,即【最终结果】=【目标】-【源】

D3DBLENDOP_MIN

在源像素计算结果和目标像素计算结果之间取小者。即【最终结果】= MIN(【目标】,【源】)

D3DBLENDOP_MAX

在源像素计算结果和目标像素计算结果之间取大者。即【最终结果】= MAX(【目标】,【源】)



 

我们需要取什么类型的融合运算方式,在表中查阅即可。再提醒大家一次,Direct3D中为我们默认取了融合运算方式为D3DBLENDOP_ADD,即源像素计算结果与目标像素的计算结果相加。




  四、融合因子的取法

 

接着我们来看一下融合因子和的取法。源融合因子和目标融合因子可以在SetRenderState方法中第一个参数取D3DRS_SRCBLEND和D3DRS_DESTBLEND分别进行设置,而第二个参数都是在一个D3DBLEND枚举体中进行的取值,我们在MSDN中查到它的原型如下:

typedef enum D3DBLEND {
  D3DBLEND_ZERO              = 1,
  D3DBLEND_ONE               = 2,
  D3DBLEND_SRCCOLOR          = 3,
  D3DBLEND_INVSRCCOLOR       = 4,
  D3DBLEND_SRCALPHA          = 5,
  D3DBLEND_INVSRCALPHA       = 6,
  D3DBLEND_DESTALPHA         = 7,
  D3DBLEND_INVDESTALPHA      = 8,
  D3DBLEND_DESTCOLOR         = 9,
  D3DBLEND_INVDESTCOLOR      = 10,
  D3DBLEND_SRCALPHASAT       = 11,
  D3DBLEND_BOTHSR
  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 43
    评论
Visual C程序开发范例宝典》第二版是一本编程方面的书籍,主要介绍了使用Visual C进行程序开发的一些实例和示例。本书的目的是帮助读者深入了解Visual C的各种特性和功能,并通过实例演示来帮助读者掌握该开发工具的应用。 本书内容涵盖了Visual C开发环境的基本概念、开发工具的使用方法以及常见的程序开发技术和技巧。读者可以通过学习本书中的范例来了解如何使用Visual C创建窗体应用程序、控制应用程序的界面和交互逻辑,以及进行数据库访问和网络编程等。本书的范例宝典形式使得读者可以通过参照实例代码来学习和理解各种开发技术和方法。 《Visual C程序开发范例宝典》第二版的特点是实用性强,实例丰富,适合初学者和有一定开发经验的人士阅读。对于初学者来说,本书提供了循序渐进的学习路径,通过逐步增加难度的范例,帮助他们掌握Visual C的编程基础和常用功能。对于有一定经验的开发者来说,本书提供了一些高级的技术和案例,可以扩展他们的应用领域和提高开发效率。 总的来说,《Visual C程序开发范例宝典》第二版是一本权威的Visual C编程指南,适合所有希望学习和使用该开发工具的人士阅读。无论是作为学习的入门教材,还是作为开发工程师的参考手册,本书都可以为读者提供宝贵的帮助和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值