フラグメント シェーダーで 2 つのテクスチャを使用しようとしていますが、WebGL でテクスチャを適切に送信するのに問題があります。一度に 1 つずつ送信できますが、両方を同時に送信しようとすると、真っ黒になります。他にもマルチテクスチャリングの例をいくつか見てきましたが、それらはすべて画像の配列の読み込みを扱っています。
ビデオを 1 つのテクスチャにロードし、キャンバスを 2 つ目のテクスチャにロードしたいと考えています。私が書いた c++ opengl プログラムからシェーダーを移動しているだけなので、すべてのシェーダーが正常であることはほぼ確実です。また、動画やキャンバスをそれぞれコメントアウトすることで個別に表示することもできますが、上記のように一緒にするとエラーになるようです。
これは、テクスチャを作成して塗りつぶしているコードのスニペットです。
var texture1 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture1);
var texture2 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture2);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER, gl.NEAREST);
そして、私の描画ループ内:
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE, video);
var tex1loc = gl.getUniformLocation(program,"u_image");
gl.uniform1i(tex1loc, 0);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture1);
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE, canvas);
var tex2loc = gl.getUniformLocation(program, "u_image2");
gl.uniform1i(tex2loc, 1);
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, texture2);
次のような警告メッセージも表示されます。
GL_INVALID_ENUM : glActiveTexture: テクスチャは GL_FALSE でした
GL_INVALID_ENUM : glActiveTexture: テクスチャは GL_LINES でした
また:
WebGL: drawArrays: テクスチャ ユニット 0 にバインドされたテクスチャはレンダリングできません。2 の累乗ではなく、テクスチャ フィルタリングに互換性がないか、「テクスチャが完全」ではありません。または、OES_float_linear または OES_half_float_linear 拡張機能が有効になっていないときに、テクスチャがリニア フィルタリングを使用する Float または Half Float タイプです。
警告をトリガーする行は次のとおりです。
gl.drawArrays(gl.TRIANGLES, 0,6);
助けてくれてありがとう!