使用OpenGL和Eigen来存储顶点数据和glVertexAttribPointer

Using OpenGL with Eigen for storing vertex data and glVertexAttribPointer

本文关键字:顶点 数据 存储 glVertexAttribPointer OpenGL Eigen 使用      更新时间:2023-10-16

我正在尝试将glVertexAttribPointer与特征对象结构一起使用,类似于以下内容:

struct Vertex {
Eigen::Vector3f position;
Eigen::Vector3f normal;
};

问题在于设置glVertexAttribPointer的偏移量。由于没有对用于在 Eigen 中内部存储数据的m_data成员的公共访问权限,因此无法使用offset

似乎没有好的方法可以做到这一点。我目前的方法如下:

(void*)((char*)vertices[0].Position.data() - (char*)(&vertices[0]))

,其中vertices是一个std::vector<Vertex>

这绝不是好事(尤其是在现代C++中(。我怀疑是否有一个不错的解决方案,但是有什么更安全的方法可以做到这一点,或者至少如何尽可能隔离此操作,所以我不必为每次调用glVertexAttribPointer编写它。

Eigen 文档保证Eigen::Vector3f = Eigen::Matrix<float,3,1>的布局如下:

struct {
float data[Rows*Cols];        // with (size_t(data)%A(Rows*Cols*sizeof(T)))==0
};

换句话说,float[3]位于Eigen::Vector3f结构的偏移量 0。您可以将position的偏移量和normal原样(offsetof(Vertex, position)offsetof(Vertex, normal)(传递给您的glVertexAttrib调用以获取偏移量,并sizeof(Eigen::Vector3f)偏移量。