OpenGL VBO 中的颜色?

Colors in OpenGL VBOs?

我正在尝试使用 OpenGL 中的单个结构和单个 VBO 向我的对象添加颜色。为此,我创建了一个 Vertex 结构,如下所示:

typedef struct {
    float x;
    float y;
    float z;
    float r;
    float g;
    float b;
    float a;
} Vertex;

我已经知道我正在正确设置所有坐标和颜色以获得我想要的东西,因为我 运行 对我存储在列表中的每个对象进行迭代并绘制出点的测试并使用 glVertex3fglColor4f 设置颜色(这比我正在寻找的要慢得多)。但是当我尝试使用 VBO 绘制它时,到处都是一大堆彩色三角形。

绘制 VBO 的渲染循环部分如下所示:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, NULL);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, offsetof(Vertex, r), NULL);
glDrawArrays(GL_TRIANGLES, 0, vertex_amount);
glBindBuffer(GL_ARRAY_BUFFER, 0);

我做错了什么?

glVertexPointer(3, GL_FLOAT, 0, NULL);
                             ^

Vertex 数组中的位置值未紧密排列,因此您不能将 0 用于 stride。使用 sizeof( Vertex ).

glColorPointer(4, GL_FLOAT, offsetof(Vertex, r), NULL);
                            ^^^^^^^^^^^^^^^^^^^

我...不确定您要来这里干什么。也许您认为 glVertexPointer()/glColorPointer() 的第三个参数是 pointer 而不是 stride?将您的 offsetof() 移动到最后一个参数 pointer.

总计:

glVertexPointer(3, GL_FLOAT, sizeof( Vertex ), offsetof(Vertex, x) );
glColorPointer(4, GL_FLOAT, sizeof( Vertex ), offsetof(Vertex, r) );

您可能必须将 pointer 参数值转换为 void*,具体取决于您如何实施 offsetof()