を介してバッファをバインドする場合glBindBuffer()
、ターゲットがへの別の呼び出しによって再バインドされるまで、バッファはバインドされたままであると安全に想定できると確信していましたglBindBuffer()
。glBindVertexArray()
したがって、呼び出しによってGL_ELEMENT_ARRAYターゲットにバインドされたバッファーが0に設定されることを発見したとき、私は非常に驚きました。
最小限のC++サンプルコードは次のとおりです。
GLuint buff;
glGenBuffers(1, &buff);
std::cout << "Buffer is " << buff << "\n";
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buff);
GLuint vao;
glGenVertexArrays(1, &vao);
GLint bound_buff;
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound before glBindVertexArray: " << bound_buff << "\n";
glBindVertexArray(vao);
// ^- an implicit glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); ?
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound after glBindVertexArray: " << bound_buff << "\n";
OpenGL 3.2デバイスコンテキストを初期化した直後にこのコードを実行すると、次の出力が得られます。
Buffer is 1
Bound before glBindVertexArray: 1
Bound after glBindVertexArray: 0
一方、GL_ARRAY_BUFFERは呼び出しによって変更されません。OpenGL 3.2仕様(2.10)を確認しましたglBindVertexArray
が、予期しない副作用については言及されていませんでした。
- この動作は仕様に準拠していますか?
- もしそうなら、への呼び出しから他にどのような副作用が予想され
glBindVertexArray
ますか? - この背後にある理論的根拠は何ですか?
296.10WHQLドライバーを搭載したWinXPx64マシンのnvidiaカードでこれをテストしました。nvidiaGT330Mを使用したOSXLionでの簡単なテストでも、同じ結果が得られました。