В этом подходе нет ничего плохого, если вы укажете правильные указатели атрибутов, например:
glVertexAttribPointer( ..., 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, pos));
glVertexAttribPointer( ..., 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, texCoord));
glVertexAttribPointer( ..., 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, normal));
и sizeof
, и offsetof
примут во внимание любые дополнения, которые могут возникнуть.
Если вы хотите больше контроля над фактической компоновкой, вы также можете, конечно, работать с #pragma pack
, который не является частью какого-либо стандарта C / C ++, но понятен всем основным компиляторам.На практике ни один реальный компилятор на платформе, где существует реализация OpenGL, не добавит никаких отступов для вашего исходного структурного макета, так что это, вероятно, спорный вопрос.
Кроме того, я не знаючто такое макеты или размеры типов glm::vec*
.
Векторы и матрицы GLM представляют собой плотно упакованные массивы соответствующего базового типа, в частности float[N]
для glm::vecN
.