长话短说,我需要在javascript中进行alpha混合,因为我想要别名图形(AA不能在这里关闭),而webGL目前不是一个选项。不要评判我。 :d
有趣的是,我的结果是产生了一种类似的现象,我在原生画布上观察到的阿尔法混合,所以我不会觉得太糟糕,但我只是想得到我知道这里发生了什么。
example is on KA让你更容易扭动。
这是我的方法:
// sanity check
// https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
// var sA = alpha ( sRGBA ) / 255;
// var dA = alpha ( dRGBA ) / 255;
// var rA = sA + dA * ( 1 - sA );
// var pRGB = [ red ( sRGBA ), green ( sRGBA ), blue ( sRGBA ) ].map ( function ( e ) {
// return e * sA;
// } );
// var rRGBA = [ red ( dRGBA ), green ( dRGBA ), blue ( dRGBA ) ].map ( function ( e, i ) {
// return Math.round ( ( pRGB [ i ] + e * dA * ( 1 - sA ) ) / rA );
// } );
// rRGBA.push ( Math.round ( rA * 255 ) );
// println ( rRGBA );
// horrible bit hack and lookup
var blendAlpha = ( function () {
// lookup table for division
var aDiv = ( function () {
return this.Function ( "return new Uint32Array(256);" )();
} ) ();
// Aout = 0 => RGBout = 0
for ( var i = 1; i < 256; i = i + 1 ) {
aDiv [ i ] = 257 * 255 / i;
}
return function ( sRGBA, dRGBA ) {
sRGBA = sRGBA >>> 0;
dRGBA = dRGBA >>> 0;
var s = ( 1 + ( sRGBA >>> 24 ) ) >>> 0, d = ( 1 + ( dRGBA >>> 24 ) ) >>> 0,
a = ( s + d - ( s * d >>> 8 ) - 1 ) >>> 0,
ia = ( 257 - s ) >>> 0,
RB = 0xff00ff >>> 0,
G = 0xff00 >>> 0,
rb = (
( s * ( sRGBA & RB ) >>> 8 & RB >>> 0 ) +
( ( d * ( dRGBA & RB ) >>> 8 & RB >>> 0 ) * ia >>> 8 & RB >>> 0 )
) * aDiv [ a ] >>> 8 & RB >>> 0,
g = (
( s * ( sRGBA & G ) >>> 8 & G >>> 0 ) +
( ( d * ( dRGBA & G ) >>> 8 & G >>> 0 ) * ia >>> 8 & G >>> 0 )
) * aDiv [ a ] >>> 8 & G >>> 0;
return rb | g | a << 24 >>> 0;
};
} ) ();
以下是我看到的低alpha源颜色和透明目标:
source destination result native
======================================================
0,127,0,0 0,0,0,0 0,0,0,1 0,0,0,0
0,127,0,1 0,0,0,0 0,0,0,2 0,0,0,1
0,127,0,2 0,0,0,0 0,85,0,3 0,128,0,2
0,127,0,3 0,0,0,0 0,63,0,4 0,85,0,3
0,127,0,4 0,0,0,0 0,102,0,5 0,128,0,4
0,127,0,5 0,0,0,0 0,85,0,6 0,102,0,5
0,127,0,6 0,0,0,0 0,109,0,7 0,128,0,6
0,127,0,7 0,0,0,0 0,95,0,8 0,109,0,7
0,127,0,8 0,0,0,0 0,113,0,9 0,128,0,8
0,127,0,9 0,0,0,0 0,102,0,10 0,113,0,9
否则结果值是可以接受的,例如,在源上的alpha范围内更高。
我认为分歧是我进行分裂步骤的结果,但我不确定。
有没有人更好地了解这里发生了什么或者之前处理过这类问题?
如果我的方法有缺陷/糟糕,我现在不在乎。我稍后会对此进行处理,只是对奇怪/意外的分叉感到好奇。我本来期待一个阶梯,或类似的东西,但不是这个。