我认为 - 当我搜索,搜索stackoverflow,并没有找到明确的答案 - 我们需要澄清未来:glEnableVertexAttribArray的确切范围是什么?
我的意思是什么?嗯,我们知道:统一状态与着色器程序绑定。所以调用glUseProgram(X)
(X> 0)也会将所有使用过的制服设置为默认值(ATI除外),或者当同一程序处于活动状态时我们之前通过glUniformXXX()
提供的值。所以我对我的问题的答案就像“glUniform的确切范围是什么”将是“每次使用一个特定的着色器程序”。
现在我的情况是Mesh可能包含多组缓冲区对象。渲染的伪代码如下所示:
mat = mesh->getMaterial;
mesh->overrideUniforms;
mat->prepareGL; // call glUseProgram, update changed Uniforms, bind textures
mesh->render;
现在mesh->render
显然处理绑定属性和绘图。如果一个网格有多组缓冲区,它看起来就像那样(假设每个缓冲区对象集包含所有属性的所有数据/一个渲染通道):
for_each(set_of_bufferObjects)
bindBufferObjects
for_each(Attribute)
glEnableVertexAttribArray
glVertexAttribPointer
glDraw
如果enableVertexAttribArray的范围是f.e. “每次使用程序X”,只要我之前启用了数组(当程序X第一次使用时),我就可以省去glEnableVertexAttribArray
次调用。
另一方面,如果范围是“在一个特定的程序使用期间”,我可以在mesh->render
内设置一次,然后忘记它们。这尤其可以解释为什么我不会因为没有禁用任何VVA而遭受副作用。
那么有人知道glEnableVertexAttribArray属于哪个GL状态吗?
P.S。:我明确要求gl / es 2.0,因为规格中没有VAO!所以请不要回答“只使用VAO”。
答案 0 :(得分:2)
这个州是全球性的。与程序状态完全无关。
编辑:我刚刚注意到你问题的最后一段。因此,对于原始海报,请忽略下面的部分,因为您不想听到VAO。 ;)我会把它留在那里,以防它帮助其他人。
Full OpenGL以及OpenGL ES 3.0还有一个名为Vertex Array Object的额外对象类型(通常缩写为VAO)。这允许您存储对象中给定顶点缓冲区集的所有设置状态,并切换到具有单个glBindVertexArray
调用的状态集。如果使用此功能,则状态范围将成为VAO。