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