顶点属性绑定范围



以下代码不起作用:

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 将数组缓冲区与顶点属性相关联,那么该关联将成为程序状态的一部分并保持有效,直到明确更改为止?

顶点属性和统一绑定与程序无关。属性或统一位置只是一个数字,如果许多程序具有相同的位置设置(可以在更高版本的 GLSL 中显式完成),则相同的属性和统一绑定可以与多个程序重用。这也意味着,glUseProgram 不会恢复可能在其他地方更改的绑定。

最新更新