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

时间:2013-05-12 09:30:16

标签: java opengl-es libgdx transformation mesh

我正在制作一个有很多旋转变换的游戏,我遇到了一个看起来非常简单的问题 - 我认为我做错了。

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

哪个都很精致,但是我有一些网格画在其他地方。对于此三角形上的任何变换(我假设所有的shaperenderers)发生然后得到绘制,这些变换会影响所有网格。这真是一种痛苦。

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

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

1 个答案:

答案 0 :(得分:1)

使用OpenGL ES 1.x,ShapeRenderer使用ImmediateModeRenderer10(请参阅ShapeRenderer constructor)。 ShapeRenderer会跟踪自己的Matrix4(“转换”字段)中的轮播,但是当在底层渲染器上调用begin(Matrix4, int)时,组合的摄像机+转换矩阵会向下传递,它被存储到全局 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())。