我正在尝试在 OpenGL 中使用单个结构和单个 VBO 向我的对象添加颜色。为此,我创建了一个 Vertex
结构,如下所示:
typedef struct {
float x;
float y;
float z;
float r;
float g;
float b;
float a;
} Vertex;
我已经知道我正在正确设置所有坐标和颜色以获得我想要的,因为我对列表中存储的每个对象进行了迭代测试,并使用 glVertex3f
绘制点并设置颜色和 glColor4f
(这比我正在寻找的要慢得多)。但是当我尝试使用 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(顶点)
。
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()
的方式。
关于opengl - OpenGL VBO 中的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40165256/