网页功能: 加入收藏 设为首页 网站搜索  
16位Alpha混合的简单算法
发表日期:2006-08-20作者:[转贴] 出处:  

  游戏中,我们常常可以看到一些半透明的图像,那么这些图像是怎么生成的呢?是简单的贴位图做的吗?当然不是,要不美工不就惨死了。这其实是利用程序将两张图片进行混合后的效果,也就是图形的Alpha混合,要得到混合图片,就必须对每个点分别进行处理。让我们来看看如何进行Alpha混合。这里以16位色彩位例子:
  16位色彩下,每个像素都用一个WORD来表示,有16位二进制。这16位,分成三段分别表示像素的R、G、B值。现在的显示卡有两种:555格式的RGB分别各占5位最高位空、565格式G的值占6位,其他两个分量各占5位。所以首先,我们要得到像素的RGB。

N

R

R

R

R

R

G

G

G

G

G

B

B

B

B

B

 

1 555的RGB分量

 

R

R

R

R

R

G

G

G

G

G

G

B

B

B

B

B

 

2 565的RGB分量


   在DirectDraw下,可以通过锁定表面,得到表面的像素,将他保存到一个WORD*的变量里。当我们得到资源表面和目的表面的像素后,我们就可以开始进行Alpha混合了。16bit的Alpha混合首先必须分别对原和目的表面的像素分色。这可以通过位操作来实现,用像素值分别与RGB对应的特定值进行与操作将多余的其他色去掉,最后通过移位去掉后面的0。这里要注意555显示卡和565显示卡的区别。分色后,混合正式开始,我们将分色得到的R、G、B的各分色分别混合。下面先看一个公式:A=目的颜色、B=资源颜色、Alpha=混色深度(0 < alpha < 1)

混合后的颜色 = A * Alpha + B * ( 1-Alpha )


  当Alpha=0,混合后的颜色=A。当Alpha=1,混合后的颜色=B。当Alpha介于0与1之间,混合后的颜色包含了资源和目的表面的两种颜色。调整Alpha的值,混合后的颜色就会跟着有规律的变化。但是,颜色是整数,所以,我们必须对公式进行一点简单的变化:

混合后的颜色 = ( A * Alpha + B * ( 32-Alpha ) ) / 32   1 < 32


  这样的等价变化后所有的元素都变成了整数,混合颜色的调整级数为32(更高当然也是可以的,把公式中的32换成其他数,Alpha区值范围也变化),但是计算机处理乘法和除法是很慢的,而Alpha混合是对很多的点进行计算,上面的公式显然是不适合的,我们再来点变化:

混合后的颜色=( ( A-B ) * Alpha ) >> 5 + B


  除以32等于右移5位,这就是调整级数取32的原因。计算机处理移位是很快的。至于那个乘以Alpha,我也不知道有什么简单的方法改成效率更高的算法。分别混合好R、G、B的色后,最后还需要将他们合成,这是个简单的步骤,与分色相反的移位,然后将三个色值按位或操作就可以了。处理了所有需要混色的像素后,记得将表面解锁。

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 16位Alpha混合的简单算法
本类热点文章
  在DirectX 8 中进行2D渲染
  DirectDraw打造极速图形引擎(一)
  用窗口模式运行游戏
  DirectDraw编程基础
  Windows的位图alpha混合技术
  再谈GDI模式作图
  终极优化你的游戏——使用脏矩形技术
  D3D8里面的2D图形编程
  全屏模式
  对2D游戏引擎设计的一些思考
  DirectX8中的二维图形高级技巧
  使用标准GDI实现游戏品质的动画系统
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00572