首先,就像每个 OpenGL 状态一样,设置的状态glVertexAttribPointer
保持不变,直到其他人再次调用glVertexAttribPointer
(对于相同的属性索引)。但这里重要的是,内部状态更改为glVertexAttribPointer
不只是存储用于渲染的缓冲区偏移量,调用时偏移到 VBO 范围内glDraw...
。它还存储调用时绑定的实际缓冲区对象glVertexAttribPointer
。
所以是的,每当您想要从另一个 VBO 获取顶点数据时,您需要绑定此 VBO 并在绑定此 VBO 时执行适当的glVertexAttribPointer
调用。虽然这在您的情况下可能看起来很麻烦,但这实际上是一件好事。这样,您在渲染某些内容时无需担心当前绑定的缓冲区,而只需担心使用glVertexAttribPointer
. 更重要的是,让我们在渲染之前绑定不同的 VBO,因此您可以在单个渲染调用中从不同的 VBO 获取不同的顶点属性(否则您会怎么做?)。
编辑:但是,您可以使用顶点数组对象来简化设置顶点数据的过程。它们封装了从一堆数组中渲染所需的所有状态(因此所有由 更改的东西glVertexAttribPointer
,gl(En/Dis)ableVertexAttribArray
以及绑定到 的缓冲区GL_ELEMENT_ARRAY_BUFFER
,但就像说的那样,不是绑定到 的缓冲区GL_ARRAY_BUFFER
)。当然,您仍然必须在调用之前正确绑定缓冲区glVertexAttribPointer
。但是使用 VAO,您只需要在某些设置例程中使用此代码,渲染所需要做的就是调用glBindVertexArray
. 虽然我不知道您的特定 ES 设备是否支持它们。