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>
ブラウザーは、キャンバス内のピクセルが PRE-MULTIPLIED-ALPHA 値を表していると想定していることに注意してください。つまり、たとえば、クリア カラーを (1, 0, 0, 0.5) に変更すると、HTML の他のどこにも見られないものが得られます。
つまり、Pre-multiplied alpha とは、RGB 部分が既にアルファ値で乗算されていることを意味します。したがって、RGB を 1,0,0 で開始し、アルファが 0.5 の場合。次に、RGB にアルファを掛けると、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% と赤の WebGL キャンバスの 50% と考えても、黒のテキストが赤くなっていることに注意してください。これは、赤が事前に乗算されていないためです。
これを解決するには、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 プログラムは事前乗算されていないアルファを想定していますが、HTML5 の他のすべての部分は事前乗算されたアルファを想定しているため、WebGL は両方のオプションを提供します。