我一直在C ++中学习一些opengl教程(从不再使用Java,所以我知道openGL很好,但是内存管理,指针等有点慢)从http://www.opengl-tutorial.org开始,我目前遇到问题退出我的应用程序时出错。
我正在尝试添加法线顶点属性数组。在运行时它似乎运行良好,但是当我退出应用程序时,我得到了:
“运行时检查失败#2-变量'normalbuffer'周围的堆栈已损坏。”
我当然进行了一些谷歌搜索,发现该错误通常与数组和索引超出范围错误有关,但是normalbuffer
只是一个GLuint
。据我所知,实现normalbuffer
的代码与实现顶点位置和uv纹理贴图的代码相同。
这是我的初始化代码:
// Create Vertex Buffer
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);
// Create UV Buffer
GLuint uvbuffer;
glGenBuffers(1, &uvbuffer);
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec2), &uvs[0], GL_STATIC_DRAW);
// Create Normals Buffer
GLuint normalbuffer;
glGenBuffers(2, &normalbuffer);
glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), &normals[0], GL_STATIC_DRAW);
然后是我的循环代码(每帧运行一次):
//...
//Load the vertex positions array
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0, //Specify which attribute index we are using
3, //Size of the attribute
GL_FLOAT, //Type of attribute
GL_FALSE, //Normalized?
0, //Stride
(void*)0 //Array Buffer Offset
);
//Load the UV positions array
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glVertexAttribPointer(
1, //Specify which attribute index we are using
2, //Size of the attribute
GL_FLOAT, //Type of attribute
GL_FALSE, //Normalized?
0, //Stride
(void*)0 //Array Buffer Offset
);
//Load the normal vectors array
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
glVertexAttribPointer(
2, //Specify which attribute index we are using
3, //Size of the attribute
GL_FLOAT, //Type of attribute
GL_FALSE, //Normalized?
0, //Stride
(void*)0 //Array Buffer Offset
);
//glDrawArrays() happens here
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
//...
这个错误似乎在运行时根本不会发生,只有当我通过按下转义键关闭程序时(这样我才不会终止VS中的进程)。
最佳答案
glGenBuffers
的第一个参数指定要生成的缓冲区对象名称的数量。
您生成2个对象,但将单个变量normalbuffer
的地址传递给glGenBuffers
。
生成2个对象,并将对象名称写入&normalbuffer
和(&normalbuffer) + 1
寻址的存储器。这会导致堆栈损坏。
更改要生成的对象数:GLuint normalbuffer;
glGenBuffers(2, &normalbuffer);
glGenBuffers(1, &normalbuffer);