LibGDX的SpriteBatch支持多纹理吗?

5

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

batch = new SpriteBatch(2, shaderProgram);

我从SpriteBatch类中复制了默认的着色器,并添加了另一个uniform采样器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();

每个纹理单独使用都能正常工作。在 Mesh 类的帮助下手动绘制也能按预期运行。那么,我该怎么做才能使用 SpriteBatch 的便利呢?

谢谢帮助。

1个回答

7
我猜问题与纹理绑定有关。SpriteBatch假设活动的纹理单元为0,因此它调用lastTexture.bind();而不是lastTexture.bind(0);
问题在于您提供的活动单元是1(因为您在代码中调用了texture2.bind(1);)。因此,纹理单元0从未被绑定,这可能导致屏幕空白。
例如,我会在draw调用之前添加一个Gdx.GL20.glActiveTexture(0);。我不太确定它是否能解决问题,但这是一个开始!
编辑:我尝试了我的建议解决方案,它起作用了!更清楚地说,您应该这样做:
      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();

嘿,终于得到了答案,谢谢!你是对的。这是因为类绑定纹理的方式。我需要说一下,我已经根据它制作了自己的自定义SpriteBatch类。SpriteBatch在渲染更大尺寸的帧缓冲纹理时也出现了一些问题。而且我总是先绑定TEXTURE0。这就是为什么我决定按照自己的方式来做。不太方便,但更加灵活。现在我有了一个只处理顶点生成的Sprite Batch。周围的一切都可以用自己的着色器进行自定义。 - fky
1
请注意,SpriteBatch不仅仅生成顶点,如果您不小心使用,可能会遇到性能问题。SpriteBatch本身存在一些“可用性”问题,但这是一个设计决策。它旨在简化最常见的绘图操作,但某种程度上会影响灵活性。无论如何,我已经能够解决迄今为止遇到的大部分问题(大多数情况下是在使用之前启用/禁用适当的OpenGL标志)。也许今晚我会尝试像你一样实现多重纹理,并让你知道 ;) - aacotroneo
1
抱歉又晚了,感謝您的支持。它已經像您編輯的那樣運作了。但是,我不喜歡這樣。在我看來,這看起來有點危險。我更喜歡我的專門版本,因為它體積更小,調試更好且速度更快。SpriteBatch 試圖讓每個人都滿意。在我看來,這不是一個真正優化性能的類。但無論如何,感謝您澄清了 SpriteBatch 使用的是 LAST BOUND 紋理而不僅僅是 TEXTURE0。 - fky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接