Оценить количество регистров, необходимых в шейдере GLSL

В последнее время я получаю

error C6020: Constant register limit exceeded at variable; more than 1024 registers needed to compile program

ошибки во время компиляции вершинного шейдера GLSL, вероятно, из-за количества однородных переменных, и я пытаюсь выяснить способ оценки / вычисления количества регистров, необходимых в шейдере, на основе определенных мною униформ. Есть ли для этого какое-нибудь руководство или правило?

Например, правильно ли я предполагаю, что для переменных размером до vec4 требуется 1 регистр, а для mat4 требуется 4 регистра? Есть ли для этого какие-то правила?

Если вы достигли единого предела, компилятор / компоновщик должен сообщит вам об этом. В этом случае вы можете переключиться на UBO / SSBO / TBO, чтобы передать свои данные шейдеру. OpenGL не имеет понятия «регистры», а значит, и правил для этого. Вы столкнулись с некоторым ограничением, зависящим от реализации.

derhass 10.08.2018 14:09

Скорее всего, вы пытаетесь отправить огромное количество данных униформе. Попробуйте вместо этого отправить свои данные в виде текстуры в сэмплер?

Reza Hajianpour 10.08.2018 17:29

Возможно, это не проблема единого лимита, а слишком большая структура в вашем коде GLSL.

Ripi2 10.08.2018 18:19

Его 100% из-за большого массива матриц mat4. Суть вопроса состоит в том, чтобы найти способ количественно оценить, насколько я близок / далек от ограничений, чтобы выяснить, какой подход я должен использовать для решения проблемы. Например, я заметил, что матрицы можно уменьшить до 3 vec4 вместо mat4. Это вообще поможет? Также, если я реализую UBO, заменяются ли мои текущие унифицированные переменные и массивы только одной униформой для UBO? Другими словами, до тех пор, пока не превышается максимальный размер буферизации, я могу включать в структуру все, что захочу.

Greg K. 10.08.2018 19:29

Можете поделиться шейдером?

geza 11.08.2018 12:06

Эти комментарии помогли мне сузить проблему, поскольку в моем случае у меня был float4 morphedVerts [1023], который нарушал работу шейдера. При уменьшении его размера до 1000 ошибка исчезла и шейдер компилировался. Не совсем лучшее решение. Наверное, лучше переключиться на другие способы передачи данных, как сказал @derhass

SteakOverflow 16.07.2020 12:55

... особенно желая избежать кошмаров, связанных с аппаратной зависимостью.

SteakOverflow 16.07.2020 13:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
7
620
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Графическое оборудование просто слишком разнообразно для такой оценки. Даже ваше, казалось бы, простое предположение:

variables up to vec4 in size require 1 register and mat4 require 4 registers?

Это неверно для многих современных устройств. Раньше было, но это было много лет назад. Особенно, если вы говорите об отдельных переменных uniform; компиляторы могут играть с ними во всевозможные игры.

Не существует даже отдаленно точного способа оценить количество таких ресурсов, потребляемых частью кода GLSL. Вы можете подсчитать количество унифицированных компонентов, которые использует ваш код, но это потому, что OpenGL сообщает вам, как это сделать. Кроме этого, вы ничего не можете сделать.

Итак, эта ошибка - всего лишь указание на то, что вам нужно просто уменьшить равномерное потребление шейдера?

Greg K. 18.08.2018 16:01

@GregK .: Кажется, это то, о чем он говорит.

Nicol Bolas 18.08.2018 16:02

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