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

Is it legal to reuse Bindings for several Shader Storage Blocks

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

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

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

Two blocks cannot use the same index.

但是,我在 GL 4.5 Core Spec or GLSL 4.50 Spec (or the ARB_shader_storage_buffer_object extension description) 中找不到这样的语句,而且我的 NVIDIA 驱动程序似乎可以在没有错误或警告的情况下编译这样的代码。

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

但这并不意味着它会起作用 cross-platform。在处理 OpenGL 时,最好走保守的道路。

如果您需要 "cast" 从一种表示到另一种表示的记忆,您应该只使用单独的绑定点。更安全。


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

  • There are separate binding namespaces for: atomic counters, images, textures, uniform buffers, and SSBOs.
  • We don't want to allow aliasing on any of them except atomic counters, where aliasing with different offsets (e.g. sharing a binding) is allowed.

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


这是 GLSL 4.5 修订版 7 中的 "fixed":

It is a compile-time or link-time error to use the same binding number for more than one uniform block or for more than one buffer block.

我说 "fixed" 因为您仍然可以通过 glUniform/ShaderStorageBlockBinding 手动执行别名。规范并没有说明这将如何工作。