Using Eigen::Vector3f with Opengl ES 2.0 VBO

Using Eigen::Vector3f with Opengl ES 2.0 VBO

本文关键字:ES VBO with Eigen Vector3f Using Opengl      更新时间:2023-10-16

我有麻烦让Eigen::Vector3f和Opengl ES 2.0 VBO一起工作。我最初的尝试是glVertexAttribPointer(VERTEX, 3, GL_FLOAT, sizeof(VERTEX), 0)。虽然这没有画,如果我开始玩步幅值,我可以看到一个破碎的网格。这是我当前导致崩溃的代码。在我的旧代码中,我使用了简单的vector3类,由3个浮点数组成,工作得很好。

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

std::vector<Vertex> Vertices;
std::vector<ushort16> Indices;
...

GLuint vao;
uint32 vboID, vboID2;
glGenVertexArraysOES(1, &vao);
glBindVertexArrayOES(vao);

glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, GL_STATIC_DRAW , sizeof(Vertex) * Vertices.size(), &Vertices[0]);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glGenBuffers(1, &vboID2);
glBindBuffer(GL_ARRAY_BUFFER, vboID2);
glBufferData(GL_ARRAY_BUFFER, GL_STATIC_DRAW , sizeof(ushort16) * m_vIndices.size(), &Indices[0]);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ARRAY_BUFFER, vboID);
glEnableVertexAttribArray(VERTEX);
glVertexAttribPointer(VERTEX, 3, GL_FLOAT , sizeof(Vertex), &Vertices[0].pos );
glEnableVertexAttribArray(NORMAL);
glVertexAttribPointer(NORMAL, 3, GL_FLOAT , sizeof(Vertex), &Vertices[0].normal );
glBindBuffer(GL_ARRAY_BUFFER, vboID2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArrayOES(0);

...

解决了我的问题:

我去掉了:

glBufferData(GL_ARRAY_BUFFER, GL_STATIC_DRAW , sizeof(Vertex) * Vertices.size(), &Vertices[0]);

我把这些行改成

glVertexAttribPointer(VERTEX, 3, GL_FLOAT , sizeof(Vertex), Vertices[0].pos.data() );
....
glVertexAttribPointer(NORMAL, 3, GL_FLOAT , sizeof(Vertex), Vertices[0].normal.data() );