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



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


 

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


说实话,这样的人物模型用来做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融合公式如下:

依旧是通过一个表格来对其中常用的参数进行讲解,:

D3DBLEND融合类型

精析

D3DBLEND_ZERO

融合因子=(0,0,0,0)

D3DBLEND_ONE

融合因子=(1,1,1,1)

D3DBLEND_SRCCOLOR

融合因子=(R_src,G_src,B_src,A_src)

D3DBLEND_INVSRCCOLOR

融合因子=(1-R_src,1-G_src,1-B_src,1-A_src

D3DBLEND_SRCALPHA

融合因子=(1-A_src,A_src,A_src,A_src

D3DBLEND_INVSRCALPHA

融合因子=(1-A_src,1-A_src,1-A_src,1-A_src

D3DBLEND_DESTALPHA

融合因子=(A_dst , A_dst, A_dst  , A_dst)

D3DBLEND_INVDESTALPHA

融合因子= (1-A_dst, 1-A_dst, 1-A_dst , 1-A_dst ).

D3DBLEND_DESTCOLOR

融合因子=(R_dst , G_dst, B_dst  , A_dst).

D3DBLEND_INVDESTCOLOR

融合因子= (1 – R_dst, 1 – G_dst, 1 – B_dst, 1 – A_dst).

D3DBLEND_SRCALPHASAT

融合因子= (f, f, f, 1),其中f = min(A_src,1 – A_dst)


在上表中,R_src  , G_src , B_src  , A_src分别表示源(即source)像素的红、绿、蓝、透明四个分量值,而R_dst  , G_dst, B_dst  , A_dst表示目标(即destination)像素的红、绿、蓝、透明四个分量值。

大家需要什么类型的融合因子,在上表中进行查阅就行了。

 

       





即这样理解:

我是旁白:纹理的Alpha分量是高富帅,首先必须满足他。

我是旁白:在纹理的Alpha分量不在场的情况下,备胎“材质的Alpha分量”终于逆袭了。

我是旁白逐梦便利贴:在纹理的Alpha分量和材质的Alpha分量都不在场的情况下,备胎的备胎“顶点的Alpha分量”也有春天啊。

 

 

 

1.顶点Alpha分量


首先我们要知道,顶点Alpha分量只是备胎的备胎而已,它在没有使用光照和材质的情况下才有上场的机会。

如果在程序中直接指定每个顶点的颜色,那么可以直接给出每个顶点颜色的Alpha值,并且这些顶点的Alpha值是可以在程序运行过程中动态修改的。

 

在MSDN中查到这个函数原型如下:


■第一个参数,DWORD类型的Stage,指定当前设置的纹理层为第几层(有效值0~7)

■第二个参数,D3DTEXTURESTAGESTATETYPE类型的Type,填将要设置的纹理渲染状态,在枚举类型D3DTEXTURESTAGESTATETYPE中任意取值。

■第三个参数,DWORD类型的Value,表示所设置的状态值,它是根据第二个参数来决定具体取什么值的。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2013年10月9日
下一篇 2013年10月9日

相关推荐