5

LibGDXフレームワークのSpriteBatchクラスをうまく使用しています。私の目的は、シェーダーを介してスプライトの表現を変更することです。

batch = new SpriteBatch(2, shaderProgram);

SpriteBatchクラスからデフォルトのシェーダーをコピーし、別の均一なサンプラー2dを追加しました

+ "uniform sampler2D u_Texture2;\n"//

シェーダーにテクスチャを与えるための実用的な方法はありますか?このようにすると、常にClearColor画面になります。

batch.begin();
  texture2.bind(1);
  shaderProgram.setUniformi("u_Texture2", 1);
  batch.draw(spriteTexture,positions[0].x,positions[0].y);
  batch.draw(spriteTexture,positions[1].x,positions[1].y);
batch.end();

各テクスチャだけが機能しています。メッシュクラスを使用して手動で描画すると、期待どおりに機能します。では、SpriteBatchの便利さを利用するにはどうすればよいですか?

ヘルプのためのTHX

4

1 に答える 1

7

そこにある問題はテクスチャバインディングに関連していると思います。SpriteBatchは、アクティブなテクスチャユニットが0になると想定しているため、

lastTexture.bind();それ以外のlastTexture.bind(0);

問題は、あなたがそれを与えているアクティブなユニットが1であるということです(あなたtexture2.bind(1);があなたのコードで呼び出すとき)。したがって、テクスチャユニット0がバインドされることはなく、画面が空白になる可能性があります。

たとえば、呼び出しのGdx.GL20.glActiveTexture(0);前にaを追加します。drawそれが問題を解決するかどうかはよくわかりませんが、それは始まりです!

編集: 私は私の提案した解決策を試してみて、それはうまくいきます!:D。明確にするために、これを行う必要があります。

      batch.begin();
      texture2.bind(1); 
      shaderProgram.setUniformi("u_Texture2", 1);
      Gdx.gl.glActiveTexture(GL10.GL_TEXTURE0);//This is required by the SpriteBatch!!
             //have the unit0 activated, so when it calls bind(), it has the desired effect.
      batch.draw(spriteTexture,positions[0].x,positions[0].y);
      batch.draw(spriteTexture,positions[1].x,positions[1].y);
    batch.end();
于 2012-09-05T13:10:36.823 に答える