Многие статьи описывают с помощью атомных счетчиков путем указания точки привязки:Как я могу получить автоматические уникальные точки привязки счетчика атома (без жесткого кодирования)?
//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
).
Как я могу реализовать автоматические уникальные точки привязки для атомных счетчиков, поэтому они не жестко закодированы, и я могу смешивать шейдерный код?
Я вижу несколько способов это может быть возможно, еще с ограничением их не меняется после соединения:
- Не указывайте связывающую точку в затенении и пусть OpenGL выбрать один, связываясь , Я не знаю, сделает ли OpenGL это. Если это так, как вы запрашиваете, чтобы найти используемую точку привязки?
- Запросить шейдерные объекты перед связыванием, чтобы найти атомные счетчики. Затем дайте им уникальные места привязки, такие как
glBindAttribLocation
для атрибутов. Есть ли механизм для назначения точек привязки? - Разбор всего кода шейдера, поиск атомных счетчиков и замена точек привязки с помощью уникальных индексов в самом коде шейдера, возможно, с использованием макросов
#define
. Последнее средство. Я действительно не хочу этого делать.