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

时间:2018-05-30 22:38:53

标签: opengl mesh texture-mapping wavefront mtl-file

在我的程序中,我加载.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;
}

0 个答案:

没有答案