我正在使用GLM OpenGL数学库编写OpenGL程序。我想将顶点位置,法线和纹理坐标组合成一个类,如此
class Vertex {
public:
glm::vec4 position;
glm::vec4 normal;
glm::vec2 texcoord;
};
然后使用这些数组作为我的顶点缓冲对象(VBO)。但是,当调用glVertexAttribPointer
来映射我的VBO时,我需要为normal
和texcoord
成员的这个组合Vertex结构赋予它一个偏移量。
如果这些只是POD,我可以使用像
这样的东西offsetof(Vertex, position)
但这不适用于glm数据类型(或至少g ++ 4.4.3拯救)。
获取Vertex成员偏移量的推荐方法是什么?
(我理解为什么我不能拥有offsetof
任意C ++对象的一般原因,但在这种特殊情况下,事情看起来很明确。)
答案 0 :(得分:0)
(我理解为什么我不能为任意C ++对象提供offsetof的一般原因,但在这种特殊情况下,事情看起来很明确)
根据C ++ 98/03标准,它们没有明确定义。 C ++ 11通过放宽要考虑的类型的要求来改进这一点"standard-layout", which is a much weaker set of rules(C ++ 11中的offsetof
需要标准布局类型,而不是POD)。我不知道GLM的课程是否遵循标准布局规则。
当然,这一切都无关紧要,因为您正在处理C ++ 98/03编译器。标准不需要任何机制来从非POD类型获取成员的偏移量。您可以选择不使用GLM类型来坚持标准制作顶点数据POD,也可以选择适合您感兴趣的编译器。
从实际角度来看,后一种情况实际上并不算太糟糕。在C ++ 11中改变POD定义的原因是因为大多数编译器已经遵循新规则;标准委员会简单地将行为合法化,众所周知,这些行为适用于编译器。所以你可以简单地做到这一点。您知道glm::vec4
的大小为16个字节,因此请手动计算偏移量。