现在我有一个带有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个网格自己完美地绘制。任何帮助表示赞赏!
答案 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();
解决了我的问题,现在显示正确。