glDrawElements GL ERROR тип = 0x824c, серьезность = 0x9146, сообщение = GL_INVALID_OPERATION - PullRequest
0 голосов
/ 22 сентября 2018

OpenGl версии 330 core

У меня эта ошибка при вызове glDrawElements, НО только при первом вызове в основном цикле !!на самом деле код (ниже) работает нормально!.

Я знаю значение этой ошибки:

генерируется, если ненулевое имя объекта буфера привязано к включенному массивуили массив элементов и хранилище данных объекта буфера в настоящее время сопоставлены.

Я хочу понять, почему только при первом вызове glDrawElement "выбросить" эту ошибку!

Вкод Mesh::Init(), инициализация буфера и Mesh::Draw() вызов glDrawElement

void Mesh::init() {

size_t vtx     = vertices.size() * sizeof(vec4);
size_t vtx_col = verticesColor.size() * sizeof(vec4);
size_t nrm     = normals.size() * sizeof(vec3);
size_t tng     = tangent.size() * sizeof(vec3);
size_t btng    = bitangent.size() * sizeof(vec3);
size_t txc     = text_coord.size() * sizeof(vec2);

size_t total = vtx + vtx_col + nrm + tng + btng + txc;


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, (indices.size() * sizeof(unsigned int)), &indices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

glBindBuffer(GL_ARRAY_BUFFER, VBO);  
    glBufferData(GL_ARRAY_BUFFER, total, NULL, GL_STATIC_DRAW);
        glBufferSubData(GL_ARRAY_BUFFER,  0                            , vtx,     &vertices[0]);
        glBufferSubData(GL_ARRAY_BUFFER,  vtx                          , nrm,     &normals[0]);
        glBufferSubData(GL_ARRAY_BUFFER, (vtx + nrm)                   , txc,     &text_coord[0]);
        glBufferSubData(GL_ARRAY_BUFFER, (vtx + nrm + txc)             , tng,     &tangent[0]);
        glBufferSubData(GL_ARRAY_BUFFER, (vtx + nrm + txc + tng)       , btng,    &bitangent[0]);
        glBufferSubData(GL_ARRAY_BUFFER, (vtx + nrm + txc + tng + btng), vtx_col, &verticesColor[0]);
glBindBuffer(GL_ARRAY_BUFFER, 0);    


glBindVertexArray(VAO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);    
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

        glVertexAttribPointer(loc.vertex,  4, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) (0));
        glVertexAttribPointer(loc.normals,   3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) (vtx));
        glVertexAttribPointer(loc.texCoord,  2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) (vtx + nrm));
        glEnableVertexAttribArray(loc.vertex);
        glEnableVertexAttribArray(loc.normals);
        glEnableVertexAttribArray(loc.texCoord);

        if(flag_TngBtg)   {
            glVertexAttribPointer(loc.tangent,   3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) (vtx + nrm + txc));
            glVertexAttribPointer(loc.bitangent, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) (vtx + nrm + txc + tng));
            glEnableVertexAttribArray(loc.tangent);
            glEnableVertexAttribArray(loc.bitangent);
        }

        if(flag_VtxColor)   {
            glVertexAttribPointer(loc.vertex_color, 4, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) (vtx + nrm + txc + tng + btng));
            glEnableVertexAttribArray(loc.vertex_color);
        }

glBindVertexArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);

}

void Mesh::draw() {

glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, (const GLvoid*)0);
glBindVertexArray(0);

}

1 Ответ

0 голосов
/ 22 сентября 2018

У меня возникла проблема "таким образом" в данный момент ..

Когда моя программа загружает 3D-файл модели с Assimp, перед инициализацией класса Mesh, Mesh :: init (), текстуразагружаются первыми

unsigned int textureID;
            glGenTextures(1, &textureID);
            glBindTexture(GL_TEXTURE_2D, textureID);
            .......

в конце загрузки, а текстура привязки просто помещается:

glBindTexture(GL_TEXTURE_2D, 0);

таким образом, glDrawElements НЕ "выбрасывает" любую ошибку.

...