【问题标题】:ShapeRenderer Transformations Interfering with Mesh Transformations in LibGDXShapeRenderer 变换干扰 LibGDX 中的网格变换
【发布时间】:2013-05-12 09:30:16
【问题描述】:

我正在开发一款包含大量旋转变换的游戏,但我遇到了一个看似很简单的问题 - 我认为我做错了什么。

我用 ShapeRenderer 画一个三角形,如下所示:

shapeRend.begin(ShapeType.Filled);
shapeRend.setColor(1, 1, 1, 1);
shapeRend.identity();
shapeRend.translate(xx, yy, 0);
shapeRend.rotate(0, 0, 1, angle);
shapeRend.triangle(-.08f, -.08f, .08f, -.08f, 0, +.08f);
shapeRend.end();
shapeRend.identity();

这一切都很好而且很漂亮,但是我有一些我在其他地方绘制的网格。对于这个三角形上的任何变换(我假设所有的 shaperenderer)发生然后被绘制,这些变换会影响所有的网格。这是一个真正的痛苦。

由于网格上的转换是通过实际更改顶点来处理的(我可以在源代码中看到),我认为在 ShapeRenderer 转换后没有重置 OpenGL 转换的情况下,还有其他事情在起作用?这非常令人沮丧,它看起来确实像一个小故障,但它会是一个相当大的故障,因为我看不到它直到现在才被发现。有什么建议吗?

我在使用 OpenGL ES 1.x 的“最新”夜间构建的 LibGDX 上运行

【问题讨论】:

    标签: java opengl-es libgdx transformation mesh


    【解决方案1】:

    在 OpenGL ES 1.x 中,ShapeRenderer 使用ImmediateModeRenderer10(请参阅ShapeRenderer constructor)。 ShapeRenderer 确实在它自己的 Matrix4 (“变换”字段)中跟踪旋转,但是当在底层渲染器上调用 begin(Matrix4, int) 时,组合的相机+变换矩阵被向下传递并将其存储到 global OpenGL 状态(特别是GL_PROJECTION 矩阵)。

    ShapeRenderer 不会“推送”或“弹出”全局矩阵状态,因此您可以自己围绕 shapeRend 调用(请参阅http://www.swiftless.com/tutorials/opengl/pop_and_push_matrices.html)来保存/恢复您的矩阵,或者您可以简单地重置GL_PROJECTIONGL_MODELVIEW 矩阵,然后再渲染网格。第二种方法更符合大多数 Libgdx 的工作方式(各种渲染器中的每一个都将在begin() 处设置它所依赖的状态,并且不假设全局状态中的任何内容都存在)。

    或者,您可以切换到 OpenGL ES 2.0,它没有任何全局矩阵状态(所有变换都通过着色器私有“统一”,请参阅 ImmeidateModeRenderer20.end())。

    【讨论】:

    • 切换到 OpenGL ES 2.0 似乎是最好的解决方案,即使它本身也会带来麻烦。我想我可能不得不稍后再做,因为着色器真的很有用,所以我现在也可以这样做。最重要的是,我似乎无法让 push 和 pop 矩阵快速工作。
    猜你喜欢
    • 2014-07-18
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多