什麼是阿爾法混合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