Opengl es 切换缓冲区对象或着色器时,glVertexAttribPointer是否无效?

Opengl es 切换缓冲区对象或着色器时,glVertexAttribPointer是否无效?,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,如果我调用glBindBuffer,然后调用glvertexattributepointer,然后调用另一个具有不同缓冲区但属性格式相同的glBindBuffer,我是否需要重新调用glvertexattributepointer,或者glvertexattributepointer是一个全局设置,尽管缓冲区发生了更改,它仍然存在 切换着色器时是否需要调用glvertexattributepointer(如果我知道着色器之间的属性位置相同),或者它是一个全局设置,尽管着色器发生了更改,但仍然保持

如果我调用
glBindBuffer
,然后调用
glvertexattributepointer
,然后调用另一个具有不同缓冲区但属性格式相同的
glBindBuffer
,我是否需要重新调用
glvertexattributepointer
,或者
glvertexattributepointer
是一个全局设置,尽管缓冲区发生了更改,它仍然存在

切换着色器时是否需要调用
glvertexattributepointer
(如果我知道着色器之间的属性位置相同),或者它是一个全局设置,尽管着色器发生了更改,但仍然保持不变。我很确定在这种情况下是后者,因为我通常在编译任何着色器之前调用
glvertexattributepointer


注意,我没有访问VAO的权限(这是在OpenGL ES 2.0中,没有VAO扩展)。

您所做的假设可能适用于您现在使用的特定OpenGL ES驱动程序,但我不希望它能在一系列具有不同GPU和驱动程序的设备上工作,因为这违背了Khronos规范和惯例的精神。我甚至怀疑会有任何性能提升,因为这些调用不是瓶颈。通常,您应该在glUseProgram()和glBindBuffer()之后以及紧接glDrawArrays()之前执行所有glVertexAttributePointer()调用。晚更改glBindBuffer()的风险可能比晚更改着色器的风险要小,但编写可移植代码已经足够具有挑战性了,特别是对于Android来说,在Android中有如此多不同的OpenGL ES实现