Могут ли шейдерные компиляторы OpenGL оптимизировать выражения для униформ?

У меня есть шейдер OpenGL ES с несколькими формами. Я делаю математику с униформой в моем фрагментном шейдере. Будет ли компилятор шейдера оптимизировать эти выражения в униформе, чтобы они встречались один раз, а не на каждом пикселе? Или я должен сделать вычисления вне шейдера и передать результаты?

В частности, у меня есть три одинаковые координаты, которые я передаю в шейдер:

uniform vec2 u_a;
uniform vec2 u_b;
uniform vec2 u_c;

И затем я вычисляю некоторые векторы среди этих точек:

vec2 v0 = u_c - u_a;
vec2 v1 = u_b - u_a;

Мне любопытно, может ли компилятор шейдера оптимизировать их так, чтобы они выполнялись один раз за рендеринг, или мне следует вычислить их вне шейдера и передать в качестве дополнительной униформы. Конечно, для оптимизации я должен действительно измерить вещи, чтобы найти разницу в моей конкретной ситуации (поскольку GPU мог бы делать это быстрее на каждом пикселе, чем мой процессор), но меня интересует, какой объем имеют шейдерные компиляторы для оптимизация, как это в целом.

Бонусные баллы, если вы знаете, что шейдерные компиляторы на устройствах Android / iPhone могут вести себя по-разному, или если разные версии GLSL имеют значение.

1 ответ

Решение

Может ли компилятор оптимизировать это? Да, это возможно. Будет ли это? Вероятно, нет, так как это потребует значительных накладных расходов при начале рендеринга объекта (они должны предварительно вычислить все предварительно вычисляемые вещи для шейдеров).

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