【发布时间】:2019-02-26 08:12:51
【问题描述】:
OpenGl 版本 330 核心
调用glDrawElements 时出现此错误,但仅在主循环中的第一次调用时!
实际上代码(如下)工作正常!。
我知道这个错误的含义:
如果非零缓冲区对象名称绑定到启用的数组或元素数组并且缓冲区对象的数据存储当前已映射,则生成。
我想了解为什么只在第一次调用glDrawElement "trow" 这个错误!
在代码中,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);
}
【问题讨论】: