优化Alpha混合

时间:2014-04-13 21:51:50

标签: c++ alphablending

我有两种颜色,我使用这种方法进行简单的alpha混合:

int Color::blend(int col1, int col2)
{
    float a1  = ((col1 & 0x000000FF) / 255.0);
    return ((int)((((col1 & 0xFF000000) >> 24) * a1) + (((col2 & 0xFF000000) >> 24) * (1.0 - a1)))) << 24 | 
           ((int)((((col1 & 0x00FF0000) >> 16) * a1) + (((col2 & 0x00FF0000) >> 16) * (1.0 - a1)))) << 16 |
           ((int)((((col1 & 0x0000FF00) >> 8 ) * a1) + (((col2 & 0x0000FF00) >> 8 ) * (1.0 - a1)))) << 8  | 255;
}

(颜色为RGBA8888格式)

这有效,但我想知道:这是最快的方式,还是更有效率?

1 个答案:

答案 0 :(得分:1)

您可以通过将a1 *(2 ^ 24)表示为整数,以整数运算,然后将结果向下移位24位来提高性能。在现代架构上,我怀疑它会给你带来多少收获。如果你想要更好的性能,你真的需要进行SIMD操作。

哦,有一点:你应该将a1的计算表达为a1 = ((col1 & 0x000000FF) * (1.0 / 255.0))。这样可以避免昂贵的FP部门。 (由于潜在的精度损失,编译器通常不会自己做到这一点。)