C ++: 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);

Я не совсем уверен в этом, так как struct padding (выравнивание членов) может вызвать некоторые проблемы, на мой взгляд, хотя все протестированные мной компиляторы возвращают ожидаемые размеры.

Я разрабатываю для компиляторов C ++ 11 (возможно, это имеет значение).

12

Решение

Определите «безопасно».

C ++ дает реализации широкие возможности для структур pad, как они считают нужным. Итак, что касается ISO C ++, то, «работает» ли это, зависит от реализации.

В целом он будет работать на нескольких компиляторах для настольных платформ. Я не могу говорить о процессорах ARM, но в целом, glm::vec3 будет 3 поплавка в размере. Однако, если вы хотите убедиться, вы всегда можете выполнить простую static_assert:

static_assert(sizeof(glm::vec3) == sizeof(GLfloat) * 3, "Platform doesn't support this directly.");
8

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

Да, GLM разработан и создан специально для этой цели.

0

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