OpenGL ES / 2.0:glEnableVertexAttribArray的范围?

时间:2014-04-22 11:50:17

标签: opengl-es-2.0

我认为 - 当我搜索,搜索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”。

1 个答案:

答案 0 :(得分:2)

这个州是全球性的。与程序状态完全无关。

编辑:我刚刚注意到你问题的最后一段。因此,对于原始海报,请忽略下面的部分,因为您不想听到VAO。 ;)我会把它留在那里,以防它帮助其他人。

Full OpenGL以及OpenGL ES 3.0还有一个名为Vertex Array Object的额外对象类型(通常缩写为VAO)。这允许您存储对象中给定顶点缓冲区集的所有设置状态,并切换到具有单个glBindVertexArray调用的状态集。如果使用此功能,则状态范围将成为VAO。