在“ Data Type (GLSL)”上的OpenGL Wiki页面上,我找到了有关初始化程序列表的广泛声明。
...因此,GLSL采用了C ++ 11的功能,并允许 使用初始化程序列表来初始化任何类型。一个 初始化程序列表是初始化程序列表(它们本身可以是 初始化程序列表),用于初始化变量。初始化器 列表以花括号(“ {”和“}”)为边界。
初始化程序列表不需要指定类型名称;的 编译器会正确推断出它。这个推论延伸到 聚集体中的对象层次结构(结构/数组)。例如, 上面的代码可以使用以下初始化程序列表进行初始化:
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 "::"
将结果与Wiki的以下几行进行对比:
编译器自动推断出每个元素的第二个元素 数据成员是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样式初始化器”,但只能在赋值中使用,并且其唯一目的是更明确地拒绝它。
答案 0 :(得分:3)
初始化器列表是OpenGL的更高版本。 Wiki指出,此功能是“自4.2版以来的核心功能”。我确保包括我的#version 330
语句,因为我确定初始化列表是GL 3.3之前的添加,并且直到我要提交问题之前,我什至没有对此提出质疑。我认为吸取了教训。