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)

请注意,我只是移动了标有感叹号的两行。

这种行为的原因可能是什么?我认为如果我使用 将数组缓冲区与顶点属性glVertexAttribPointer相关联,那么该关联将成为程序状态的一部分并一直有效,直到它被显式更改?

4

1 回答 1

1

顶点属性和统一绑定与程序无关。属性或统一位置只是一个数字,如果多个程序具有相同的位置设置(因为它可以在更高版本的 GLSL 中明确完成),那么相同的属性和统一绑定可以被多个程序重用。这也意味着,glUseProgram 不会恢复绑定,这些绑定可能已在其他地方进行了更改。

于 2012-12-19T14:55:52.607 回答