我一直在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);

10-04 23:10