看起來不像RGB1那樣簡單* A1 + RGB2 * A2 ...數值如何剪切?加權?等等alpha混合如何在數學上逐像素地工作?
這是一個上下文相關的問題?是否有不同的算法,產生不同的結果?還是一個標準的實現?
我對OpenGL特定的答案特別感興趣,但來自其他環境的上下文也很有用。
看起來不像RGB1那樣簡單* A1 + RGB2 * A2 ...數值如何剪切?加權?等等alpha混合如何在數學上逐像素地工作?
這是一個上下文相關的問題?是否有不同的算法,產生不同的結果?還是一個標準的實現?
我對OpenGL特定的答案特別感興趣,但來自其他環境的上下文也很有用。
我不知道OpenGL的,但不透明度的一個像素通常被畫在另一像素像這樣:
result.r = background.r * (1 - A) + foreground.r * A
result.g = background.g * (1 - A) + foreground.g * A
result.b = background.b * (1 - A) + foreground.b * A
重複此操作多個像素。
如果圖像不是預乘alpha,上面的答案有效。但是,如果您使用預乘alpha圖像的混合類型,則會出現黑色邊框。
預乘alpha:
當創建圖像,顏色值由alpha通道相乘。看看這一個像素例如:
Pixel: r = 1, g = 0, b = 0, a = 0.5
當它的保存,將RGB瓦萊斯將由alpha值給予相乘:
Pixel: r = 0.5, g = 0, b = 0, a = 0.5
融入這種形象你需要使用下面的公式:
result.r = background.r * (1 - A) + foreground.r
result.g = background.g * (1 - A) + foreground.g
result.b = background.b * (1 - A) + foreground.b
非預乘阿爾法
在此示例中,alpha通道與顏色通道完全分離。
Pixel: r = 1, g = 0, b = 0, a = 0.5
當它保存:
Pixel: r = 1, g = 0, b = 0, a = 0.5
這是相同的。在這種情況下,minitech提供的答案是正確的。
更多細節可以在這裏找到:Premultiplied alpha
http://en.wikipedia.org/wiki/Alpha_blending#Alpha_blending –