glBufferSubData вызывает необработанное исключение: 0xC0000005

Я пытаюсь создать класс сетки, используя 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.

Я долго искал, но до сих пор не нашел решения. Любая информация относительно любых ошибок, которые я сделал, очень приветствуется.

Заранее спасибо,
мне

0

Решение

Явная ошибка заключается в следующем:

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],

2

Другие решения


По вопросам рекламы [email protected]