16位BIT模式下的ALPHA运算

原创 2000年08月10日 14:57:00
各位好,16BIT ALPHA运算终于整理出来了,如有不对之处,欢迎大家批评指教。怎么样?还算谦虚吧?好了,言归正传,特效显示中ALPHA融合是应用最多的一种,在D3D中可用到硬件加速,ALPHA融合要比2D下简捷许多。鄙人一直搜索2D下的各种特效运算,现将所见过当中较好的ALPHA运算拿出来,同大家一起分享,如果各位大侠有更好的算法,千万别忘了告诉我。附:源码,编译需DX6或以上SDK,VC,DXGuide。

下面要介绍的是无限量级ALPHA查表算法,为什么说是无限量级?因为你可以随便设定ALPHA级数。在介绍16位算法之前我们最好先来看看8位查表算法:

建立一个256*256大小的表,每单元为一个颜色索引值;
用给定的ALPHA值初始化表;
查表计算。
其中表初始化就是将所有可能出现的源点和目标点的组合预先计算好,具体做法是根据调色板及源点和目标点的颜色索引值分离出R、G、B值,分别计算后再从调色板中取出与计算结果最符合的颜色索引值存入表内。

融合计算时只需将源点和目标点的颜色索引值作为查找表的下标,找到相应的表单元即可。算法原码在TONY COX的FAQ有。

16位算法基本原理同8位一样,但不需要建216*216的表,而是建立两个?28*28的表。计算时将低字节和高字节分开计算,为什么可以分开计算下面我们来证明一下:

以565方式为例,设源点颜色值为R1G11 G12B1,R1G11为高字节,G12B2为低字节。同样目标点颜色值设为R2G21 G22B2,ALPHA值为A,最大级数为M,则融合公式为:

R = (A*R1+(M-A)*R2)/M
G1G2 = (A*G11G12+(M-A)*G21G22)/M
B = (A*B1+(M-A)*B2)/M

[RG1G2B] = 211*R+25*G1G2+B
= 211*(A*R1+(M-A)*R2)/M +
25*(A*G11G12+(M-A)*G21G22)/M +
(A*B1+(M-A)*B2)/M
= 28*(A*23*R1+(M-A)*23*R2)/M +
25*(A*(23*G11+G12)+(M-A)*(23*G21+G22))/M +
(A*B1+(M-A)*B2)/M
= 28*(A*(23*R1+G11)+(M-A)*(23*R2+G21))/M +
(A*(25*G12+B1)+(M-A)*(25*G22+B2))/M
=28*(A*[R1G11]+(M-A)*[R2G21])/M +
(A*[G12B1]+(M-A)*[G22B2])/M

该死的上下标!看出来没有?啊?前半部为高字节,后半部为低字节,哈————
于是由高低字节计算无关性可引申为n位运算无关性,接下来该知道怎么建立查找表了吧?还不知道?不要问我,自已慢慢想吧。我再也不想敲半个上下标了。

接下来是32级ALPHA运算,此法原理较简单,将一个颜色字拓展为一个双字,用32位寄存器来计算,例如:RRRRRGGGGGGBBBBB拓展为00000RRRRR000000GGGGGG00000BBBBB,运算完后再还原为一个字即可。为什么是32级而不是64级?因为2的5次方是32,不论是555还是565,各颜色平均最多只能再拓展5位,32是此法的最大级数。当然小于32级是没问题的。影响本法效率的关键在于字到双字的拓展。其实R、G、B谁先谁后无关紧要,最最要紧的是迅速展开与还原。以565为例:
展开: (wRGB&brvbarwRGB<<16)&0Xf81f07e0 //1111,1000,0001,1111,0000,0111,1110,0000
还原: (dwRGB>>16)&brvbardwRGB

比较两法,第一种方法较适合ALPHA值固定的情形,如《二战特种兵》中德士兵的可视区。至于ALPHA渐进变动情形下的效率,运算区域越大,第一种方法优势越大。具体对比未仔细做,各位可自己去做比较。

位运算

6种位运算& (位与) , | ( 位或) ~  (位反) , ^  (异或)>> (右移),左移)1,& 位与#include #include int main() { /** ...
  • jiesenmark
  • jiesenmark
  • 2015年11月15日 11:51
  • 287

位运算模块mBit.bas

File:      mBit.basName:      位运算模块Author:    zyl910Version:   V2.0Updata:    2006-4-29E-Mail:    zy...
  • zyl910
  • zyl910
  • 2006年05月24日 00:02
  • 2215

关于16位色在arm cpu上的快速alpha算法

转自:http://blog.chinaunix.net/u/26691/showart_1089631.html最近在优化一个小程序,其中涉及到了alpha混合的代码,如果是在台式机上可以通过mmx...
  • pocketmatrix
  • pocketmatrix
  • 2008年11月04日 13:27
  • 1536

汇编alpha运算处理 16位/64位

自己看汇编资料用MMX指令写的alpha运算代码还可以更优化仅供参考(VC++下)///////////////////////////////////////使用汇编完成@运算处理一次16位////...
  • xcl_rockman
  • xcl_rockman
  • 2008年03月02日 23:32
  • 188

Cocoa中的位与位运算

原文  http://gracelancy.com/?p=410 主题 Cocoa 介绍 位操作是程序设计中对位模式或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略...
  • songweiwei27
  • songweiwei27
  • 2017年03月24日 16:27
  • 117

面试之路(26)-面试相关的位运算总结

java的位运算介绍:Java提供的位运算符有:左移( > ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它...
  • u010321471
  • u010321471
  • 2016年05月05日 15:58
  • 1145

sql server的一个有趣的bit位运算

sql server中没有bool类型,而是用bit类型来表示bool值,估计是为了节省存储空间。 可是要想实现取反操作似乎就麻烦写了,比如类似下面这样的语句是不行的:update category...
  • sweetsoft
  • sweetsoft
  • 2012年12月17日 21:07
  • 1961

解释颜色深度概念:8 bit、16 bit、32 bit的意思

颜色深度概念:颜色深度简单说就是最多支持多少种颜色,一般是用“位”为单位来描述的。...
  • panshun888
  • panshun888
  • 2017年10月18日 21:25
  • 305

C++位运算

前言 以前收藏过一篇讲C++位操作的文章,这次博客搬家,以前的数据都没有保留,整理谷歌网站管理后台的时候,发现不时的还有网友有在查找这篇文章。所以,疯刀也来弄个简单的教程,讲讲位操作的用途和魅力...
  • wordwarwordwar
  • wordwarwordwar
  • 2014年10月03日 23:46
  • 182

openCV 几个位运算函数

算术运算:cv::add(), cv::addWeighted(), cv::scaleAdd(); cv::subtract, cv::absdiff; cv::multiply; cv::divi...
  • Sunshine_in_Moon
  • Sunshine_in_Moon
  • 2015年04月20日 20:01
  • 1488
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:16位BIT模式下的ALPHA运算
举报原因:
原因补充:

(最多只允许输入30个字)