我目前正在使用UBO在OpenGL 4.3中进行渲染,以便在GPU上存储我的所有常量数据。 (像材料描述,矩阵......)。 它的工作原理是小尺寸的UBO(在我的实现上为64kB)迫使我多次切换缓冲区以减慢渲染速度,我正在寻找类似的存储几MB的方法。
经过一番研究后,我发现SSBO允许这样做,但也有不必要的功能' :它们可以从着色器中写入,并且读取速度可能较慢。
是否有比SSBO更好的解决方案为着色器提供大块数据?我觉得我错过了什么,为什么UBO限制在几KB,而存在一个更灵活的解决方案,能够处理更多的数据?如果着色器存储缓冲区是我正在寻找的,有没有办法确保它们不被着色器修改?
答案 0 :(得分:12)
UBO和SSBO从根本上代表了两种不同的硬件。
着色器以组的形式执行,以便每个着色器以锁定步骤执行。每组单独的着色器调用都可以访问一块内存。这个记忆是UBO所代表的。它相对较小(大约为千字节),但访问速度非常快。执行渲染操作时,来自UBO的数据将复制到此着色器本地存储器中。
SSBO代表全球记忆。它们基本上都是指针。这就是为什么它们通常没有存储限制的原因(最小GL要求是16 兆字节,大多数实现返回的数量大小与GPU的内存大小相当)。 / p>
它们访问速度较慢,但这种性能是因为它们存在的位置以及它们的访问方式,而不是因为它们可能不是常量。全局内存是全局GPU内存而不是本地常量内存。
如果着色器需要访问的数据量超过其着色器本地内存中的数据,则需要使用全局内存。即使您有办法宣布SSBO为“常数”,也没有解决这个问题。