2011-09-28 6 views
11

これは問題になるかもしれません。私が理解するように、glBindAttribLocation(...、AAA、...)は、AAAが一意である限り、プログラム内の属性をAAAのロケーションIDにバインドします。私は次のコードをお持ちの場合:GLES2 glBindAttribLocation()は必要ですか?

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

これは、ロケーションID 0と1に私の2つの変数をバインドしますが、私はそれから呼び出します。

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

はこれまで、私は理解しているのIDを0と1は最初のパラメータとしてglVertexAttribPointer()に渡されます。

上記のようにglGetAttribLocation()呼び出しによって属性のロケーションIDを取得した場合、返されるIDは0と1ではなく5と6になり、5を渡すことができます6をglVertexAttribPointer()とglEnableVertexAttribArray()の代わりに0と1 ??

答えて

13

glGetAttribLocation()は正しいインデックスを返します。したがって、glVertexAttribPointer()およびglEnableVertexAttribArray()でこれらの値を使用することは安全です。

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

関連する問題