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