Отправка целого числа в шейдер без использования униформы?

#opengl-es

#opengl-es

Вопрос:

Я планирую исключить все вызовы glUniform из моих GLSL-шейдеров, чтобы сэкономить затраты на переключение состояний. Для этой цели я планирую использовать UBO, который постоянно привязан к шейдеру. Разные вызовы рисования используют разные части UBO (это в основном массив). Чтобы указать вызову рисования, какую запись использовать, я должен отправить целое число в шейдеры вершин / фрагментов. Проблема в том, что в системе, которую я должен использовать, даже выполнение одного вызова glUniform приведет к дорогостоящему обновлению состояния, поэтому я вообще не могу использовать glUniform.

Знаете ли вы решение, которое будет работать на GLES 3.1 и которое будет работать на GLES 2?

Насколько я знаю, у GLES еще нет вызовов glMulti *, а базовая вершина только с 3.2 и выше. И добавление другого атрибута вершины может быть дорогостоящим.

Комментарии:

1. Для меня это звучит как случай решения неправильной проблемы. Униформа должна быть дешевой, в этом ее смысл. Структура, которая делает единую униформу неприемлемо дорогой, сильно нарушена — решите эту проблему, а не работайте над ее решением. В какой-то момент вам понадобится униформа.

2. Как я уже говорил, графический драйвер, который я должен использовать, имеет фиксированные накладные расходы, которые возникают, если я обновляю хотя бы одну униформу перед вызовом draw. Единственный способ обойти это, согласно производителю, — вообще не вызывать glUniform и вместо этого использовать UBOs.

3. Я думал, что объекты унифицированного буфера даже не существуют на GLES 2.

4. Я знаю. Я должен разработать для 3.1 с опцией для 2. Таким образом, я сначала пытаюсь решить проблему с индексом, а затем проблему с заменой.

5. «Как я уже говорил …» ну, вы заявили, что переключение состояний было дорогостоящим, а не то, что проблема была в графическом драйвере. Проблема могла быть, например, в игровом движке.