0

メッシュの色を変更しようとしていますが、機能しません。以下のコードをご覧ください。

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);

与える

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);

//インデックスをバインドして描画します

4

1 に答える 1

1

VBO を作成するときに、インターリーブ配列レイアウトを使用しています。OpenGL は、VBO の内容を認識していません。VBO にとっては、単なるバイトの集まりです。VBO の内容を glBufferSubData で更新すると、「col」配列のレイアウトがメッシュ配列のレイアウトと一致しないため、データが台無しになります。

インターリーブされていないレイアウトを使用するか、頂点属性ごとに個別の VBO を使用するか、glMapBuffer を使用して VBO をクライアント アドレス空間にマップし、そこでコンテンツを更新します。

于 2013-03-09T01:56:45.093 に答える