重複の可能性:
アルファ ブレンドを高速に行うには?
2 つの RGBA (整数) 色をアルファ ブレンドする最速の方法は何ですか?
注意として、ブレンドするターゲット カラーは常に不透明であり、2 番目のカラーのみが異なるレベルの透明度を持つことができます。
ブレンドから最終的に得られる色は透明度がなく、完全に不透明 (アルファ = 0xff) になる必要があることを考慮して、C で最速の方法を見つけようとしています。
重複の可能性:
アルファ ブレンドを高速に行うには?
2 つの RGBA (整数) 色をアルファ ブレンドする最速の方法は何ですか?
注意として、ブレンドするターゲット カラーは常に不透明であり、2 番目のカラーのみが異なるレベルの透明度を持つことができます。
ブレンドから最終的に得られる色は透明度がなく、完全に不透明 (アルファ = 0xff) になる必要があることを考慮して、C で最速の方法を見つけようとしています。
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 のすべてのビットが結果からシフトアウトされることを意味します。
実際、RGBA を 64 ビット整数でパックした場合、非常に高速に実行できます。次に、3 つの結果の色すべてを 1 つの式で並列に計算できます。