如果我打电话给glBindBuffer
,然后是glVertexAttribPointer
,然后是另一个glBindBuffer
,但缓冲区不同但属性格式相同,我是否需要重新调用{{1} ,或glVertexAttribPointer
是一个全局设置,尽管缓冲区有变化,但仍然存在?
切换着色器时是否需要调用glVertexAttribPointer
(如果我知道着色器之间的属性位置相同),或者它是一个全局设置,即使着色器更改仍然存在。我相当肯定在这种情况下是后者,因为我通常在编译任何着色器之前调用glVertexAttribPointer
。
注意,我无法访问VAO(这是在OpenGL ES 2.0中,没有VAO扩展名)。
答案 0 :(得分:0)
您正在做出可能适用于您现在使用的特定OpenGL ES驱动程序的假设,但我不希望它能够在具有不同GPU和驱动程序的各种设备上运行,因为您违背了Khronos规范的精神和通常的做法。我怀疑甚至会有任何性能提升,因为这些调用不是瓶颈。通常,您应该在glUseProgram()和glBindBuffer()之后以及glDrawArrays()之前执行所有glVertexAttribPointer()调用。稍晚更改glBindBuffer()的风险可能比更改着色器的风险要小,但是编写可移植代码已经具有挑战性,特别是对于有许多不同OpenGL ES实现的Android。