什么是阿尔法混合2 RGBA(整数)色的最快方法?
作为说明,混合的目标颜色总是不透明的,只有第二种颜色可以具有不同的透明度级别。
我试图找到在C最快的方式,考虑到从混合物中最终得到的颜色必须与没有透明度,完全不透明的(alpha = 0xFF的)
什么是阿尔法混合2 RGBA(整数)色的最快方法?
作为说明,混合的目标颜色总是不透明的,只有第二种颜色可以具有不同的透明度级别。
我试图找到在C最快的方式,考虑到从混合物中最终得到的颜色必须与没有透明度,完全不透明的(alpha = 0xFF的)
int blend(unsigned char result[4], unsigned char fg[4], unsigned char bg[4])
{
unsigned int alpha = fg[3] + 1;
unsigned int inv_alpha = 256 - fg[3];
result[0] = (unsigned char)((alpha * fg[0] + inv_alpha * bg[0]) >> 8);
result[1] = (unsigned char)((alpha * fg[1] + inv_alpha * bg[1]) >> 8);
result[2] = (unsigned char)((alpha * fg[2] + inv_alpha * bg[2]) >> 8);
result[3] = 0xff;
}
我不结束不知道它有多快,但它是整数。它通过将alpha(和inv_alpha)转换为8.8个定点表示来工作。不要担心alpha的最小值为1的情况。在这种情况下,fg [3]为0,这意味着前景是透明的。混合将是1 * fg + 256 * bg,这意味着fg的所有位将被移出结果。
如果你用64位整数打包你的RGBA,你可以做得非常快。然后,您可以使用单个表达式并行计算所有三种结果颜色。
工程简单完美,确实相当快。 – PerracoLabs 2012-08-18 10:24:53
很高兴听到它 - 对于未经测试的代码不错,而浪费在凌晨2点? =] – Sniggerfardimungus 2012-08-18 23:39:29
+1我一直在琢磨如何让alpha混合在今天更好的部分工作。你的算法是我测试过的第一个实际上......好的,可行的。 – 2014-04-03 17:18:32
此链接不起作用 – PerracoLabs 2012-08-18 05:43:40
你能帮助我们理解你的问题和那个问题之间的区别吗?看来我们中的一些人感到困惑。 – sblom 2012-08-18 06:51:28
不重复。这会在简单的旧'C'中询问alpha混合。这个重复的假设问题提出了一个类似的问题,但关于'C++'。两种相似,但非常不同的语言。 – 2014-04-03 17:43:40