4

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

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 扩展描述)中找不到这样的语句,我的 NVIDIA 驱动程序似乎编译这样的代码没有错误或警告。

4

1 回答 1

4

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

但这并不意味着它可以跨平台工作。在处理 OpenGL 时,总是最好采取保守的方式。

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


现在有一些官方说法。我在这个问题上提交了一个错误,他们已经阅读并决定了一些事情。具体来说,结论是:

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

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


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

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

我说“固定”是因为您仍然可以通过glUniform/ShaderStorageBlockBinding. 规范并没有说明这将如何工作。

于 2016-01-14T15:50:42.880 回答