Законно ли повторно использовать привязки для нескольких блоков хранения шейдеров?
Предположим, что у меня есть один буфер хранения шейдера и я хочу иметь несколько представлений, например, так:
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), и мой драйвер NVIDIA, похоже, компилирует такой код без ошибок или предупреждений.
1 ответ
Спецификация OpenGL прямо запрещает это? Очевидно нет. Или, по крайней мере, если это произойдет, я не вижу, где.
Но это не значит, что он будет работать кроссплатформенно. При работе с OpenGL всегда лучше идти по консервативному пути.
Если вам нужно "преобразовать" память из одного представления в другое, вам следует просто использовать отдельные точки привязки. Это безопаснее.
Есть какое-то официальное слово об этом сейчас. Я подал ошибку по этому вопросу, и они прочитали ее и решили некоторые вещи. В частности, был сделан вывод:
- Существуют отдельные пространства имен привязки для: атомных счетчиков, изображений, текстур, однородных буферов и SSBO.
- Мы не хотим разрешать псевдонимы ни на одном из них, кроме атомных счетчиков, где разрешен псевдоним с различными смещениями (например, совместное использование привязки).
Короче, не делай этого. Надеемся, что в этом отношении будет уточнена спецификация GLSL.
Это было "исправлено" в редакции 7 GLSL 4.5:
Это ошибка времени компиляции или соединения, когда используется один и тот же номер привязки для более чем одного унифицированного блока или для более чем одного буферного блока.
Я говорю "исправлено", потому что вы все еще можете выполнять псевдонимы вручную с помощью glUniform/ShaderStorageBlockBinding
, И в спецификации не сказано, как именно это будет работать.