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