2012-08-15 70 views
5

我很高兴地使用LibGDX框架的SpriteBatch类。 我的目标是通过着色器修改精灵的表示。LibGDX SpriteBatch Multitexture可能吗?

batch = new SpriteBatch(2, shaderProgram); 

我复制从SpriteBatch类的默认渲染,加上另一个 均匀采样2D

+ "uniform sampler2D u_Texture2;\n"// 

有没有一种工作方式给纹理着色器。 这样做,allways结束了一个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 for Help

回答

6

我猜这个问题与纹理绑定有关。 SpriteBatch asumes的活动纹理单元将是0,所以它对

lastTexture.bind();而不是lastTexture.bind(0);

问题一个电话是你给它的活跃单位为1(如你在你的代码中调用texture2.bind(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

嘿最后我得到了答案,谢谢! 你说得对。这是类绑定纹理的原因。我需要说我已经制作了我自己的自定义SpriteBatch类。 SpriteBatch在渲染更大尺寸的Framebuffer纹理时也显示了一些问题。我之前总是绑定TEXTURE0。这就是为什么我决定按照自己的方式去做。不太方便,但方式更灵活。现在我有一个Sprite Batch,它只处理顶点的生成。所有东西都可以用自己的着色器进行定制。 – fky 2012-09-07 16:20:09

+1

请注意,SpriteBatch只会生成顶点,如果您不小心,会遇到性能问题。 SpriteBatch本身有一些“可用性”问题,但这是一个设计决定。它旨在简化最常见的绘图操作,并以某种方式伤害灵活性。无论如何,我已经能够解决目前为止我遇到的大多数问题(大多数情况下,在使用之前启用/禁用适当的opengl标志)。也许今晚我会尝试像你一样实施多纹理,并让你知道;) – 2012-09-07 17:33:18

+1

谢谢你的支持。它像你编辑的一样工作。但是,我不喜欢它。这对我来说看起来很危险。我更喜欢我的专用版本,因为它的体积更小,因此也更快,更好的调试。 SpriteBatch正在努力让每个人都开心。在我看来,这不是真正的性能优化类。但无论如何,感谢您澄清SpriteBatch使用最后绑定纹理而不仅仅是TEXTURE0 – fky 2012-09-17 15:26:11