GLSL: Как правильно связать тысячи буферов?
Мне пришла в голову идея, которая требует привязки тысяч буферов (счетчиков атомов и хранилищ шейдеров) к одной программе GLSL. Сначала я проверил, имеет ли это смысл в ограничениях openGL, и это представляется возможным по двум причинам:
- На моем ноутбуке значения GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS и GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS составляют около 32 тыс. Таким образом, openGL позволяет мне связывать тысячи буферов за один проход.
openGL 4.4 предлагает:
void BindBuffersBase (enum target, uint first, sizei count, const uint * buffers);
В коде C это кажется простым, но я понятия не имею, как сделать мои шейдеры. При связывании индексированных буферов мы должны использовать:
layout (std430, binding = 0) buffer Objects
{
Object objects[];
};
При связывании пары буферов это нормально. Но в моем случае:
- Я не знаю заранее, сколько буферов будет связано
- Даже если бы я знал, я должен написать несколько строк кода для КАЖДОГО буфера и определить в привязке макета 0, 1, 2, ..., n?
Тогда возникает вопрос: существует ли способ, чтобы шейдер не знал о количестве буферов, которые будут с ним связаны? Предполагая, что они ВСЕ содержат данные одного типа.
Ответ:
Спасибо Andon M. Coleman за быстрые и четкие ответы.
Прежде всего, я ошибался, предполагая, что мое оборудование поддерживает тысячи привязок. Ошибки новичка, я взял определенное значение вместо времени выполнения.
На моей машине:
- GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96
- GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 8
- GL_MAX_UNIFORM_BUFFER_BINDINGS = 84
Что далеко от того, на чем я основывал свой вопрос.
Однако в шейдере есть возможность определить несколько буферов:
A
{
B b[];
}
layout (std430, binding = 0) buffer A a[32];
Количество максимальных привязок должно быть известно заранее, но эти буферы будут занимать привязки от 0 до 31.
1 ответ
Спасибо Andon M. Coleman за быстрые и четкие ответы.
Прежде всего, я ошибался, предполагая, что мое оборудование поддерживает тысячи привязок. Ошибки новичка, я взял определенное значение вместо времени выполнения.
На моей машине:
- GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96
- GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 8
- GL_MAX_UNIFORM_BUFFER_BINDINGS = 84
Что далеко от того, на чем я основывал свой вопрос.
Однако в шейдере есть возможность определить несколько буферов:
A
{
B b[];
}
layout (std430, binding = 0) buffer A a[32];
Количество максимальных привязок должно быть известно заранее, но эти буферы будут занимать привязки от 0 до 31.