前段时间写了一个OBJ解析器。在重新访问和编写新的解析器时,我试图确定解释模型结构的最佳方式,以及每个网格需要多少个顶点数组/缓冲区(我正在使用 OpenGL,特别是 LWJGL)以支持多种材料。
我们有以下对象用于在 OpenGL 中渲染网格,以及网格的材质:
目前在我的项目中,Mesh 类拥有上述对象。扩展模型接口的类需要返回一个网格集合(这提供了通过简单地实现模型和提供网格来支持其他模型文件类型的灵活性)。理论上,我将遍历网格集合并每次进行绘制调用。
这使我能够拥有一个具有多个网格的模型,每个网格都有自己的材质。通过为每个网格使用单独的顶点数组和缓冲区,我能够为影响网格外观的材质属性上传统一变量。
这是正确的做法吗?还是每个模型都应该将其所有网格顶点打包成一个顶点缓冲区并使用一个顶点数组?如果是这样,我如何为每个网格上传不同的材料?顺便说一句,我的顶点缓冲区与位置、法线等交错
谢谢。
public class Material {
private Vector4 ambientColor;
private Vector4 diffuseColor;
private Vector4 specularColor;
private String name;
//...
}
public class Mesh {
private Material material;
private IndexBuffer indexBuffer;
private VertexBuffer vertexBuffer;
private VertexArray vertexArray;
private String name;
//...
}
public interface Model {
Mesh[] getMeshes();
}
public class WavefrontModel implements Model {
// Parse the OBJ and MTL, then construct the list of Meshes
@Override
public Mesh[] getMeshes() {
return meshes;
}
}