将 OpenGL 与 Eigen 一起用于存储顶点数据和 glVertexAttribPointer

Using OpenGL with Eigen for storing vertex data and glVertexAttribPointer

我正在尝试将 glVertexAttribPointer 与 Eigen 对象的结构一起使用,类似于:

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

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

好像没有什么好的方法可以做到这一点。我目前的做法是这样的:

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

,其中 verticesstd::vector<Vertex>.

这绝不是什么好事(尤其是在现代 C++ 中)。我怀疑是否有一个很好的解决方案,但是这样做更安全的方法是什么,或者至少如何尽可能地隔离这个操作,所以我不必为每次调用 [=12 都写它=].

Eigen documentation保证一个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 处。您可以将 positionnormal 的偏移量按原样(offsetof(Vertex, position)offsetof(Vertex, normal))传递给 glVertexAttrib 调用以获取偏移量,并将 sizeof(Eigen::Vector3f) 传递给尺码。