Законно ли повторно использовать привязки для нескольких блоков хранения шейдеров?

Предположим, что у меня есть один буфер хранения шейдера и я хочу иметь несколько представлений, например, так:

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, И в спецификации не сказано, как именно это будет работать.

Другие вопросы по тегам