Нужно ли инициализировать глобальные константы с помощью константных выражений? - PullRequest
0 голосов
/ 03 октября 2019

Поскольку GLSL 4.20 const -квалифицированные переменные больше не должны инициализироваться константными выражениями. Но когда я на самом деле пытаюсь определить глобальную const -качественную переменную, инициализированную неконстантным выражением, Mesa выдает ошибку. Вот пример кода:

#version 420
uniform vec2 v;
const float x=v.x;

out vec4 color;
void main()
{
    color=vec4(x,v.y,0,1);
}

Вот как я тестирую компиляцию (чтобы избежать любого кода OpenGL):

$ glsl_compiler --version 420 test.frag 
Info log for test.frag:
0:3(15): error: initializer of const variable `x' must be a constant expression

Если я переместу строку const float x=v.x; в функцию mainbody, компиляция завершается успешно.

OTOH, драйвер nvidia, будучи (как обычно) гораздо более разрешающим, принимает исходный код без предупреждений.

Итак, GLSL 4.20+ фактически запрещает непостоянный- выражение инициализаторов const - квалифицированных переменных в глобальной области видимости, или эта ошибка является ошибкой Mesa?

1 Ответ

2 голосов
/ 03 октября 2019

Все версии GLSL запрещают инициализировать квалифицированную глобальную переменную const чем-либо, кроме константного выражения (или для связанного с SPIR-V GLSL, выражения, включающего константные выражения и константы специализации).

Единственное, что изменилось в 4.20 относительно этого, было то, что ранее любая не параметрическая переменная, объявленная const, была ограничена инициализацией константными выражениями. 4.20 допускает, чтобы локальные переменные функции были const при инициализации с помощью неконстантных выражений. Но это все.

По сути, глобальные const переменные в GLSL подобны переменным C ++ 11 constexpr. Локальные const переменные похожи на C ++ const переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...