将 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]))
,其中 vertices
是 std::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 处。您可以将 position
和 normal
的偏移量按原样(offsetof(Vertex, position)
和 offsetof(Vertex, normal)
)传递给 glVertexAttrib 调用以获取偏移量,并将 sizeof(Eigen::Vector3f)
传递给尺码。
我正在尝试将 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]))
,其中 vertices
是 std::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 处。您可以将 position
和 normal
的偏移量按原样(offsetof(Vertex, position)
和 offsetof(Vertex, normal)
)传递给 glVertexAttrib 调用以获取偏移量,并将 sizeof(Eigen::Vector3f)
传递给尺码。