次のコードは機能しません。
self._program1 = glCreateProgram()
... attach shaders, link ...
glUseProgram(self._program1)
self._fooLoc = glGetAttribLocation(self._program1, 'foo')
glBindBuffer(GL_ARRAY_BUFFER, self._fooBuffer) #!!!!!
glVertexAttribPointer(self._fooLoc, 4, GL_FLOAT, False, 0, None) #!!!!!
glEnableVertexAttribArray(self._fooLoc)
glUseProgram(0)
... lots of stuff, but self._program1 is never used ...
glUseProgram(self._program1)
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
glUseProgram(0)
ただし、次のようにコードを変更すると、機能します。
self._program1 = glCreateProgram()
... attach shaders, link ...
glUseProgram(self._program1)
self._fooLoc = glGetAttribLocation(self._program1, 'foo')
glEnableVertexAttribArray(self._fooLoc)
glUseProgram(0)
... lots of stuff, but self._program1 is never used ...
glUseProgram(self._program1)
glBindBuffer(GL_ARRAY_BUFFER, self._fooBuffer) #!!!!!
glVertexAttribPointer(self._fooLoc, 4, GL_FLOAT, False, 0, None) #!!!!!
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
glUseProgram(0)
感嘆符でマークされた2行を移動しただけであることに注意してください。
この動作の理由は何でしょうか?を使用して配列バッファーを頂点属性glVertexAttribPointer
に関連付けると、その関連付けはプログラムの状態の一部になり、明示的に変更されるまで有効であると思いましたか?