2012-08-15 8 views
5

LibGDX FrameworkのSpriteBatchクラスをうれしく使っています。 私の目的は、シェーダーを通してスプライトの表現を変更することです。LibGDX SpriteBatchマルチテクスチャ可能ですか?

batch = new SpriteBatch(2, shaderProgram); 

私はSpriteBatchクラスからデフォルトのシェーダをコピーして別の 均一なサンプラー2D

+ "uniform sampler2D u_Texture2;\n"// 

を追加しましたが、シェーダにテクスチャを与える作業方法はあります。 このようにすると、allwaysはClearColor Screenで終了します。

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の便利さを使うために何をすることができますか?私は、問題はテクスチャのバインディングに関連があると思いヘルプ

答えて

6

ため

THX。 SpriteBatchはアクティブなテクスチャユニットが0になることをasumesので、

lastTexture.bind();代わりのlastTexture.bind(0);

問題への呼び出しを行い、あなたのコード内でtexture2.bind(1);を呼び出すと、あなたがそれを与えているアクティブユニットは、(1であるということです)。だから、テクスチャユニット0は決して束縛されず、空白のスクリーンを引き起こすかもしれない。

例えば、私はdrawの呼び出しの前にGdx.GL20.glActiveTexture(0);を追加します。私はそれが問題を解決することは確かではありませんが、それはスタートです!

編集: 私は私の提案する解決策を試してみてください! :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(); 
+0

ちょっと最後に、私はanswere、感謝を得ました! あなたは正しいです。それはクラスがテクスチャをバインドする方法の原因です。私は自分のカスタムスプライトバッチクラスをすでに作っていると言いたい。 SpriteBatchは、より大きなサイズのFramebufferテクスチャをレンダリングする際にいくつかの問題も示しています。そして、私は常に前にTEXTURE0をバインドします。それで私は自分のやり方でやることに決めました。それほど納得がいくことはできませんが、より柔軟な方法です今私は頂点の世代だけを扱うスプライトバッチを持っています。すべてのarroundは、独自のシェーダでカスタマイズできます。 – fky

+1

SpriteBatchは頂点を生成する以外にも少しパフォーマンスが向上します。 SpriteBatch自体にはいくつかの「使い勝手」の問題がありますが、設計上の決定です。最も一般的な描画操作を簡素化することを意図しており、何らかの形で柔軟性が損なわれています。とにかく、私はこれまでに遭遇した問題のほとんどを解決することができました(ほとんどの場合、それを使用する前に適切なOpenGLフラグを有効/無効にしています)。おそらく今夜はあなたと同じようにマルチテクスチャを実装しようとしています;) –

+1

もう一度遅れて、あなたのサポートに感謝しています。編集したように機能しています。しかし、私はそれが好きではありません。これは親切に私にとっては危険に見えます。私は、私の専門化されたバージョンも好んでいます。これは、より小さなサイズのより速く、より良いデバッグ可能な原因です。 SpriteBatchは皆を幸せにしようとしています。私の意見では、パフォーマンス最適化クラスではありません。しかし、とにかくSpriteBatchがTEXTURE0だけでなくLAST BOUNDテクスチャを使用していることを明確にしてくれてありがとう – fky

関連する問題