当我渲染一个立方体时,它看起来像这样:
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(vertexPositionAttribute, 3, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, textureCoordsBuffer);
glVertexAttribPointer(textureCoordsAttribute, 2, GL_FLOAT, false, 0, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0);
我只想更改纹理坐标,而无需更改顶点或索引。
我的问题是我是否必须重新发送顶点数据和索引数据以再次渲染此立方体,还是可以仅发送新的纹理坐标?如果我可以发送新的纹理坐标,那么我需要进行OpenGL调用吗?
最佳答案
你可以做
glBindBuffer(GL_ARRAY_BUFFER, textureCoordsBuffer);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_DYNAMIC_DRAW);
这意味着再次绑定缓冲区并在其上调用
glBufferData
。您也可以使用纹理坐标制作一个新的vbo,并通过调用绑定到
glVertexAttribPointer(textureCoordsAttribute, 2, GL_FLOAT, false, 0, 0);
的GL_ARRAY_BUFFER
将其设置为属性缓冲区。关于c++ - 渲染VBO后,如何仅更改纹理坐标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29105851/