На странице OpenGL Wiki в разделе " Тип данных (GLSL) " я нашел довольно широкое утверждение о списках инициализаторов.
... Следовательно, GLSL использует функцию из C ++ 11 и позволяет
инициализация любого типа с использованием списка инициализаторов.
список инициализаторов - это список инициализаторов (которые сами могут быть
списки инициализатора), которые используются для инициализации переменной. Initializer
списки ограничены фигурными скобками ("{" и "}").
Списки инициализаторов не требуют указания имени типа ;
компилятор выведет это правильно. И этот вывод распространяется вниз
иерархия объектов в агрегатах (структурах / массивах). Например,
приведенный выше код может быть инициализирован следующим списком инициализаторов:
Data dataArray [3] = {{...}, ...}
Я пробовал несколько вариантов списков инициализаторов, и я не уверен.
# version 330
vec4 by_return(void) { return {1.0}; } // unexpected '{', expecting "::"
vec4 by_decl(void) { vec4 x = {1}; return x; } // too little data in initialization
Хорошо, списки инициализаторов не эквивалентны конструкторам выведенного типа, например vec4(1.0)
...
vec4 by_decl(void) { vec4 x = {1,0,0,0}; return x; }
// OpenGL does not allow C style initializers
... но это спорный вопрос. На всякий случай, если «любой тип» был более широким, чем предполагалось, я попробовал вариант, в котором структура должна быть выведена во внешнем списке инициализатора, а другая - с явным конструктором, но с аргументами, заданными в виде списков инициализатора:
struct Dual { vec4 u, v; }
Dual struct_outer(void) { return {vec4(1,0,0,0), vec4(0,0,0,0)}; } // unexpected '{', expecting "::"
Dual struct_inner(void) { return Dual({1,0,0,0}, {0,0,0,0}); } // unexpected '{', expecting "::"
Сравните этот результат со следующими несколькими строками вики:
Компилятор автоматически определяет, что второй элемент каждого
Член данных является vec2. Это основано на определении данных.
Наконец, массивы не должны отличаться от структур, поэтому это не должно вызывать удивления:
vec4[2] as_array(void) { return {{1,0,0,0},{0,0,0,0}}; } // unexpected '{', expecting "::"
vec4[2] as_array2(void) { vec4 x[2] = {{1,0,0,0},{0,0,0,0}}; return x; }
// OpenGL does not allow C style initializers
vec4[2] as_array3(void) { return {vec4(1), vec4(1)}; } // unexpected '{', expecting "::"
vec4[2] as_array4(void) { return vec4[2]{vec4(1), vec4(1)}; } // unexpected '{', expecting "::"
vec4[2] as_array5(void) { vec4[2] x; x[0] = {1,0,0,0}; x[1] = {0,0,0,0}; return x; } // unexpected '{', expecting "::"
Из всего, что я видел до сих пор, похоже, что компилятор способен анализировать "инициализатор стиля C", но только в присваивании, и с единственной целью - отклонить его более явно.