Я пытаюсь создать класс сетки, используя vao и vbo.
Сначала я создаю векторы для хранения данных, подлежащих буферизации:
std::vector<GLfloat> vertices;
std::vector<GLfloat> normals;
std::vector<GLfloat> texCoords;
std::vector<GLushort> indices;
Я сохраняю данные из файла, а затем создаю буферы:
// Vertex array
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// Vertex buffer
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
// Index buffer
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
Я пытаюсь заполнить буферы так:
// Reserve space on the GPU (3 GLfloats per vertex, 3 per normal and 2 per texCoord)
glBufferData(GL_ARRAY_BUFFER, vertices.size() * 8 * sizeof(GLfloat), NULL, GL_STATIC_DRAW);
// Load data to the GPU
// Insert vertices at the beginning of the buffer
glBufferSubData(GL_ARRAY_BUFFER, NULL, vertices.size()*3*sizeof(GLfloat), &vertices);
// Insert normals behind vertices
glBufferSubData(GL_ARRAY_BUFFER, vertices.size()*3*sizeof(GLfloat), normals.size()*3*sizeof(GLfloat), &normals);
// Insert texCoords behind normals
glBufferSubData(GL_ARRAY_BUFFER, (vertices.size() + normals.size())*3*sizeof(GLfloat), texCoords.size()*2*sizeof(GLfloat), &texCoords);
// Load the index buffer
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*3*sizeof(GLushort), &indices, GL_STATIC_DRAW);
Он ломается, когда я пытаюсь буферизовать нормальные данные
glBufferSubData(GL_ARRAY_BUFFER, vertices.size()*3*sizeof(GLfloat), normals.size()*3*sizeof(GLfloat), &normals);
Я получаю эту ошибку:
Unhandled exception at 0x699CEF38 (nvoglv32.dll) in Engine.exe: 0xC0000005: Access violation reading location 0x05C34000.
Я долго искал, но до сих пор не нашел решения. Любая информация относительно любых ошибок, которые я сделал, очень приветствуется.
Заранее спасибо,
мне
Явная ошибка заключается в следующем:
glBufferSubData(GL_ARRAY_BUFFER, NULL, vertices.size()*3*sizeof(GLfloat), &vertices);
Чтобы получить данные внутри вектора, вы передаете адрес первого элемента, а не указатель на вектор:
glBufferSubData(GL_ARRAY_BUFFER, NULL, vertices.size()*3*sizeof(GLfloat), &vertices[0]);
Вы делаете ту же ошибку в других строках, которые вызывают glBufferSubData
включая строку, где он, наконец, ломается, где вы используете normals
вектор.
Кроме того, вектор должен быть непустым перед использованием &vertices[0]
или, если вы используете C ++ 11, вы можете использовать vertices.data()
функция вместо &vertices[0]
,