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

标签 c++ opengl eigen

我正在尝试使用 glVertexAttribPointer具有 Eigen 对象的结构,类似于此:

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

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

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

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

,其中 verticesstd::vector<Vertex> .

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

最佳答案

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)尺寸。

关于c++ - 将 OpenGL 与 Eigen 一起用于存储顶点数据和 glVertexAttribPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58217443/

相关文章:

c++ - Qt3d:应用 Qt3DRender::QLayerFilter 时显示的工件

c++ - 如何在构造函数的静态列表中添加对象

c++ - 计算三角形与四边形的 TBN 矩阵的差异?

c++ - 特征值:t 为 1s 的随机二元 vector

c++ - 是否应该避免 Eigen 不支持的模块?

c++ - 二维碰撞 react

c++ - 我如何将 boost::array 转换为 boost::shared_ptr

c++ - -cmake 中的框架命令行选项

c++ - opengl图形的QT小图

c++ - 将自定义新处理程序与 Eigen 库一起使用