glBufferSubData 啥时候返回? [复制]

Posted

技术标签:

【中文标题】glBufferSubData 啥时候返回? [复制]【英文标题】:When does glBufferSubData return? [duplicate]glBufferSubData 什么时候返回? [复制] 【发布时间】:2017-06-21 05:04:16 【问题描述】:

我想将一个非常大的内存块的内容传输到足够大的 GPU 缓冲区,然后立即更改 CPU 上的内存内容。类似这样的伪代码:

glBindBuffer(/*very_large_buffer*/);
glBufferSubData(/*very_large_memory_chunk*/);
memset(/*zeros*/, /*very_large_memory_chunk*/);

在这段代码中,glBufferSubData 实际上做了什么?它是在返回之前将very_large_memory_chunk 转移到某个地方,还是只是安排转移操作以供以后执行?因此,如果我立即开始更改 CPU 缓冲区,是否可能会传输部分更改的内存,从而在 GPU 的very_large_buffer 中产生垃圾?

请注意,我不是在询问渲染调用。我知道如果缓冲区用于渲染,传输操作将等到渲染完成,反之亦然。我想知道 OpenGL 在 CPU 到 GPU 传输操作中的行为是否相同。

【问题讨论】:

【参考方案1】:

OpenGL 没有定义 glBufferSubData 必须如何实现:它可以立即将数据复制到 GPU 内存,也可以将复制操作推迟到以后。

OpenGL 保证(OpenGL 4.5 规范,第 5.3 节)是可以假定在方法返回时完成对 glBufferSubData 的调用。这意味着每个延迟 CPU->GPU 复制操作的实现都必须确保在返回之前复制 CPU 内存。

结论:您可以在glBufferSubData 返回后立即更改指针的内容,而无需修改/销毁缓冲区内容。

【讨论】:

以上是关于glBufferSubData 啥时候返回? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 glBufferSubData 需要等到 glDrawElements 不使用 VBO?

OpenGL glBufferSubData 偏移问题

glBufferData 和 glBufferSubData 偏移量

带有 glMapBuffer 的 Buffer 会被分配比 glBufferSubData 更慢的 VRAM 吗?

结构的 glBufferSubData 偏移量

使用 glBufferSubData() 更新 VBO 数据