为多个着色器存储块重用绑定是否合法
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
手动执行别名。规范并没有说明这将如何工作。
假设我有一个着色器存储缓冲区,并希望对它有多个视图,例如像这样:
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
手动执行别名。规范并没有说明这将如何工作。