在我的程序中,我加载 .obj 模型。现在我想将 .mtl 用于我的模型。我已经解析了所有属性(包括纹理文件名 - 实际上我只想将纹理映射到我的模型)。而且我猜照明和纹理映射将在片段着色器中完成。但我很困惑,如何将所有材质信息传递给我的着色器?
我有一个包含所有值的结构 MaterialMTL,但我不知道如何将它保存在 vbo 中。也许我必须从.mtl 解析的所有材料制作一个矢量,并将索引保存在我的网格中?但是我仍然不知道如何将所有属性传递给我的着色器,也不知道我是否必须为当前片段使用特定材质,我的模型有一个网格,如果我想怎么办仅使用特定片段的材料...
我找不到任何关于在 OpenGL 中使用 mtl 的信息,甚至只是为了映射纹理,所以我非常感谢任何帮助!
这是我的代码的一部分:
void drawMesh(struct Mesh m) {
glBindVertexArray(m.vao);
glDrawArrays(GL_TRIANGLES, 0, m.vert_count);
}
Mesh initMesh(const char * path)
{
Mesh m;
vector<vec3> vertsBuff;
vector<vec2> textBuff;
vector<vec3> normBuff;
MaterialMTL material;
loadOBJ(path, vertsBuff, textBuff, normBuff, material); //So here I'm parsing my obj model with the mtl file (I want to have only one material to start with)
glGenVertexArrays(1, &m.vao);
glBindVertexArray(m.vao);
glEnableVertexAttribArray(0);
glGenBuffers(1, &m.id_vert);
glBindBuffer(GL_ARRAY_BUFFER, m.id_vert);
glBufferData(GL_ARRAY_BUFFER, vertsBuff.size() * sizeof(vec3),
&vertsBuff[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_TRUE, 0, NULL);
glEnableVertexAttribArray(1);
glGenBuffers(1, &m.id_text);
glBindBuffer(GL_ARRAY_BUFFER, m.id_text);
glBufferData(GL_ARRAY_BUFFER, textBuff.size() * sizeof(vec2),
&textBuff[0], GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_TRUE, 0, NULL);
glEnableVertexAttribArray(1);
glGenBuffers(1, &m.id_norm);
glBindBuffer(GL_ARRAY_BUFFER, m.id_norm);
glBufferData(GL_ARRAY_BUFFER, normBuff.size() * sizeof(vec3),
&normBuff[0], GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_TRUE, 0, NULL);
m.vert_count = vertsBuff.size();
return m;
}