最近,我注意到glCopyBufferSubData不适用于Storage对象,因为扩展没有提到它。为了确保这一点,我通过打印映射缓冲区进行了测试,而新的SSBO包含重复的无意义的内容,这表明情况就是这样。不需要创建一个自定义的计算着色器就可以做到这一点,是否有任何方法从CPU发出的命令复制GPU上的数据,类似于glCopyBufferSubData对其他缓冲区类型所做的操作?
发布于 2013-11-25 16:41:05
函数glCopyBufferSubData在缓冲区对象上工作。缓冲区对象本身并不特殊,所有缓冲区对象都是相同的。只有当将缓冲区对象绑定为着色存储缓冲区时,它才用作着色器存储缓冲区。但是,如果不是用作着色存储缓冲区,它只是一个普通的缓冲区对象。因此,您认为glCopyBufferSubData不适用于着色存储缓冲区的假设显然是错误的,它适用于缓冲区,无论您以后使用的是哪些缓冲区。扩展没有提到SSBO的唯一原因是,在引入copy_buffer扩展时,SSBO并不存在,但是这种功能与SSBO完全正交。
它对你不起作用的原因是在其他地方被搜索。也许您不能使用GL_SHADER_STORAGE_BUFFER作为glCopyBufferSubData的有效目标,但这并不是必需的,只需将缓冲区绑定到另一个目标,例如GL_COPY_READ_BUFFER或GL_COPY_WRITE_BUFFER。另一个错误源可能是,从着色器写入SSBO不一定与以下读取操作同步,如果在计算后立即复制数据,则可能需要额外的glMemoryBarrier。
但是要明确的是,glCopyBufferSubData适用于任何类型的缓冲区,而绑定缓冲区的目标完全不绑定到缓冲区对象及其数据本身。您可以完美地使用SSBO计算一些数据,然后将其呈现为VBO等等。
https://stackoverflow.com/questions/20197996
复制相似问题