假设我有一个着色器存储缓冲区,并希望有几个视图,例如像这样:
layout(std430,binding=0) buffer FloatView { float floats[]; };
layout(std430,binding=0) buffer IntView { int ints[]; };
这是合法的GLSL吗? opengl.org说不:
两个块不能使用相同的索引。
但是,我在GL 4.5 Core Spec或GLSL 4.50 Spec(或ARB_shader_storage_buffer_object extension description)中找不到这样的声明,我的NVIDIA驱动程序似乎编译了这样的代码而没有错误或警告。
答案 0 :(得分:4)
OpenGL规范是否明确禁止这样做?显然不是。或者至少,如果确实如此,我看不到在哪里。
但这并不意味着它将跨平台工作。在处理OpenGL时,最好采取保守的路径。
如果您需要将内存从一个表示“转换”到另一个表示,则应该使用单独的绑定点。它更安全。
现在有一些官方消息。我filed a bug on this issue,他们已经阅读并决定了一些事情。具体来说,结论是:
- 有单独的绑定命名空间:原子计数器,图像,纹理,统一缓冲区和SSBO。
- 我们不希望在除原子计数器之外的任何一个上允许别名,其中允许使用不同的偏移(例如,共享绑定)别名。
简而言之,不要这样做。希望GLSL规范在这方面得到澄清。
这在GLSL 4.5的修订版7中“已修复”:
对于多个统一块或多个缓冲区块使用相同的绑定编号是编译时或链接时错误。
我说“已修复”,因为您仍然可以通过glUniform/ShaderStorageBlockBinding
手动执行别名。并且规范没有说明这将如何正常工作。