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;
我已经知道我正在正确设置所有坐标和颜色以获得我想要的东西,因为我 运行 对我存储在列表中的每个对象进行迭代并绘制出点的测试并使用 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( 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()
。
我正在尝试使用 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( 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()
。