glBufferSubData改变颜色

时间:2013-03-09 01:45:44

标签: opengl

我正在尝试更改网格的颜色,但它不起作用。请看下面的代码。

typedef struct{
    GLubyte red, green, blue, alpha;
} MTcolor;

typedef struct{
    GLfloat x, y, z;
} MTvertex;

typedef struct{
    MTvertex verts;
    MTcolor colors;
} MTmesh;

GLuint vbo;
GLuint ibo;

static const MTmesh mesh[] = {
    { {0, 0, 0}, {0, 0, 255, 255} },
    { {1, 1, 0}, {0, 0, 255, 255} },
    { {2, 0, 0}, {0, 0, 255, 255} }
};

static const GLushort indices[] = {
    0, 1, 2
};

制造缓冲区

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(mesh), mesh, GL_STREAM_DRAW);

glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

RENDER

glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexPointer(3, GL_FLOAT, sizeof(MTmesh), (void*)offsetof(MTmesh, verts));

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(MTmesh), (void*)offsetof(MTmesh, colors));

我想改变颜色,但它不起作用。有什么想法吗?

MTcolor col[] = {
    255, 0, 0, 255,
    255, 0, 0, 255,
    255, 0, 0, 255
};
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(col), col);

//绑定索引并绘制

1 个答案:

答案 0 :(得分:1)

创建VBO时,您使用的是交错数组布局。 OpenGL不知道VBO中的内容是什么,它只是一堆字节。当您使用glBufferSubData更新VBO内容时,'col'数组的布局与网格数组的布局不匹配,因此您正在弄乱数据。

对每个顶点属性使用非交错布局或单独的VBO,或使用glMapBuffer将VBO映射到客户端地址空间并更新其中的内容。