如何在渲染 VBO 后仅更改纹理坐标?
How do I only change the texture coords once I've rendered a VBO?
当我渲染一个立方体时,它看起来像这样:
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);
这意味着再次绑定缓冲区并在其上调用CCD_ 1
您也可以使用纹理坐标创建一个新的vbo,并通过调用glVertexAttribPointer(textureCoordsAttribute, 2, GL_FLOAT, false, 0, 0);
将其绑定到GL_ARRAY_BUFFER
来将其设置为属性缓冲区。
您可以使用glBufferSubData()
:更新现有缓冲区中的数据
glBindBuffer(GL_ARRAY_BUFFER, textureCoordsBuffer);
glBufferSubData(GL_ARRAY_BUFFER, 0, textureDataSizeInBytes, textureData);
如果频繁更新数据,则应相应地选择初始glBufferData()
调用的用法参数:
glBufferData(GL_ARRAY_BUFFER, textureDataSizeInBytes, NULL, GL_DYNAMIC_DRAW);
每次要修改数据时都可以调用glBufferData()
,这是合法的。但它的效率可能要低得多,因为这意味着每次都要分配一个新的缓冲区对象。
请注意,在这种情况下,glBufferData()
的数据参数可以指定为NULL。当以这种方式使用时,它将只为数据分配内存,期望您稍后通过调用glBufferSubData()
来指定数据本身。
相关文章:
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 移植DXUT SDKMesh以导入OBJ文件,在哪里添加纹理坐标和索引
- 替代gl_texcoord.xy获得纹理坐标
- OpenGL 纹理坐标不起作用
- 着色器和纹理坐标问题
- 将浮点数组存储在纹理中,并使用纹理坐标从着色器访问浮点
- Opengl 土壤纹理坐标无法识别
- 将纹理坐标呈现到帧缓冲区
- 使用纹理坐标重复纹理的部分
- 如何在渲染 VBO 后仅更改纹理坐标?
- OpenGL:动态更改纹理坐标
- 如何创建纹理坐标
- OpenGL 对齐纹理坐标
- 用于渲染 3D 球体的纹理坐标
- 在DirectX9/C++中为OBJMesh加载纹理坐标
- DirectX剪辑空间纹理坐标
- 包裹纹理坐标在可变大小的四边形上
- 对象模型加载纹理坐标和顶点位置没有正确加载
- Opengl纹理坐标用于全屏效果
- 圆柱体()和纹理坐标偏移/乘数