【问题标题】:Libgdx Mesh rendering along with stageLibgdx Mesh 与舞台一起渲染
【发布时间】:2013-08-04 07:27:56
【问题描述】:

我正在尝试在 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 方法中绘制带有纹理的网格?

【问题讨论】:

    标签: libgdx mesh stage


    【解决方案1】:

    OpenGL 是一个“有状态”库(因此调用 OpenGL 所做的更改会一直持续到再次更改)。因此,stage.draw() 调用中的某些内容正在更改 OpenGL 状态,从而使网格的纹理无法正常工作。

    您可以尝试移动:

    Gdx.gl.glEnable(GL10.GL_TEXTURE_2D);
    

    打电话给你:

    texture.bind();
    mesh.render(GL10.GL_TRIANGLES, 0, 3);
    

    我认为舞台不会禁用纹理,但看起来它可能会。

    此外,如果您尝试直接从 Actor 的 draw 回调中绘制网格,您可能需要 endbatch 并围绕您的非批量绘制重新开始。批处理构造在其 beginend 调用之间对 OpenGL 状态进行了假设,因此如果您更改状态,它可能会感到困惑。相关示例请参见 libgdx - ShapeRenderer in Group.draw renders in wrong colour

    【讨论】:

    • 谢谢你的作品。似乎舞台在其逻辑中的某处禁用了纹理绑定。
    【解决方案2】:

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

    Gdx.gl10.glActiveTexture(GL10.GL_TEXTURE0);
    

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

    【讨论】:

    • Libgdx texture.bind() 调用应该可以做到这一点。
    猜你喜欢
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2016-06-22
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多