将SSBO复制到另一个SSBO中

时间:2013-11-25 16:24:21

标签: opengl replace

最近我注意到glCopyBufferSubData不适用于着色器存储缓冲区对象,因为扩展名不包括它。为了确保,我通过打印出映射的缓冲区和新的SSBO包含重复的废话来测试这一点,这表明情况就是这样。无需创建自定义计算着色器来执行此操作,是否有任何方法可以从CPU发出的命令复制GPU上的数据,类似于glCopyBufferSubData将为其他缓冲区类型执行的操作?

1 个答案:

答案 0 :(得分:3)

函数glCopyBufferSubData适用于缓冲区对象。缓冲对象本身并不特别,所有缓冲对象都是相同的。仅当将缓冲区对象绑定为着色器存储缓冲区时,才将其用作着色器存储缓冲区。但如果不用作着色器存储缓冲区,它只是一个普通的缓冲区对象。因此,您假设glCopyBufferSubData对着色器存储缓冲区不起作用是完全错误的,它适用于缓冲区,无论您稍后使用这些缓冲区。扩展未提及SSBO的唯一原因是,当引入copy_buffer扩展时SSBO不存在,但此功能与SSBO完全正交。

它不适合你的原因是在别处搜索。也许您不能将GL_SHADER_STORAGE_BUFFER用作glCopyBufferSubData的有效目标,但无论如何都不需要,只需将缓冲区绑定到另一个目标,例如: GL_COPY_READ_BUFFERGL_COPY_WRITE_BUFFER。另一个错误源可能是从着色器到SSBO的写入不一定与后续读取操作同步,如果在计算后立即复制数据,则可能需要额外的glMemoryBarrier

但为了说清楚,glCopyBufferSubData适用于任何类型的缓冲区,并且绑定缓冲区的目标绝对不依赖于缓冲区对象及其数据本身。您可以完美地使用SSBO计算一些数据,然后将其渲染为VBO等等。