Opengl 将一个SSBO复制到另一个SSBO

Opengl 将一个SSBO复制到另一个SSBO,opengl,replace,Opengl,Replace,最近我注意到glCopyBufferSubData不适用于着色器存储缓冲区对象,因为扩展没有提到它。为了确保这一点,我通过打印映射的缓冲区进行了测试,新的SSBO包含重复的废话,表明情况就是这样。在不必创建自定义计算着色器的情况下,是否有任何方法可以从CPU发出的命令复制GPU上的数据,类似于glCopyBufferSubData对其他缓冲区类型所做的操作?函数glCopyBufferSubData对缓冲区对象起作用。缓冲区对象本身没有什么特殊之处,所有缓冲区对象都是相同的。仅当将缓冲区对象绑定

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

函数
glCopyBufferSubData
对缓冲区对象起作用。缓冲区对象本身没有什么特殊之处,所有缓冲区对象都是相同的。仅当将缓冲区对象绑定为着色器存储缓冲区时,它才用作着色器存储缓冲区。但如果不用作着色器存储缓冲区,它只是一个普通缓冲区对象。因此,您认为
glCopyBufferSubData
不适用于着色器存储缓冲区的假设是完全错误的,它适用于缓冲区,无论您以后使用这些缓冲区的内容是什么。扩展没有提到SSBO的唯一原因是,引入复制缓冲区扩展时,SSBO不存在,但此功能与SSBO完全正交

它对你不起作用的原因是在别处被搜索。也许您不能将
GL\u着色器\u存储\u缓冲区
用作
glCopyBufferSubData
的有效目标,但这不是必需的,只需将缓冲区绑定到另一个目标,例如
GL\u复制\u读取\u缓冲区
GL\u复制\u写入\u缓冲区
。另一个错误源可能是,从着色器到SSBO的写入不一定与以下读取操作同步,如果在计算数据之后立即复制数据,则可能需要额外的时间


但要明确的是,
glCopyBufferSubData
适用于任何类型的缓冲区,并且绑定缓冲区的目标绝对不会绑定到缓冲区对象及其数据本身。您完全可以使用SSBO将一些数据计算到中,然后将其呈现为VBO等。

函数
glCopyBufferSubData
适用于缓冲区对象。缓冲区对象本身没有什么特殊之处,所有缓冲区对象都是相同的。仅当将缓冲区对象绑定为着色器存储缓冲区时,它才用作着色器存储缓冲区。但如果不用作着色器存储缓冲区,它只是一个普通缓冲区对象。因此,您认为
glCopyBufferSubData
不适用于着色器存储缓冲区的假设是完全错误的,它适用于缓冲区,无论您以后使用这些缓冲区的内容是什么。扩展没有提到SSBO的唯一原因是,引入复制缓冲区扩展时,SSBO不存在,但此功能与SSBO完全正交

它对你不起作用的原因是在别处被搜索。也许您不能将
GL\u着色器\u存储\u缓冲区
用作
glCopyBufferSubData
的有效目标,但这不是必需的,只需将缓冲区绑定到另一个目标,例如
GL\u复制\u读取\u缓冲区
GL\u复制\u写入\u缓冲区
。另一个错误源可能是,从着色器到SSBO的写入不一定与以下读取操作同步,如果在计算数据之后立即复制数据,则可能需要额外的时间


但要明确的是,
glCopyBufferSubData
适用于任何类型的缓冲区,并且绑定缓冲区的目标绝对不会绑定到缓冲区对象及其数据本身。您完全可以使用SSBO将一些数据计算到中,然后将其呈现为VBO等。

函数
glCopyBufferSubData
适用于缓冲区对象。缓冲区对象本身没有什么特殊之处,所有缓冲区对象都是相同的。仅当将缓冲区对象绑定为着色器存储缓冲区时,它才用作着色器存储缓冲区。但如果不用作着色器存储缓冲区,它只是一个普通缓冲区对象。因此,您认为
glCopyBufferSubData
不适用于着色器存储缓冲区的假设是完全错误的,它适用于缓冲区,无论您以后使用这些缓冲区的内容是什么。扩展没有提到SSBO的唯一原因是,引入复制缓冲区扩展时,SSBO不存在,但此功能与SSBO完全正交

它对你不起作用的原因是在别处被搜索。也许您不能将
GL\u着色器\u存储\u缓冲区
用作
glCopyBufferSubData
的有效目标,但这不是必需的,只需将缓冲区绑定到另一个目标,例如
GL\u复制\u读取\u缓冲区
GL\u复制\u写入\u缓冲区
。另一个错误源可能是,从着色器到SSBO的写入不一定与以下读取操作同步,如果在计算数据之后立即复制数据,则可能需要额外的时间


但要明确的是,
glCopyBufferSubData
适用于任何类型的缓冲区,并且绑定缓冲区的目标绝对不会绑定到缓冲区对象及其数据本身。您完全可以使用SSBO将一些数据计算到中,然后将其呈现为VBO等。

函数
glCopyBufferSubData
适用于缓冲区对象。缓冲区对象本身没有什么特殊之处,所有缓冲区对象都是相同的。仅当将缓冲区对象绑定为着色器存储缓冲区时,它才用作着色器存储缓冲区。但如果不用作着色器存储缓冲区,它只是一个普通缓冲区对象。因此,您认为
glCopyBufferSubData
不适用于着色器存储缓冲区的假设是完全错误的,它适用于缓冲区,无论您以后使用这些缓冲区的内容是什么。扩展没有提到SSBO的唯一原因是,引入复制缓冲区扩展时,SSBO不存在,但此功能与SSBO完全正交

它对你不起作用的原因是在别处被搜索。可能您不能将
GL\u着色器\u存储\u缓冲区
用作的有效目标