1

我正在开发一款具有大量旋转变换的游戏,但我遇到了一个看起来很简单的问题——我认为我做错了什么。

我用 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 的“最新”夜间版本

4

1 回答 1

1

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

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

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

于 2013-05-12T15:35:47.757 回答