glDrawElements 导致访问冲突
glDrawElements causes Access Violation
我遇到了几个 GLErrors
我不知道该怎么做。
- GL_INVALID_ENUM
- GL_INVALID_ENUM
- GL_INVALID_OPERATION
- GL_INVALID_OPERATION
我该如何调试它?
- glew 已经预先初始化。
- 加载的顶点数据看起来没问题。
- 着色器在调用绘制之前被绑定
- 着色器是从教程中复制的并且工作正常
之前。
- 并且着色器编译和链接不会产生错误。
这是我的代码:
void MeshPNU::create(aiMesh* m) {
for (std::uint32_t i = 0; i < m->mNumVertices; i++) {
vertexPNU v(m, i);
vertices.push_back(v);
}
for (std::uint32_t i = 0; i < m->mNumFaces; i++) {
for (std::uint32_t j = 0; j < m->mFaces[i].mNumIndices; j++) {
indices.push_back(m->mFaces[i].mIndices[j]);
}
}
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &IBO);
glBindBuffer(GL_VERTEX_ARRAY, VBO);
glBufferData(GL_VERTEX_ARRAY, vertices.size() * sizeof(vertexPNU), vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(std::uint32_t), indices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(2);
}
void MeshPNU::draw()
{
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
}
glBindBuffer(GL_VERTEX_ARRAY, VBO);
不是 VBO 的正确枚举,您应该改用 GL_ARRAY_BUFFER
。
如果它解决了您的问题,请告诉我。
我遇到了几个 GLErrors 我不知道该怎么做。
- GL_INVALID_ENUM
- GL_INVALID_ENUM
- GL_INVALID_OPERATION
- GL_INVALID_OPERATION
我该如何调试它?
- glew 已经预先初始化。
- 加载的顶点数据看起来没问题。
- 着色器在调用绘制之前被绑定
- 着色器是从教程中复制的并且工作正常 之前。
- 并且着色器编译和链接不会产生错误。
这是我的代码:
void MeshPNU::create(aiMesh* m) {
for (std::uint32_t i = 0; i < m->mNumVertices; i++) {
vertexPNU v(m, i);
vertices.push_back(v);
}
for (std::uint32_t i = 0; i < m->mNumFaces; i++) {
for (std::uint32_t j = 0; j < m->mFaces[i].mNumIndices; j++) {
indices.push_back(m->mFaces[i].mIndices[j]);
}
}
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &IBO);
glBindBuffer(GL_VERTEX_ARRAY, VBO);
glBufferData(GL_VERTEX_ARRAY, vertices.size() * sizeof(vertexPNU), vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(std::uint32_t), indices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(2);
}
void MeshPNU::draw()
{
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
}
glBindBuffer(GL_VERTEX_ARRAY, VBO);
不是 VBO 的正确枚举,您应该改用 GL_ARRAY_BUFFER
。
如果它解决了您的问题,请告诉我。