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