之所以預乘的作品,是因爲它實際上結束了現蕾目標阿爾法它添加源圖像到目標
如前。如果沒有預乘法,我們得到這個源圖像數據:
srcA = origA
srcR = origR
srcG = origG
srcB = origB
當應用於某一目標,我們得到這個結果圖像:
a = ((srcA * srcA) >> 8) + ((tgtA * (255 - srcA)) >> 8)
r = ((srcR * srcA) >> 8) + ((tgtR * (255 - srcA)) >> 8)
g = ((srcG * srcA) >> 8) + ((tgtG * (255 - srcA)) >> 8)
b = ((srcB * srcA) >> 8) + ((tgtB * (255 - srcA)) >> 8)
擴大這一點,我們得到:
a = ((origA * origA) >> 8) + ((tgtA * (255 - origA)) >> 8)
r = ((origR * origA) >> 8) + ((tgtR * (255 - origA)) >> 8)
g = ((origG * origA) >> 8) + ((tgtG * (255 - origA)) >> 8)
b = ((origB * origA) >> 8) + ((tgtB * (255 - origA)) >> 8)
沒有意外出現......
現在的乘前的源圖像數據,我們得到:
srcA = (origA * origA) >> 8
srcR = (origR * origA) >> 8
srcG = (origG * origA) >> 8
srcB = (origB * origA) >> 8
,當應用於目標是:
a = (srcA >> 8) + ((tgtA * (255 - srcA)) >> 8);
r = (srcR >> 8) + ((tgtR * (255 - srcA)) >> 8);
g = (srcG >> 8) + ((tgtG * (255 - srcA)) >> 8);
b = (srcB >> 8) + ((tgtB * (255 - srcA)) >> 8);
好了,我們知道這一點,但如果我們擴大了這一點,你會看到其中的差別:
a = (origA * origA) >> 8 + ((tgtA * (255 – ((origA * origA) >> 8))) >> 8);
r = (origR * origA) >> 8 + ((tgtR * (255 - ((origA * origA) >> 8))) >> 8);
g = (origG * origA) >> 8 + ((tgtG * (255 – ((origA * origA) >> 8))) >> 8);
b = (origB * origA) >> 8 + ((tgtB * (255 – ((origA * origA) >> 8))) >> 8);
比較那到NON預擴增的:
a = ((origA * origA) >> 8) + ((tgtA * (255 - origA)) >> 8)
r = ((origR * origA) >> 8) + ((tgtR * (255 - origA)) >> 8)
g = ((origG * origA) >> 8) + ((tgtG * (255 - origA)) >> 8)
b = ((origB * origA) >> 8) + ((tgtB * (255 - origA)) >> 8)
立即可以看到我們在將原始值應用到目標時將原始值平方,這意味着更多的目標會通過所產生的顏色值。
通過對它進行平方,你在說,我想要更多的目標來通過。
這就是爲什麼預乘時會消除透明塊周圍的條帶數量,因爲具有較低Alpha值的像素會獲得更多的目標像素,而不是您如果不預乘,而且發生在指數規模。
我希望這可以清除它。
我認爲`srcA * srcA`在第一個代碼塊應該只是`srcA`。你不需要自行乘以alpha。 – 2011-02-01 21:03:01