Я думаю, я понимаю, что вы пытаетесь спросить. Я предполагаю, что вашей главной заботой являются неоднородные переменные, определенные вне main()
:
float left;
float right;
float mscaled;
float xn;
float xm;
Давайте посмотрим, как работают GPU и GLSL. Графический процессор не имеет стека или записей активации вызова. В GLSL нет способа имитировать область видимости или локальные переменные, как это делает компилятор C на большинстве процессоров. Все, что существует, это регистры, которые являются либо унифицированными регистрами, входами, выходами каскада шейдера, и локальным файлом регистров, уникальным для этого вызова шейдера.
Другими словами, поскольку такой функции, как стек, куча, не существует, все объявленные где-либо переменные живут в регистре. Независимо от того, являются ли они локальными для некоторой области в GLSL или глобальными для всего файла, не имеет значения. Они просто регистры.
Однако распределитель регистров не является частью стандарта GLSL. Различные реализации OpenGL могут иметь разные уровни качества, когда дело доходит до преобразования высокоуровневого кода GLSL в низкоуровневый машинный код, который понимает графический процессор. Одна из более сложных частей компилятора (GLSL или иначе) - это распределение регистров . Это та часть компилятора, которая определяет, какие регистры занимает данная переменная. В C это немного сложнее, так как обычно приходится иметь дело с очень маленькими файлами регистров (особенно в x86), и он имеет дело с разливом регистров (перемещением переменных в стек) и псевдонимами (сохранение переменных обратно в RAM перед вызовом функций) и нечетные инструкции, требующие вывода в конкретном регистре (x86idiv
например). Графические процессоры имеют большой регистровый файл из-за отсутствия стека или кучи, поэтому распределитель может быть проще.
Тем не менее, файл реестра не является бесконечным. Если у вас больше переменных, чем регистров, поддерживаемых вашим оборудованием, компилятор должен попытаться поместить все ваши переменные в регистры. Это обычно требует некоторой формы проверки диапазона живучести. То есть, если вы используете переменную xn
для одного вычисления, а затем никогда не будете использовать ее снова, компилятор может определить это и затем узнать, что регистр, занятый этим, xn
может быть использован другой переменной позже, что позволяет использовать больше переменных, чем есть регистры (так долго поскольку не слишком много живых переменных одновременно).
Однако компилятор может этого не делать. Это не имеет. Или это может сделать это только в некоторых случаях. Области применения дают более простые компиляторы гораздо проще решить. Все регистры, выделенные локальным переменным функции, могут быть повторно использованы после выхода из этой функции, потому что она знает, что переменные мертвы. Глобальные переменные не имеют такой простой гарантии. Следовательно, некоторые менее способные компиляторы могут также не оптимизировать свои времена жизни, и глобальные переменные всегда будут поглощать регистр. Это не сделает ничего медленнее, но на некоторых драйверах это может ограничить размер шейдера, который вы можете написать.
В общем, я очень рекомендую хранить все переменные локализованными. Держите определение как можно ближе к использованию переменной, как это имеет смысл. Это относится ко всем языкам программирования, а не только к GLSL. Я также рекомендовал бы делать каждую «переменную» const в каждом возможном случае. Для некоторых менее способных компиляторов снова может быть указание на то, что определенные оптимизации возможны, и, что более важно, это делает ваш код более самодокументируемым и простым в обслуживании.
И, конечно же, вот ваш обязательный совет «просто профиль, чтобы проверить и узнать наверняка». Напишите свой шейдер с и без ваших глобалов и профилируйте его. Любой и все советы по производительности в сети должны быть недоверчивыми и предполагаться, что они либо основаны на предположениях, либо устарели.
main()
функцию? Являются ли ваши значения глобальными переменными (униформа или атрибуты на языке GLSL) или постоянными значениями?