本系列文章由zhmxy555(毛星云)编写,转载请注明出处。
作者:毛星云(浅墨) 邮箱: happylifemxy@163.com
在这篇文章里面,我们一起非常详细地探讨了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枚举体来指定,需要注意的是它的默认值是源计算结果和目标计算结果相加。而运算符“
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。