我无法理解如何在 OpenGL ES2(在 iOS 上)中使用 VAO 并让它们工作。我当前的渲染设置如下所示(在伪代码中):
初始化:
foreach VBO:
glGenBuffers();
渲染一个框架:
// Render VBO 1
glClear(color | depth);
glBindBuffer(GL_ARRAY_BUFFER, arrayVBO1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO1);
foreach vertex attribute:
glVertexAttribPointer();
glEnableVertexAttribArray();
glBufferData(GL_ARRAY_BUFFER, ...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ...);
glDrawElements(GL_TRIANGLE_STRIP, ...);
// Render VBO 2
glClear(color | depth);
glBindBuffer(GL_ARRAY_BUFFER, arrayVBO2);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO2);
foreach vertex attribute:
glVertexAttribPointer();
glEnableVertexAttribArray();
glBufferData(GL_ARRAY_BUFFER, ...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ...);
glDrawElements(GL_TRIANGLE_STRIP, ...);
这很好用,但是,两个 VBO 都具有完全相同的交错顶点属性结构,并且如您所见,我正在为每个 VBO 的每一帧设置和启用每个属性。Instruments 抱怨对 glVertexAttribPointer() 和 glEnableVertexAttribArray() 的冗余调用,但是当我将其中一个或两个移动到初始化阶段时,我要么在调用 glDrawElements 时得到 EXC_BAD_ACCESS,要么什么都没有绘制。
我的问题是我是否需要在每一帧都这样做,如果我不这样做为什么它不起作用,以及我将如何使用 VAO 来解决这个问题。