我想将一个非常大的内存块的内容传输到足够大的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传输操作中的行为方式是否相似。
答案 0 :(得分:2)
OpenGL没有定义如何实现glBufferSubData
:它可以立即将数据复制到GPU内存,也可以将复制操作推迟到以后的位置。
OpenGL保证(OpenGL 4.5规范,第5.3节)是一个人可以假设在方法返回时完成对glBufferSubData
的调用。这意味着每个延迟CPU-> GPU复制操作的实现都必须确保在返回之前复制CPU内存。
总之:您可以在glBufferSubData
返回后立即更改指针的内容,而无需修改/销毁缓冲区内容。