分歧值?

时间:2016-12-11 12:02:21

标签: javascript integer-arithmetic

长话短说,我需要在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范围内更高。

我认为分歧是我进行分裂步骤的结果,但我不确定。

有没有人更好地了解这里发生了什么或者之前处理过这类问题?

如果我的方法有缺陷/糟糕,我现在不在乎。我稍后会对此进行处理,只是对奇怪/意外的分叉感到好奇。我本来期待一个阶梯,或类似的东西,但不是这个。

0 个答案:

没有答案