2014-12-03 9 views
4

Многие статьи описывают с помощью атомных счетчиков путем указания точки привязки:Как я могу получить автоматические уникальные точки привязки счетчика атома (без жесткого кодирования)?

//Shader: 
layout(binding = 0, offset = 0) uniform atomic_uint myAtomicCounter; 

//App code 
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, myBufferHandle); 

Здесь, жестко связывающий точку binding = 0 задается как в затенении и коде приложения. Я предполагаю, что эти статьи сделать это таким образом, потому что,

Атомные счетчики не назначенную место и не может быть изменено с помощью Uniform* команд. Связи, смещения и шаги, принадлежащие атомным счетчикам программного объекта, являются недействительными, а новые назначаются после каждой успешной повторной ссылки. [shader_atomic_counters]

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

Атрибуты вершинного шейдера выглядят одинаково. Я могу принудительно привязать место привязки во время выполнения (glBindAttribLocation) до привязки шейдера или, альтернативно, OpenGL выбрать их для меня, а затем запросить результат (glGetAttribLocation). Я также могу выполнить поиск по всем атрибутам (glGetActiveAttrib).

Как я могу реализовать автоматические уникальные точки привязки для атомных счетчиков, поэтому они не жестко закодированы, и я могу смешивать шейдерный код?

Я вижу несколько способов это может быть возможно, еще с ограничением их не меняется после соединения:

  1. Не указывайте связывающую точку в затенении и пусть OpenGL выбрать один, связываясь , Я не знаю, сделает ли OpenGL это. Если это так, как вы запрашиваете, чтобы найти используемую точку привязки?
  2. Запросить шейдерные объекты перед связыванием, чтобы найти атомные счетчики. Затем дайте им уникальные места привязки, такие как glBindAttribLocation для атрибутов. Есть ли механизм для назначения точек привязки?
  3. Разбор всего кода шейдера, поиск атомных счетчиков и замена точек привязки с помощью уникальных индексов в самом коде шейдера, возможно, с использованием макросов #define. Последнее средство. Я действительно не хочу этого делать.

ответ

1

В пункте 1: параметр binding макета для атомных счетчиков не факультативно.

В точке 2: поскольку binding не является необязательным, нет смысла устанавливать его из кода OpenGL.

Таким образом, ваш единственный ресурс - это # ​​3.

0

Вы можете запросить атомные счетчики, используя glGetActiveUniform.Затем получить индекс буфера и, наконец, связывающую точку:

int atomicCounterIndex; 
glGetActiveUniformsiv(programId, count, index, 
     GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX, &atomicCounterIndex); 
glGetActiveAtomicCounterBufferiv(programId, atomicCounterIndex, 
     GL_ATOMIC_COUNTER_BUFFER_BINDING, &myBufferHandle) 

Это работает с OpenGL 4.2, как указано in the docs