gpt4 book ai didi

c++ - 退出时如何修复 OpenGL 堆栈损坏

转载 作者:行者123 更新时间:2023-11-28 01:25:41 26 4
gpt4 key购买 nike

我一直在学习 C++ 中的一些 opengl 教程(从使用 java 开始,所以我知道 openGL 还不错,但是内存管理、指针等我有点慢)来自 http://www.opengl-tutorial.org ,我目前在退出我的应用程序时遇到错误问题。我正在尝试添加法线顶点属性数组。它在运行时似乎工作正常,但当我退出应用程序时,我得到这个:

"Run-Time Check Failure #2 - Stack around the variable 'normalbuffer' was corrupted."

我当然做了一些谷歌搜索,发现这个错误通常与数组和索引越界错误有关,但 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);

关于c++ - 退出时如何修复 OpenGL 堆栈损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982888/

26 4 0
文章推荐: javascript - D3 js图表倒置问题
文章推荐: javascript -