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

时间:2018-12-31 01:49:51

标签: c++ opengl memory

我一直在关注C ++中的一些opengl教程(不再使用Java,所以我知道openGL不错,但是内存管理,指针等有点慢)从http://www.opengl-tutorial.org开始,我m当前退出我的应用程序时出现错误问题。 我正在尝试添加法线顶点属性数组。在运行时它似乎运行良好,但是当我退出应用程序时,我得到了:

  

“运行时检查失败#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中终止该进程)。

1 个答案:

答案 0 :(得分:2)

glGenBuffers的第一个参数指定要生成的缓冲区对象名称的数量。

您生成2个对象,但是将单个变量normalbuffer的地址传递给glGenBuffers
生成2个对象,并将对象名称写入由&normalbuffer(&normalbuffer) + 1寻址的内存中。这会导致堆栈损坏。

更改要生成的对象数:

GLuint normalbuffer;
glGenBuffers(2, &normalbuffer);
glGenBuffers(1, &normalbuffer);