所以,我在我的游戏中创建了一个由 2 个三角形组成的网格。现在我想把这个网格变成一个模型,这样它就可以用 ModelBatch 渲染了。如果我只是单独渲染它,它会给我模型带来奇怪的深度问题:
如果我一起渲染多个不同的模型,它不会给我错误(两种树)。因此,如果我将其渲染为模型,问题有望消失。
网上找了好久也没找到答案。我什至花了一些时间查看 libGDX 文档,但一无所获。任何帮助将不胜感激。谢谢。
如您所说,要在
mesh
中使用modelBatch
,您必须在model
中传递它。为此,您必须创建一个具有所需顶点和索引的mesh
。
Vertices:是构成 3D/2D 形状的点(这里是由两个三角形组成的平面)。
Indices:必须三角化的顶点的顺序,indicies 必须是“冗余的”以关闭和三角化路径。
例如这里有一张图片可以更好地解释:
然后你必须指定position、uv和normals的属性。属性用于向着色器提供信息(
mesh
必须使用着色器渲染)。对于每个顶点,着色器都有这些属性给出的信息。
Position:是空间中顶点的 3D 点。
UV :用于纹理映射并且是强制性的(更多信息here)。
法线:是归一化向量,面或顶点的法线(在你的情况下,我假设它只指向每个顶点的北极)。
创建你的
mesh
:
Mesh mesh = new Mesh(true, vertices.length, indices.length,
new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE),
new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE),
new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE));
mesh.setVertices(vertices);
mesh.setIndices(indices);
如果网格是动态的,则网格需要布尔值、顶点长度、索引长度和一些为着色器提供属性的顶点属性。
model
的默认着色器使用 ShaderProgram.POSITION_ATTRIBUTE
、ShaderProgram.TEXCOORD_ATTRIBUTE
和 ShaderProgram.NORMAL_ATTRIBUTE
,您可以调整它们以使用自己的着色器。
然后添加顶点和索引。对于您的情况
vertices
和indices
是:
float vertices[] = {-1, -1, 0, // bottom left corner
-1, 1, 0, // top left corner
1, 1, 0, // top right corner
1, -1, 0}; // bottom right corner
short indices[] = {0,1,2, // first triangle (bottom left - top left - top right)
0,2,3}; // second triangle (bottom left - top right - bottom right)
创建网格后,您需要将其提供给
modelBuilder
,如下所示
ModelBuilder modelBuilder = new ModelBuilder(); // creates model build
modelBuilder.begin();// begin it
modelBuilder.part("plane", mesh,
GL20.GL_TRIANGLES,
0,
mesh.getNumIndices(),
new Material()); // creates your mesh
model = modelBuilder.end(); // makes the model
instance = new ModelInstance(model);
//...
//render it in render loop
modelBatch.begin(camera);
modelBatch.render(instance, environment);
modelBatch.end();
以下主要是:
希望它能帮助您和其他正在寻找相同过程的人。