С++: OpenGL, glm и struct padding
Можно ли безопасно использовать типы glm:: * (например, vec4, mat4) для заполнения объекта буфера вершин?
std::vector<glm::vec3> vertices;
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertices.size(), &vertices[0], GL_STATIC_DRAW);
Я не совсем уверен в этом, поскольку сложение структуры (выравнивание элементов) может вызвать некоторые проблемы, на мой взгляд, хотя все компиляторы, которые я тестировал, возвращают ожидаемые размеры.
Я разрабатываю для компиляторов С++ 11 (возможно, это имеет значение).
Ответы
Ответ 1
Определите "безопасный".
С++ предоставляет широкие возможности широких возможностей для компоновки структур, как они считают нужным. Что касается ISO С++, независимо от того, работает ли это "работает", это зависит от реализации.
Он будет работать в целом по нескольким компиляторам для настольных платформ. Я не могу говорить за процессоры ARM, но, как правило, glm::vec3
будет иметь 3 поплавка. Однако, если вы хотите убедиться, вы всегда можете выполнить простой static_assert
:
static_assert(sizeof(glm::vec3) == sizeof(GLfloat) * 3, "Platform doesn't support this directly.");
Ответ 2
Да, glm спроектирован и построен специально для этой цели.