Как исправить повреждение стека OpenGL при выходе - PullRequest
0 голосов
/ 31 декабря 2018

Я следовал некоторым учебникам opengl на C ++ (переходя от использования java, так что я хорошо знаю openGL, но я немного медленнее обращаюсь с управлением памятью, указателями и т. Д.) Из учебника http://www.opengl.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);
    //...

Эта ошибка, по-видимому, вообще не возникает во время выполнения, только когда я закрываю программу, нажимая клавишу escape (так что яне убивает процесс в VS).

1 Ответ

0 голосов
/ 31 декабря 2018

1-й параметр glGenBuffers указывает количество имен объектов буферов, которые должны быть сгенерированы.

Вы генерируете 2 объекта, но передаете адрес одной переменной normalbuffer вglGenBuffers.
2 объекта генерируются, и имена объектов записываются в память, адресуемую &normalbuffer и (&normalbuffer) + 1.Это приводит к повреждению стека.

Изменение количества создаваемых объектов:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...