“着色器存储缓冲区对象”(SSBO)与图像加载存储操作之间存在什么差异
什么时候应该使用而不是另一个?
它们都可以进行原子操作,我认为它们存储在相同类型的内存中。而且无论它们是否存储在相同类型的内存中,它们都具有相同的性能特征吗?
编辑:最初的问题是在SSBO和统一缓冲区对象之间提出问题,它是在SSBO和Image加载存储之间。
答案 0 :(得分:8)
着色器存储缓冲区对象和图像纹理之间的区别以及人们想要使用它们的原因是它们可以使用接口块。
图像只是纹理,这意味着只有vec4在数据结构中。好吧,不仅vec4,它可以有其他格式,但数据结构将是一种数据类型。
其中,SSBO是通用的。他们可以在单个接口块中使用int,float,vec3数组的组合。
因此,SSBO比图像纹理更灵活。
答案 1 :(得分:3)
http://www.opengl.org/wiki/Shader_Storage_Buffer_Object已经或多或少地明确回答了您的问题。它说:
SSBO与统一缓冲区对象非常相似。着色器存储块是 由Interface Block(GLSL)定义的几乎与uniform一样 块。存储SSBO的缓冲区对象绑定到SSBO绑定 点,就像制服的缓冲对象绑定到UBO绑定一样 点。等等。
它们之间的主要区别是:
SSBO可以更大。所需的最小UBO大小为16KB;所需的最小SSBO大小为16MB,典型大小为 大概是GPU内存的大小。
SSBO是可写的,甚至是原子的; UBO是统一的。 SSBO读写使用非相干内存访问,因此需要使用 适当的障碍,就像图像加载存储操作一样。
- 醇>
SSBO可以拥有无限制的存储空间,最高可达缓冲区范围; UBO必须具有特定的固定存储大小。这意味着你可以 在SSBO中有一个任意长度的数组。实际的大小 数组,基于缓冲区绑定的范围,可以查询 着色器中的运行时使用无界上的长度函数 数组变量。