5 votes

LibGDX SpriteBatch Multitexture possible ?

J'utilise avec bonheur la classe SpriteBatch du Framework LibGDX. Mon but est de modifier la représentation du sprite à travers un shader.

batch = new SpriteBatch(2, shaderProgram);

J'ai copié le shader par défaut de la classe SpriteBatch et ajouté un autre échantillonneur uniforme 2d

+ "uniform sampler2D u_Texture2;\n"//

Existe-t-il un moyen efficace de donner la texture au shader. En procédant de cette manière, on obtient toujours un écran 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();

Chaque texture seule fonctionne. Le dessin manuel avec l'aide de la classe Mesh fonctionne comme prévu. Alors que puis-je faire pour utiliser la commodité de SpriteBatch ?

THX pour l'aide

7voto

Alejandro Cotroneo Points 1310

Je pense que le problème est lié à la liaison des textures. SpriteBatch suppose que l'unité de texture active sera 0, donc il fait un appel à

lastTexture.bind(); au lieu de lastTexture.bind(0);

Le problème est que l'unité active que vous lui donnez est 1 (comme vous l'appelez texture2.bind(1); dans votre code). Ainsi, l'unité de texture 0 n'est jamais liée, et c'est peut-être ce qui cause l'écran vide.

Par exemple, je voudrais ajouter un Gdx.GL20.glActiveTexture(0); avant le draw appels. Je ne suis pas sûr que cela résoudra le problème, mais c'est un début !

EDITAR: J'essaie la solution que je propose et ça marche ! :D. Pour être plus clair, vous devriez faire ceci :

      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();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X