c++ - 优化 Alpha 混合

标签 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格式)

这行得通,但我想知道:这是最快的方法,还是有更高效的方法?

最佳答案

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

哦,有一件事:您应该将 a1 的计算表示为 a1 = ((col1 & 0x000000FF) * (1.0/255.0))。这将避免昂贵的 FP 部门。 (由于可能会丢失精度,编译器通常不会自行执行此操作。)

关于c++ - 优化 Alpha 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23048872/

相关文章:

webkit - 是否可以使用 WebKit 在清晰的背景上呈现网页内容?

c++ - 使用 libsocketcan 从用户空间启动/停止 CAN 板

c++ - QByteArray 转换为 char(不是 char* 或 constChar*)

c++ - 在 C++ 中部署文本文件

c++ - 编译 QDbus 服务器应用程序时出错?

具有 ARGB32 的 Linux 帧缓冲区。 Α?帧缓冲区如何支持 Alpha?

ios - SpriteKit 中的默认混合是如何工作的?

objective-c - iOS中如何实现部分透视效果?

math - 如何通过指定alpha混合量来计算RGB颜色?

c++ - 通过 fork 和 pipeline 调用 gnuplot 并更新绘图