С++: 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 спроектирован и построен специально для этой цели.