有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ShapeRenderer转换干扰LibGDX中的网格转换

我正在做一个有很多旋转变换的游戏,我遇到了一个看起来很简单的问题——我想我做错了什么

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

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();

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

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

我正在使用OpenGL ES 1运行LibGDX的“最新”夜间版本。x


共 (1) 个答案

  1. # 1 楼答案

    使用OpenGL ES 1。x、 ShapeRenderer使用^{}(参见^{} constructor)。ShapeRenderer确实会在其自身的Matrix4(“transform”字段)中跟踪旋转,但当在底层渲染器上调用^{}时,组合的camera+变换矩阵会向下传递,并将其存储到全局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,它没有任何全局矩阵状态(所有变换都由着色器私有的“统一”,请参见^{}