简而言之,alpha混合就是透明度,计算
Final = src1 * alpha + src2 * ( 1 – alpha );
分解成RGB分量同样适用。
其中,src1和src2为RGB格式,长16位;混合因子:0-255,长8位。
创建alpha查找表
For( 0到65535的每个颜色值)
Bein
将颜色值视为5.6.5格式,从中提取RGB分量
然后将每个分量与alpha值相乘
R= r * alpha;
G = g* alpha
B = b * alpha
最后根据RGB分量生成1个16位的颜色字
并存储到查找表中与颜色值相对应的位置
Alphatable[value] =r.g.b
End
int DDRAW_LIUSHUIXIAN_TEXTURE::RGB_Alpha_Table_Builder( int num_alpha_levels, //alpha等级数
USHORT rgb_alpha_table[NUM_ALPHA_LEVELS][65536])
{
//检查指针是否有效
if(! rgb_alpha_table )
return-1;
int r,g, b; //用于存储从rgbindex中提取的RGB分量
float alpha = 0;
float delta_alpha = EPSILON_E6+ 1 / ( ( float ) ( num_alpha_levels- 1 ) );
//需要num_alpha_level行
for(int alpha_level= 0; alpha_level < num_alpha_levels; alpha_level++)
{
for(int rgbindex= 0; rgbindex < 65536; rgbindex ++ )
{
_RGB565FROM16BIT( rgbindex,& r, & g,& b );
//计算乘积
r =( int ) ( ( float) r * ( float) alpha );
g =( int ) ( ( float) g * ( float) alpha );
b =( int ) ( ( float) b * ( float) alpha );
//生成RGB值,并将其存储在查找表中
rgb_alpha_table[alpha_level][rgbindex] = _RGB16BIT565(r, g, b );
}
//计算下一个ALPHA值
alpha += delta_alpha;
}
return1;
}