WebGL:当 alpha 为 0 时,为什么透明画布显示clearColor颜色分量?

Tre*_*vor 4 webgl

这是一个简单的尖峰,显示了我的问题:

<html>
<head>
    <title>Clear Color</title>
    <style type="text/css">
        #stage {
            background-color: rgba(127,127,127,1);
        }
    </style>
</head>
<body>
    <canvas id="stage" width="100", height="100"></canvas>
    <script type="text/javascript">
        var options = {
            alpha: true,
            premultipliedAlpha: true
        };
        var ctx = document.getElementById("stage").getContext("webgl", options);
        ctx.clearColor(1, 0, 0, 0);
        ctx.enable(ctx.BLEND);
        ctx.blendFuncSeparate(
            ctx.SRC_ALPHA, ctx.ONE_MINUS_SRC_ALPHA,
            ctx.ONE, ctx.ONE_MINUS_SRC_ALPHA
        );
        ctx.clear(ctx.COLOR_BUFFER_BIT);
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

BlendFunc 是这样的:
(sR*sA) + (dR*(1-sA)) = rR
(sG*sA) + (dG*(1-sA)) = rG
(sB*sA) + (dB*(1 -sA)) = rB
(sA*1) + (dA*(1-sA)) = rA

...这意味着(我认为):
(1*0) + (0.5*(1-0)) = 0.5
(0*0) + (0.5*(1-0)) = 0.5
(0*0 ) + (0.5*(1-0)) = 0.5
(0*1) + (1.0*(1-0)) = 1.0

为什么我看到的是浅粉色画布,而不是 CSS 声明的灰色?粉色显然来自我的clearColor,但为什么当alpha分量为0时它会显示红色?

gma*_*man 6

默认情况下,WebGL 要求您的颜色使用预乘 alpha。1,0,0,0 是无效颜色,因为 (1,0,0) * alpha (0) = 0,0,0 的 rgb 不是 1,0,0,所以它是无效颜色,并且规格未定义无效的颜色。在不同的浏览器上结果会有所不同。

你有几个选择

您的混合设置没有效果。它们仅在调用时使用gl.drawXXX,当画布与背景合成时不使用它们。