3

次のコードは機能しません。

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に関連付けると、その関連付けはプログラムの状態の一部になり、明示的に変更されるまで有効であると思いましたか?

4

1 に答える 1

1

Vertex Attributeと Uniformバインディングは、特にプログラムに関連付けられていません。属性またはユニフォームの場所は単なる数字であり、多数のプログラムが同一の場所のセットアップを持っている場合 (GLSL の新しいバージョンで明示的に行うことができるため)、同じ属性とユニフォームのバインディングを複数のプログラムで再利用できます。これは、glUseProgram が、別の場所で変更された可能性のあるバインディングを復元しないことも意味します。

于 2012-12-19T14:55:52.607 に答える