在OpenGL的片段着色器中使用mtl信息进行纹理映射

在OpenGL的片段着色器中使用mtl信息进行纹理映射,opengl,mesh,texture-mapping,wavefront,mtl-file,Opengl,Mesh,Texture Mapping,Wavefront,Mtl File,在我的程序中,我加载.obj模型。现在我想在我的模型中使用.mtl。我已经解析了所有属性(包括纹理文件名-实际上我只想将纹理映射到我的模型)。我猜照明和纹理贴图将在片段着色器中完成。但我很困惑,我如何将所有材质信息传递给我的着色器 我有一个包含所有值的struct MaterialMTL,但我知道如何在vbo中保存它。也许我必须对从.mtl解析的所有材质创建一个向量,并将索引保存在网格中?但我仍然不知道如何将所有属性传递给着色器,也不知道如何知道是否必须为当前片段使用特定材质,我的模型有一个网格

在我的程序中,我加载.obj模型。现在我想在我的模型中使用.mtl。我已经解析了所有属性(包括纹理文件名-实际上我只想将纹理映射到我的模型)。我猜照明和纹理贴图将在片段着色器中完成。但我很困惑,我如何将所有材质信息传递给我的着色器

我有一个包含所有值的struct 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;
}
void drawMesh(结构网格m){
glBindVertexArray(m.vao);
GLDRAW阵列(GLU三角形,0,m.vert\u计数);
}
网格初始化网格(常量字符*路径)
{
网格m;
向量向量向量;
向量textBuff;
向量normBuff;
材料TL材料;
loadOBJ(path,vertsBuff,textBuff,normBuff,material);//所以这里我用mtl文件解析我的obj模型(我只想从一种材质开始)
glGenVertexArrays(1和m.vao);
glBindVertexArray(m.vao);
GlenableVertexAttributeArray(0);
glGenBuffers(1和m.id\u vert);
glBindBuffer(GL_数组_BUFFER,m.id_vert);
glBufferData(GL_数组_缓冲区,vertsBuff.size()*sizeof(vec3),
&vertsBuff[0],总图(静态图);
glvertexattributepointer(0,3,GL_FLOAT,GL_TRUE,0,NULL);
GlenableVertexAttributeArray(1);
glGenBuffers(1和m.id_文本);
glBindBuffer(GL_数组_缓冲区,m.id_文本);
glBufferData(GL_数组_缓冲区,textBuff.size()*sizeof(vec2),
&textBuff[0],GL\u STATIC\u DRAW);
glvertexattributepointer(1,3,GL_FLOAT,GL_TRUE,0,NULL);
GlenableVertexAttributeArray(1);
glGenBuffers(1和m.id_norm);
glBindBuffer(GL_数组_BUFFER,m.id_norm);
glBufferData(GL_数组_BUFFER,normBuff.size()*sizeof(vec3),
&normBuff[0],GL\u STATIC\u DRAW);
glvertexattributepointer(1,3,GL_FLOAT,GL_TRUE,0,NULL);
m、 vert_count=vertsBuff.size();
返回m;
}

纹理坐标是中的
vt
,这是您需要存储到VBO的内容。在
*.mtl
文件中,只有材质灯光属性和纹理名称,因此没有VBO,而是文件名的常量和纹理统一。谢谢你的回答,我会试试看!