我想将一个非常大的内存块的内容传输到足够大的 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 传输操作中的行为是否相似。
OpenGL没有定义如何glBufferSubData
必须实现:它可以立即将数据复制到 GPU 内存,也可以将复制操作推迟到稍后的时间点。
OpenGL 所保证的(OpenGL 4.5 规范,第 5.3 节)是人们可以assume打电话给glBufferSubData
当方法返回时完成。这意味着每个推迟 CPU->GPU 复制操作的实现都必须确保在返回之前复制 CPU 内存。
结论:您可以在之后立即更改指针的内容glBufferSubData
返回而不修改/销毁缓冲区内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)