Libgdx Mesh渲染与舞台

时间:2013-08-04 07:27:56

标签: libgdx mesh stage

我正在尝试在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();
}

在这种情况下,我能够在三角形上正确渲染纹理。

我的问题:

  1. 为什么stage.draw()mesh.render()的顺序会影响纹理,尽管我可以绘制三角形。
  2. 如何在actor的draw方法中使用纹理绘制网格?

2 个答案:

答案 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并重新启动非批量绘图。批处理构造在其beginend调用之间对OpenGL状态进行了假设,因此如果更改状态,可能会感到困惑。有关相关示例,请参阅libgdx - ShapeRenderer in Group.draw renders in wrong colour

答案 1 :(得分:0)

对不起,这只是猜测:尝试添加

Gdx.gl10.glActiveTexture(GL10.GL_TEXTURE0);

绘制网格和舞台之间,或之后,或之前...我有类似的问题,我想使用着色器和BitmapFonts