我很高兴使用LibGDX Framework的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();
每个纹理都在起作用。在Mesh类的帮助下手动绘制按预期工作。那么我该如何使用SpriteBatch的便利性呢?
THX寻求帮助
答案 0 :(得分:7)
我猜那里的问题与纹理绑定有关。 SpriteBatch假设活动纹理单元为0,因此它调用
lastTexture.bind();
代替lastTexture.bind(0);
问题是你给它的主动单元是1(你在代码中调用texture2.bind(1);
)。因此,纹理单元0永远不会被绑定,并且可能会导致空白屏幕。
例如,我会在Gdx.GL20.glActiveTexture(0);
来电之前添加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();