C SSBO作为更大的UBO?

C SSBO作为更大的UBO?,c,opengl,glsl,compute-shader,C,Opengl,Glsl,Compute Shader,我目前正在OpenGL4.3中进行渲染,使用UBOs将所有常量数据存储在GPU上。(材料描述、矩阵等)。 它可以工作,但是UBO的小尺寸(在我的实现中是64kB)迫使我多次切换缓冲区,从而降低了渲染速度,我正在寻找类似的方法来存储几MB 经过一点研究,我发现SSBO确实允许这样做,但也有不需要的“特性”:它们可以从着色器写入,并且读取速度可能较慢 有没有比SSBO更好的解决方案为着色器提供大块数据?我觉得我遗漏了一些东西,为什么UBO应该被限制在几个kB,而存在一个能够处理更多数据的更灵活的解决

我目前正在OpenGL4.3中进行渲染,使用UBOs将所有常量数据存储在GPU上。(材料描述、矩阵等)。 它可以工作,但是UBO的小尺寸(在我的实现中是64kB)迫使我多次切换缓冲区,从而降低了渲染速度,我正在寻找类似的方法来存储几MB

经过一点研究,我发现SSBO确实允许这样做,但也有不需要的“特性”:它们可以从着色器写入,并且读取速度可能较慢


有没有比SSBO更好的解决方案为着色器提供大块数据?我觉得我遗漏了一些东西,为什么UBO应该被限制在几个kB,而存在一个能够处理更多数据的更灵活的解决方案?如果我正在寻找着色器存储缓冲区,是否有办法确保它们不被着色器修改?

UBOs和SSBO基本上代表两个不同的硬件(通常)1

着色器以组的形式执行,这样每个着色器都以锁定步骤执行。每组单独的着色器调用都可以访问一块内存。这就是UBO所代表的内存。它相对较小(以千字节为单位),但访问速度相当快。执行渲染操作时,UBOs中的数据将复制到此着色器本地内存中

SSBO表示全局内存。它们基本上是指针。这就是为什么它们通常没有存储限制(GL的最低要求是16兆字节,大多数实现返回的是GPU内存大小顺序上的数字)

它们的访问速度较慢,但这种性能是因为它们存在的位置和访问方式,而不是因为它们可能不是常数。全局内存是全局GPU内存,而不是本地常量内存

如果着色器需要访问的数据超过其着色器本地内存所能容纳的数量,则需要使用全局内存。即使你有办法将SSBO声明为“常量”,也无法回避这个问题


1:存在没有专用UBO存储的硬件(基于GCN的AMD硬件)。该硬件将UBO实现为只读SSBO,因此所有UBO访问都是全局内存访问。这种硬件基本上依赖于拥有大型缓存来弥补性能差异,而UBOs的使用模式往往使其可行。但是仍然有很多硬件有专门的UBO存储空间,因此如果您的使用能够满足这些限制,您应该使用它们。

我认为纹理对于在着色器中使用大量数据是合适的,尽管我不确定。如果需要更高的精度,可以使用整数或浮点纹理。
readonly buffer
将禁止写入。但我不知道它是否也被编译器或驱动程序用于潜在的优化。还有
restrict
修饰符:。是否有任何文档确认“SSBO代表全局内存”的语句?(只是尝试将这个术语与全局内存OpenCL进行比较)。@ USE846979:考虑OpenGL的要求。实施必须允许SSBO的大小至少为16MB。实现必须允许从着色器访问至少8个单独的SSBO。总共是128MB。如果这不是全局内存,那么它必须是内核或其他东西的本地内存,对吗?那么GPU只有128MB的SSBO内存?这些只是最低要求;实现通常公布接近总内存大小的需求。这些需求在规范中吗?我为这个问题道歉。我只是想为这些声明找到官方的参考资料(我不是怀疑或任何我只是好奇的事情)。它就在这里