关于 java:ShapeRenderer 变换干扰 LibGDX 中的网格变换

ShapeRenderer Transformations Interfering with Mesh Transformations in LibGDX

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

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

1
2
3
4
5
6
7
8
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 上运行


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

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

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