为多个着色器存储块重用Bindings是否合法

时间:2016-01-14 13:43:11

标签: opengl glsl shader shader-storage-buffer

假设我有一个着色器存储缓冲区,并希望有几个视图,例如像这样:

layout(std430,binding=0) buffer FloatView { float floats[]; };
layout(std430,binding=0) buffer IntView { int ints[]; };

这是合法的GLSL吗? opengl.org说不:

  

两个块不能使用相同的索引。

但是,我在GL 4.5 Core SpecGLSL 4.50 Spec(或ARB_shader_storage_buffer_object extension description)中找不到这样的声明,我的NVIDIA驱动程序似乎编译了这样的代码而没有错误或警告。

1 个答案:

答案 0 :(得分:4)

OpenGL规范是否明确禁止这样做?显然不是。或者至少,如果确实如此,我看不到在哪里。

但这并不意味着它将跨平台工作。在处理OpenGL时,最好采取保守的路径。

如果您需要将内存从一个表示“转换”到另一个表示,则应该使用单独的绑定点。它更安全。

现在有一些官方消息。我filed a bug on this issue,他们已经阅读并决定了一些事情。具体来说,结论是:

  
      
  • 有单独的绑定命名空间:原子计数器,图像,纹理,统一缓冲区和SSBO。
  •   
  • 我们不希望在除原子计数器之外的任何一个上允许别名,其中允许使用不同的偏移(例如,共享绑定)别名。
  •   

简而言之,不要这样做。希望GLSL规范在这方面得到澄清。

这在GLSL 4.5的修订版7中“已修复”:

  

对于多个统​​一块或多个缓冲区块使用相同的绑定编号是编译时或链接时错误。

我说“已修复”,因为您仍然可以通过glUniform/ShaderStorageBlockBinding手动执行别名。并且规范没有说明这将如何正常工作。