2016-01-14 6 views
4

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

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 extension description) и мой NVIDIA Driver кажется компилировать такой код без ошибок и предупреждений.

ответ

4

Является ли спецификация OpenGL категорически запрещающей это? Очевидно нет. Или, по крайней мере, если это произойдет, я не вижу, где.

Но это не значит, что он будет работать на кросс-платформенной платформе. При работе с OpenGL всегда лучше придерживаться консервативного пути.

Если вам нужно «отличить» память от одного представления к другому, вы должны просто использовать отдельные точки привязки. Это безопаснее.


На данный момент есть официальное слово. I filed a bug on this issue, и они прочитали его и решили кое-что. В частности, вывод был:

  • Существуют отдельные пространства имен для связывания: атомных счетчиков, изображений, текстур, буферов, равномерных и SSBOs.
  • Мы не хотим разрешать наложение на любой из них, кроме атомных счетчиков, где разрешено использование псевдонимов с различными смещениями (например, разделение привязки).

Короче говоря, не делайте этого. Надеюсь, спецификация GLSL будет уточнена в этом отношении.


Это был «фиксированный» в пересмотре 7 из GLSL 4.5:

Это время компиляции или ошибка канального времени, чтобы использовать один и тот же связывание номер для более чем одной формы, блок или для нескольких блоков буфера.

Я говорю «исправлено», потому что вы все еще можете выполнять наложение псевдонимов вручную через glUniform/ShaderStorageBlockBinding. И в спецификации не сказано, как это будет работать точно.

+0

Ну, я хочу, чтобы сохранить точки привязки для реализаций с низким лимитом. Например, можно использовать один буфер/привязку как массив массивов динамического размера, предлагая различные представления в нем и получая доступ к неперекрывающимся частям с каждым представлением. – Nobody

+0

@Nobody: Хронос доложил об этом; см. добавление к моему сообщению. –

+0

Я не могу сказать многого против официального слова. Однако, насколько я понимаю, проблема сглаживания уже существует. В конце концов, это то, чем «ограничивается», не так ли? – Nobody