С учетом фрагмента рабочего кода
glBufferData(GL_ARRAY_BUFFER, vertices->size() * sizeof(glm::vec3), &vertices->front(), GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); // Set up our vertex attributes pointer
glGenBuffers(1,&indexBufferId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexBufferId);
// We have to use &triangles.front() otherwise we get vector house keeping garbage
glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangles->size() * sizeof(unsigned), &triangles->front(), GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); // Set up our vertex attributes pointer
В основном я отправляю данные в OpenGL, и, естественно, я должен указать, откуда и сколько копировать. После нескольких изменений типов в моих векторах я решил, что не хочу обновлять каждую ссылку на тип, и попробовал следующую строку.
glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangles->size() * sizeof(triangles[0]), &triangles->front(), GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW
с использованием sizeof(triangles[0])
вместо sizeof(unsigned)
. Подсчет, эй, мой вектор напечатан, поэтому он должен иметь возможность определить тип элемента во время компиляции, поэтому мне не нужно сообщать это каждому рефакторингу.
Однако это не тот случай. Это единственное изменение вызывает ошибку по умолчанию, когда выполняется любая строка с соответствующим вектором.
Еще одна путаница (возникшая при попытке сжать мой код) использует
glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangles->size() * sizeof(unsigned), &triangles[0], GL_STATIC_DRAW);
замена &triangles.front()
на &triangles[0]
вызывает тот же segfault. Я понял, что эти два утверждения должны быть равны.
Где мое недоразумение? Я думал, что заявления, которые являются segfaulting, были эквивалентны рабочим.