我是否总是必须在libGDX中为Renderable指定索引数组?

时间:2013-12-27 12:48:48

标签: java opengl libgdx lwjgl

现在我有一个带有2个网格的项目,它们可以自己正确渲染。

我的目标是为其中一个(我想要显示的表面)添加光照,它由GL10_GL_TRIANGLES组成,而不是另一个(辅助网格),它(显然)组成来自GL10.GL_LINES

到目前为止,我设法将2编译为renderables,如下所示:

    grid.mesh.setVertices(gridMeshArray);
    grid.meshPartOffset = 0;
    grid.meshPartSize = grid.mesh.getNumIndices();
    grid.primitiveType = GL10.GL_LINES;
    grid.material = new Material();
    grid.bones = null;

    sampleSurface.mesh.setVertices(meshVArray);
    sampleSurface.mesh.setIndices(meshIArray);
    sampleSurface.meshPartOffset = 0;
    sampleSurface.meshPartSize = sampleSurface.mesh.getNumIndices();
    sampleSurface.primitiveType = GL10.GL_TRIANGLES;
    sampleSurface.material = new Material();
    sampleSurface.bones = null;

当我运行程序时,我看到sampleSurface,但不是网格。 渲染如下:

    MB.begin(cam.getCam());
        MB.render(sampleSurface);
        MB.render(grid);
    MB.end();

值得一提的是,我现在没有使用任何着色器,只是命令:

    cam.apply(Gdx.gl10);

这不是最好的做法,而且我计划在有时间讨论这个主题后更换它。

我的猜测是,网格不会显示,因为我没有为它们指定索引数组。这似乎是两个renderables之间的唯一区别。 (不计算环境,因为更改grid.environment没有任何影响。)

为网格定义索引数组似乎非常不合逻辑,因为它实际上没有重叠的顶点。我不知道该怎么做,或者问题在哪里,因为2个网格自己完美地绘制。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:3)

http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/Renderable.html#meshPartSize #meshPartSize Renderable成员用于指定要渲染的网格部分的大小(在顶点中)。当不渲染条带时,基元的数量乘以每个基元的顶点数量。因此,如果要渲染4个三角形(GL_TRIANGLES),则大小为12(4个三角形* 3个顶点= 12个顶点)。如果要渲染12行(GL_LINES),则大小为24(12行* 2个顶点=总共24个顶点)。

实际上,这意味着,如果对网格进行索引,则大小等于要渲染的索引数。如果网格未编入索引,则它等于要渲染的顶点数。如果网格包含的索引数大于零(mesh.getNumIndices() > 0),则会将其视为索引。

要具体说明:如果已建立索引,则glDrawElements将与指定的offset和count参数一起使用。否则glDrawArrays将与指定的offset和count参数一起使用。

话虽如此:请注意,某些类可能需要索引网格,同时请注意GLES1.x可能不完全受支持。所以在实践中建议使用索引网格和GLES2。

答案 1 :(得分:1)

喝完啤酒后散步,我看了@ Xoppa的答案,这让我看到了我的错误。

简单地改变

grid.meshPartSize = grid.mesh.getNumIndices();

grid.meshPartSize = grid.mesh.getNumVertices();

解决了我的问题,现在显示正确。