Как получить правильный индекс массива ssbo при использовании multiDrawArraysIndirect? - PullRequest
0 голосов
/ 09 сентября 2018

В моем шейдере у меня есть ssbo, содержащий массив структур.

layout(std430, binding = 14) readonly buffer Block {
    Uniform uniform[];
};

Теперь я хочу использовать glDrawArraysIndirect и мне нужно передать индекс для ssbo с каждой командой рисования.

Я использую opengl версии 4.5, а расширение ARB_shader_draw не поддерживается.

Дополнительные проблемы заключаются в том, что я использую тройной буфер, поэтому мне нужно добавить смещение к текущей части буфера в индекс, и команды рисования не обязательно будут в том же порядке, что и структуры.в буфере есть.

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

1 Ответ

0 голосов
/ 09 сентября 2018

Если бы был простой способ обойти функциональность ARB_shader_draw_parameters ... функциональности не нужно было бы существовать.

Ближайшим приближением к ARB_shader_draw_parameters является использование индекса базового экземпляра в команде draw косвенной.Каждый генерируемый вами рисунок будет назначать себе базовый экземпляр, и этот индекс представляет индекс, используемый для индексации массива.

Конечно, ARB_shader_draw_parameters также обеспечивает доступ к значению gl_BaseInstanceARB, которое является полем базового экземпляра.из команды ничья.Это обеспечивает это, потому что gl_InstanceID не затронут базовым экземпляром.Базовый экземпляр влияет только на значение, извлеченное из экземпляров массивов вершинных шейдеров .

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

И поскольку вы не можете использовать gl_DrawIDARB, такое базовое значение экземпляра не будет гарантировано равным , динамически однородному .Таким образом, вы не можете использовать индекс или любые производные от него выражения для выполнения следующих операций:

  • Индексировать в массив сэмплеров или других непрозрачных типов.
  • Индексв массив интерфейсных блоков (не массив внутри блока. Массив самих блоков)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...