GLSL поддерживает инициализаторы в стиле C или нет? - PullRequest
0 голосов
/ 29 августа 2018

На странице 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", но только в присваивании, и с единственной целью - отклонить его более явно.

1 Ответ

0 голосов
/ 29 августа 2018

Списки инициализаторов являются более поздним дополнением к OpenGL. Вики отмечают, что эта функция является «ядром с версии 4.2». Я удостоверился, что включил свое заявление #version 330, потому что я был настолько уверен, что списки инициализаторов были более ранним дополнением, чем GL 3.3, и я даже не сомневался в этом до того момента, как собирался представить вопрос. Думаю, урок выучен.

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