Использование информации mtl в фрагментном шейдере в OpenGL для наложения текстур - PullRequest
0 голосов
/ 31 мая 2018

В моей программе я загружаю модель .obj.Теперь я хочу использовать .mtl для моей модели.Я проанализировал все атрибуты (включая имя файла текстуры - на самом деле я просто хочу отобразить текстуру в моей модели).И я предполагаю, что освещение и наложение текстуры будут выполняться в фрагментном шейдере.Но я очень растерялся, как передать всю информацию о материале моему шейдеру?

У меня есть struct MaterialMTL со всеми значениями, но я не знаю, как это сохранить в VBO.Может быть, мне нужно сделать вектор из всех материалов, которые я проанализировал из .mtl, и сохранить индекс в моей сетке?Но я до сих пор не знаю, как передать все атрибуты моему шейдеру, а также как узнать, нужно ли мне использовать конкретный материал для текущего фрагмента или нет, у меня есть одна сетка для моей модели и что, если я хочуиспользовать материал только для определенных фрагментов ...

Я не смог найти никакой информации об использовании mtl в OpenGL даже для отображения текстуры, поэтому я очень признателен за любую помощь!

Здесьявляется частью моего кода:

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;
}
...