В последнее время я получаю
error C6020: Constant register limit exceeded at variable; more than 1024 registers needed to compile program
ошибки во время компиляции вершинного шейдера GLSL, вероятно, из-за количества однородных переменных, и я пытаюсь выяснить способ оценки / вычисления количества регистров, необходимых в шейдере, на основе определенных мною униформ. Есть ли для этого какое-нибудь руководство или правило?
Например, правильно ли я предполагаю, что для переменных размером до vec4 требуется 1 регистр, а для mat4 требуется 4 регистра? Есть ли для этого какие-то правила?
Скорее всего, вы пытаетесь отправить огромное количество данных униформе. Попробуйте вместо этого отправить свои данные в виде текстуры в сэмплер?
Возможно, это не проблема единого лимита, а слишком большая структура в вашем коде GLSL.
Его 100% из-за большого массива матриц mat4. Суть вопроса состоит в том, чтобы найти способ количественно оценить, насколько я близок / далек от ограничений, чтобы выяснить, какой подход я должен использовать для решения проблемы. Например, я заметил, что матрицы можно уменьшить до 3 vec4 вместо mat4. Это вообще поможет? Также, если я реализую UBO, заменяются ли мои текущие унифицированные переменные и массивы только одной униформой для UBO? Другими словами, до тех пор, пока не превышается максимальный размер буферизации, я могу включать в структуру все, что захочу.
Можете поделиться шейдером?
Эти комментарии помогли мне сузить проблему, поскольку в моем случае у меня был float4 morphedVerts [1023], который нарушал работу шейдера. При уменьшении его размера до 1000 ошибка исчезла и шейдер компилировался. Не совсем лучшее решение. Наверное, лучше переключиться на другие способы передачи данных, как сказал @derhass
... особенно желая избежать кошмаров, связанных с аппаратной зависимостью.
Графическое оборудование просто слишком разнообразно для такой оценки. Даже ваше, казалось бы, простое предположение:
variables up to vec4 in size require 1 register and mat4 require 4 registers?
Это неверно для многих современных устройств. Раньше было, но это было много лет назад. Особенно, если вы говорите об отдельных переменных uniform
; компиляторы могут играть с ними во всевозможные игры.
Не существует даже отдаленно точного способа оценить количество таких ресурсов, потребляемых частью кода GLSL. Вы можете подсчитать количество унифицированных компонентов, которые использует ваш код, но это потому, что OpenGL сообщает вам, как это сделать. Кроме этого, вы ничего не можете сделать.
Итак, эта ошибка - всего лишь указание на то, что вам нужно просто уменьшить равномерное потребление шейдера?
@GregK .: Кажется, это то, о чем он говорит.
Если вы достигли единого предела, компилятор / компоновщик должен сообщит вам об этом. В этом случае вы можете переключиться на UBO / SSBO / TBO, чтобы передать свои данные шейдеру. OpenGL не имеет понятия «регистры», а значит, и правил для этого. Вы столкнулись с некоторым ограничением, зависящим от реализации.