[英]How to fix OpenGL stack corruption when exiting
我一直在关注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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.