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