在我的程序中,我加载.obj模型。现在我想为我的模型使用.mtl。我已经解析了所有属性(包括纹理文件名 - 实际上我只想将纹理映射到我的模型)。我想照明和纹理映射将在片段着色器中完成。但我很困惑,如何将所有材料信息传递给我的着色器?
我有一个包含所有值的结构MaterialMTL,但idk如何保存在vbo中。也许我必须制作我从.mtl解析的所有材料的向量,并将索引保存在我的网格中?但我仍然不知道如何将所有属性传递给我的着色器,以及我如何知道是否必须使用特定材质作为当前片段,我有一个Mesh用于我的模型以及如果我想要仅使用特定碎片的材料......
我找不到任何关于在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;
}