我正在尝试在Libgdx中渲染纹理网格和舞台。当我将stage.draw
置于mesh.render()
之上时,我有问题渲染纹理。
案例1:
public void render(float delta) {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glEnable(GL10.GL_TEXTURE_2D);
stage.act(delta);
stage.draw();
texture.bind();
mesh.render(GL10.GL_TRIANGLES, 0, 3);
}
// -- This is in my create method:
mesh = new Mesh(true, 3, 3,
new VertexAttribute(Usage.Position, 3, "a_position"),
new VertexAttribute(Usage.ColorPacked, 4, "a_color"),
new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoords"));
mesh.setVertices(new float[] { 50, 50, 0,Color.toFloatBits(255, 0, 0, 255),0,1,
50, 500, 0,Color.toFloatBits(0, 255, 0, 255),0,0,
500, 50, 0, Color.toFloatBits(0, 0, 255, 255),1,1 });
mesh.setIndices(new short[] { 0, 1, 2 });
在上面的例子中,我无法渲染纹理,但能够渲染渐变三角形。
案例2:
public void render(float delta) {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glEnable(GL10.GL_TEXTURE_2D);
texture.bind();
mesh.render(GL10.GL_TRIANGLES, 0, 3);
stage.act(delta);
stage.draw();
}
在这种情况下,我能够在三角形上正确渲染纹理。
我的问题:
stage.draw()
和mesh.render()
的顺序会影响纹理,尽管我可以绘制三角形。draw
方法中使用纹理绘制网格?答案 0 :(得分:2)
OpenGL是一个“有状态”的库(因此通过调用OpenGL所做的更改会持续存在,直到再次更改)。因此,stage.draw()
调用中的某些内容正在改变OpenGL状态,使得网格物体的纹理不起作用。
您可以尝试移动:
Gdx.gl.glEnable(GL10.GL_TEXTURE_2D);
打电话给你:
texture.bind();
mesh.render(GL10.GL_TRIANGLES, 0, 3);
我认为舞台不会启用纹理,但看起来可能会这样。
此外,如果您尝试直接从Actor的draw
回调中绘制网格,则可能需要end
batch
并重新启动非批量绘图。批处理构造在其begin
和end
调用之间对OpenGL状态进行了假设,因此如果更改状态,可能会感到困惑。有关相关示例,请参阅libgdx - ShapeRenderer in Group.draw renders in wrong colour。
答案 1 :(得分:0)
对不起,这只是猜测:尝试添加
Gdx.gl10.glActiveTexture(GL10.GL_TEXTURE0);
绘制网格和舞台之间,或之后,或之前...我有类似的问题,我想使用着色器和BitmapFonts