Использование OpenGL с Eigen для хранения данных вершин и glVertexAttribPointer - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь использовать glVertexAttribPointer со структурой собственных объектов, подобной этой:

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

Проблема заключается в установке смещения glVertexAttribPointer. Поскольку нет общедоступного доступа к члену m_data, используемому для внутреннего хранения данных в Eigen, offset использовать нельзя.

Кажется, что нет хорошего способа сделать это. Мой текущий подход выглядит примерно так:

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

, где vertices - это std::vector<Vertex>.

Это ни в коем случае не хорошо (особенно в современном C ++). Я сомневаюсь, что может быть хорошее решение, но какой будет более безопасный способ сделать это, или, по крайней мере, как можно изолировать эту операцию настолько, насколько это возможно, поэтому мне не нужно записывать ее для каждого вызова glVertexAttribPointer.

1 Ответ

3 голосов
/ 03 октября 2019

Документация 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] находится по смещению 0 от Eigen::Vector3f структура. Вам разрешено передавать смещения position и normal как есть (offsetof(Vertex, position) и offsetof(Vertex, normal)) на вызовы glVertexAttrib для смещений и sizeof(Eigen::Vector3f) для размеров.

...