c++ - 我如何在渲染 VBO 后才更改纹理坐标?

标签 c++ opengl opengl-es opengl-es-2.0

当我渲染立方体时,它看起来像这样:

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);

这意味着再次绑定(bind)缓冲区并在其上调用 glBufferData

您还可以使用纹理坐标创建一个新的 vbo,并通过调用 glVertexAttribPointer(textureCoordsAttribute, 2, GL_FLOAT, false, 0, 0); 将其设置为属性缓冲区,并将其绑定(bind)到 GL_ARRAY_BUFFER

关于c++ - 我如何在渲染 VBO 后才更改纹理坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29105851/

相关文章:

android - 使用 OpengL Surface 为 Android 制作游戏循环的最佳方法

iphone - 以后如何删除 child ? (cocos2d)

c++ - 在 C++ 中重载运算符时,如何解决从 'const double*' 到 'double*' 的无效转换

opengl - 经典的 "nothing is getting rendered"OpenGL 问题

android - 使用android自写文字动画

c - GTK+ 和 OpenGL

c++ - 在 CLion 中使用 OpenGL 时出现未定义引用错误

C++ openMP 并行矩阵乘法

c++ - 有人可以解释 "- ' 0' "

c++ - 在 gcc 8.2 而非 MSVC 19 中编译的模板代码