0

我正在使用 GLM OpenGL 数学库编写一个 OpenGL 程序。我想像这样将顶点位置、法线和纹理坐标组合成一个类

class Vertex {
    public:
       glm::vec4 position;
       glm::vec4 normal;
       glm::vec2 texcoord;
};

然后使用这些数组作为我的顶点缓冲区对象(VBO)。但是,当调用 映射我的 VBO 时,我需要为and成员glVertexAttribPointer在这个组合的 Vertex 结构中给它一个偏移量。normaltexcoord

如果这些只是 POD,我可以使用类似的东西

offsetof(Vertex, position)

但这不适用于 glm 数据类型(或至少 g++ 4.4.3 退出)。

获取 Vertex 成员偏移量的推荐方法是什么?

(我理解为什么我不能拥有offsetof任意 C++ 对象的一般原因,但在这种特殊情况下,事情似乎是明确定义的)。

4

1 回答 1

0

(我理解我不能对任意 C++ 对象使用 offsetof 的一般原因,但在这种特殊情况下,事情似乎是明确定义的)

根据 C++98/03 标准,它们没有很好的定义。C++11 通过放宽对被认为是“标准布局”的类型的要求来改进这一点,这是一组更弱的规则offsetof在 C++11 中需要标准布局类型,而不是 POD)。我不知道 GLM 的课程是否遵循标准布局规则。

当然,这都无关紧要,因为您正在处理 C++98/03 编译器。标准不需要任何机制来从非 POD 类型中获取成员的偏移量。您的选择是要么坚持标准,通过不使用 GLM 类型来制作你的顶点数据 POD,要么只做对你感兴趣的编译器有用的事情。

从实际的角度来看,后一种情况实际上并不算太糟糕。之所以在 C++11 中更改 POD 的定义,是因为大多数编译器已经遵循新规则;标准委员会只是将广为人知的跨编译器的行为合法化。所以你可以简单地这样做。您知道 a 的大小为glm::vec416 个字节,因此请手动计算偏移量。

于 2012-09-22T23:56:16.960 回答