WebGL 默认是透明的。以下是一个示例。
const gl = document.getElementById("c").getContext("webgl");
gl.clearColor(0.5, 0, 0, 0.5);
gl.clear(gl.COLOR_BUFFER_BIT);
pre {
padding-left: 50px;
font-family: sans-serif;
font-size: 20px;
font-weight: bold;
}
canvas {
z-index: 2;
position: absolute;
top: 0px;
border: 1px solid black;
}
<pre>
Some
text
under
the
canvas
</pre>
<canvas id="c"></canvas>
请注意,浏览器假定画布中的像素代表预乘阿尔法值。这意味着,例如,如果您将清除颜色更改为(1,0,0,0.5),则您将得到在HTML中没有看到的东西。
我的意思是预乘阿尔法意味着RGB部分已经被alpha值乘以了。因此,如果您的RGB起始值为1,0,0,而alpha为0.5。那么如果您将RGB乘以alpha,则会得到RGB的0.5,0,0。这就是浏览器默认期望的内容。
如果WebGL中的像素为1,0,0,0.5,则对浏览器来说没有意义,您将获得奇怪的效果。
例如请参见:
const gl = document.getElementById("c").getContext("webgl");
gl.clearColor(1, 0, 0, 0.5);
gl.clear(gl.COLOR_BUFFER_BIT);
pre {
padding-left: 50px;
font-family: sans-serif;
font-size: 20px;
font-weight: bold;
}
canvas {
z-index: 2;
position: absolute;
top: 0px;
border: 1px solid black;
}
<pre>
Some
text
under
the
canvas
</pre>
<canvas id="c"></canvas>
注意,即使您认为黑色文字的透明度为0.5 = 50%的黑色文字和50%的红色WebGL画布,它也变成了红色。那是因为红色没有被预乘。
您可以通过确保在WebGL中创建的值表示预乘值来解决此问题,或者在创建WebGL上下文时告诉浏览器您的WebGL像素未经预乘。
const gl = canvas.getContext("webgl", { premultipliedAlpha: false });
现在1,0,0,0.5像素再次有效。示例:
const gl = document.getElementById("c").getContext("webgl", {
premultipliedAlpha: false,
});
gl.clearColor(1, 0, 0, 0.5);
gl.clear(gl.COLOR_BUFFER_BIT);
pre {
padding-left: 50px;
font-family: sans-serif;
font-size: 20px;
font-weight: bold;
}
canvas {
z-index: 2;
position: absolute;
top: 0px;
border: 1px solid black;
}
<pre>
Some
text
under
the
canvas
</pre>
<canvas id="c"></canvas>
你可以选择任何一种方式实现这个效果。许多GL程序期望使用非预乘alpha,而HTML5的其他部分都期望使用预乘alpha,所以WebGL提供了这两个选项。
premultipliedAlpha
设置为false
时,我们得到的不透明度与CSS不透明度相同,这似乎与您所说的相反。我认为,“HTML5的所有其他部分”指的是使用CSS不透明度的所有内容,在这种情况下,我记得我们使用非预乘格式的rgba()
。例如,在CSS中,rgba(1,1,1,0)
是100%透明的,无论RGB值如何(非预乘)。 - trusktr