1

Vertex Array Objects と Vertex Buffer Objects に関するチュートリアルを読んだところですが、OpenGL が最初の VBO ( vertexBufferObjID[0]) が頂点座標を表し、2 番目の VBO ( vertexBufferObjID[1]) がカラー データを表していることを次のコードから理解できませんか?

glGenBuffers(2, vertexBufferObjID);

// VBO for vertex data
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[0]);
glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat), vertices, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(0);

// VBO for colour data
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[1]);
glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat), colours, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);

編集: Peter の回答のおかげで、各 VBO をシェーダーに接続する次の 2 行のコードが見つかりました (インデックス 0 と 1 は VBO インデックスに関連付けられています)。

glBindAttribLocation(programId, 0, "in_Position");
glBindAttribLocation(programId, 1, "in_Color");
4

2 に答える 2

1

そうではありません。シェーダーでどちらがどちらであるかを伝える必要があります。

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;

void main()
{
    /* ... */
}
于 2012-09-02T16:35:36.707 に答える
0

glVertexAttribPointerシェーダーでのみ使用することを目的としています。したがって、シェーダーライターは、頂点シェーダーの特定の変数にマップされるため、各属性インデックスが何をするのかを常に知っています。glBindAttribLocationコマンドまたはglGetAttribLocation、を使用して、またはGLSL内の特別なキーワードから、変数マップへのインデックスを制御します。

固定関数パイプライン(デフォルトのシェーダー)を使用しているだけの場合は、を使用しませんglVertexAttribPointer。固定機能パイプの代わりに、同等のコマンドはglVertexPointerandglColorPointerなどです。これらは非推奨のコマンドであることに注意してください。

また、固定機能の場合glEnableVertexAttribArrayはに置き換えられることに注意してくださいglEnableClientState

于 2012-09-02T16:35:11.777 に答える