GLSL: Как правильно связать тысячи буферов?

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

  1. На моем ноутбуке значения GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS и GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS составляют около 32 тыс. Таким образом, openGL позволяет мне связывать тысячи буферов за один проход.
  2. openGL 4.4 предлагает:

    void BindBuffersBase (enum target, uint first, sizei count, const uint * buffers);

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

layout (std430, binding = 0) buffer Objects
{
  Object objects[];
};

При связывании пары буферов это нормально. Но в моем случае:

  1. Я не знаю заранее, сколько буферов будет связано
  2. Даже если бы я знал, я должен написать несколько строк кода для КАЖДОГО буфера и определить в привязке макета 0, 1, 2, ..., n?

Тогда возникает вопрос: существует ли способ, чтобы шейдер не знал о количестве буферов, которые будут с ним связаны? Предполагая, что они ВСЕ содержат данные одного типа.

Ответ:

Спасибо Andon M. Coleman за быстрые и четкие ответы.

Прежде всего, я ошибался, предполагая, что мое оборудование поддерживает тысячи привязок. Ошибки новичка, я взял определенное значение вместо времени выполнения.

На моей машине:

  1. GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96
  2. GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 8
  3. GL_MAX_UNIFORM_BUFFER_BINDINGS = 84

Что далеко от того, на чем я основывал свой вопрос.

Однако в шейдере есть возможность определить несколько буферов:

A
{
  B b[];
}
layout (std430, binding = 0) buffer A a[32];

Количество максимальных привязок должно быть известно заранее, но эти буферы будут занимать привязки от 0 до 31.

1 ответ

Решение

Спасибо Andon M. Coleman за быстрые и четкие ответы.

Прежде всего, я ошибался, предполагая, что мое оборудование поддерживает тысячи привязок. Ошибки новичка, я взял определенное значение вместо времени выполнения.

На моей машине:

  1. GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96
  2. GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 8
  3. GL_MAX_UNIFORM_BUFFER_BINDINGS = 84

Что далеко от того, на чем я основывал свой вопрос.

Однако в шейдере есть возможность определить несколько буферов:

A
{
  B b[];
}
layout (std430, binding = 0) buffer A a[32];

Количество максимальных привязок должно быть известно заранее, но эти буферы будут занимать привязки от 0 до 31.

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