11

これは初心者の質問かもしれません。私が理解しているように、glBindAttribLocation(..., AAA, ...) は、AAA が一意である限り、プログラム内の属性を AAA のロケーション ID にバインドします。次のコードがある場合:

glBindAttribLocation(..., 0, "XXX");
glBindAttribLocation(..., 1, "YYY");

これにより、2 つの変数が場所 ID 0 と 1 にバインドされます。次に、次のように呼び出します。

glBindBuffer(GL_ARRAY_BUFFER, VBId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBId);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void *) 0 + sizeof(float) * 3);
glEnableVertexAttribArray(1);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

ここまでで、glVertexAttribPointer()の第一引数に0と1のIDが渡されていることが分かりました。

返される ID が 0 と 1 ではなく 5 と 6 になるように、glGetAttribLocation() 呼び出しを介して (上記のように) 属性の位置 ID を取得した場合、5 と 6 を glVertexAttribPointer( ) と glEnableVertexAttribArray() の代わりに 0 と 1??

4

1 に答える 1

13

glGetAttribLocation()は正しいインデックスを返します。そうです、glVertexAttribPointer()とglEnableVertexAttribArray()でこれらの値を使用するのは安全です。

ただし、シェーダーごとにglGetAttribLocationを呼び出すと、キャッシュしないとコストがかかる可能性があります。glBindAttribLocation()を使用すると、規則を使用できます。位置は常に0、通常は1などです。

于 2011-10-04T13:59:28.583 に答える