web-dev-qa-db-ja.com

dart:web_gl:レンダ警告:テクスチャユニット0にバインドされたテクスチャはレンダリングできません

エラーが発生します[.WebGLRenderingContext]RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering or is not 'texture complete'dartiumでWebアプリを実行するとき。コードの完全な書き直しを含め、この問題のトラブルシューティングを2日間試みましたが、問題を特定できません。

ただし、問題はこのコードにあると思います。

  void main() {
  ...
    var texture = gl.createTexture();
    var image = new ImageElement();
    image.onLoad.listen((e) {
      gl.bindTexture(webGL.TEXTURE_2D, texture);
      gl.texImage2DImage(webGL.TEXTURE_2D, 0, webGL.RGBA, webGL.RGBA, 
                       webGL.UNSIGNED_BYTE, image);
      gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MAG_FILTER, webGL.NEAREST);
      gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MIN_FILTER, webGL.NEAREST);
      gl.bindTexture(webGL.TEXTURE_2D, null);
    });
    image.src = "tex.png";
  ...
  }

tex.pngは32x32です

問題が何であるかについてのアイデアはありますか?

10
lightandlight

私の質問のコードの直後に、テクスチャをバインドしてサンプラーのユニフォームを送りました。イメージがロードされる前に実行されたため、これは間違っていました。これを修正するために、テクスチャをバインドして要素を描画する呼び出しをonload関数に入れます。

  image.onLoad.listen((e) {
    gl.bindTexture(webGL.TEXTURE_2D, texture);
    gl.texImage2DImage(webGL.TEXTURE_2D, 0, webGL.RGBA, webGL.RGBA, 
                       webGL.UNSIGNED_BYTE, image);
    gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MAG_FILTER, webGL.NEAREST);
    gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MIN_FILTER, webGL.NEAREST);
    gl.bindTexture(webGL.TEXTURE_2D, null);

    gl.activeTexture(webGL.TEXTURE0);
    gl.bindTexture(webGL.TEXTURE_2D, texture);
    gl.uniform1i(gl.getUniformLocation(shader.program, "uSampler"), 0);

    gl.drawElements(webGL.TRIANGLES, 6, webGL.UNSIGNED_SHORT, 0); 

  });

画像が読み込まれたことを確認します。

以前は、onloadコールバックを割り当ててから、次の一連のコマンド(テクスチャのバインドを含む)を実行していましたが、コンピューターは非常に高速であるため、既にテクスチャをバインドし、画像の読み込みが完了する前に描画しようとしました。

13
lightandlight