繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM