目录
5.4 构造器(构造函数)
构造函数使用函数调用语法,其中函数名称是基本类型关键字或结构名称,以生成在初始化程序或表达式中使用的所需类型的值。 (有关详细信息,请参见第9节“着色语言语法”。)参数用于初始化构造的值。
构造函数可用于请求数据类型转换从一种标量类型更改为另一种标量类型,或者用较小类型构建较大类型,或将较大类型减少为较小类型。
没有固定的构造函数原型列表。 构造函数不是内置函数。 从语法上讲,所有词法正确的参数列表都是有效的。 从语义上讲,参数的数量必须足够大并且类型正确才能执行初始化。 不允许将包含数组的未订阅数组和结构作为构造函数的参数。 参数从左到右进行评估。 向构造函数包含这么多参数是错误的,它们不能全部使用。 详细规则如下。 下面实际列出的原型仅仅是示例的一个子集
5.4.1 转换和标量构造器
在标量类型之间进行转换,如以下原型所示:
int (bool) //将布尔型值转换成整数
int (float) //将浮点数值转换成整数
float (bool) //将布尔型值转换成浮点数
float(int) //将整型值转换成浮点数
bool(int) //将整数值转换成布尔型值
bool(float) //将浮点数值转换成布尔型值
当构造器将一个float转换成int时,浮点数的小数部分将被自动舍弃掉.
当int和float转换成bool时,0和0.0被转换成false,非0值将被转换成true.当构造器将bool值转换成int或float时,false被转换成0或0.0, true被转换成1或1.0.
等价构造器,如float(float)也是合法的,但很少使用到.
如果构造器的参数不是标量,如向量,那么构造器将取其第一个元素.如float (vec3)构造器将取vec3中的第一个值.
5.4.2向量和矩阵构造器
构造器也可以用来从标量集合,向量,矩阵中创建向量和矩阵.同时可以缩短向量长度.
如果使用一个单一的标量来初始化向量,那么向量的所有值均使用该值进行初始化.如果使用一个单一的标量来初始化矩阵,那么矩阵的对角线的所有元素均会被初始化为该值,但其他元素将会被初始化为0.0
如果一个向量通过多个标量,向量或矩阵或这几种的混合来构造,那么向量的元素将按照参数列表的顺序来初始化.构造器将从参数列表中按从左到右的顺序去取参数,如果参数有多个值,那么再依次从这个参数中将值取出.构造矩阵也是类似的.矩阵元素将按照列为主要顺序来构造.构造器将依次从参数列表中取出参数值来构造矩阵的元素.如果参数列表中的值的个数超过矩阵或向量的元素个数的话,将会引起错误.
如果使用一个矩阵来构造矩阵的话,那么,参数矩阵中的元素值将放置到新矩阵的相应位置.
如果基本类型(int , float, bool)作为参数传进构造器,但是要构造的元素类型和传进来的数据类型不同,那么将会使用类型转换.
一些有用的向量构造函数如下:
vec3(float) // 使用float初始化每个组件
vec4(ivec4) // 使用组件转换制作vec4
vec2(float, float) //使用2个浮点数初始化vec2
ivec3(int, int, int) //用3个整数初始化一个ivec3
bvec4(int, int, float, float) // 使用4个布尔转换
vec2(vec3) // 放弃vec3的第三个组成部分
vec3(vec4) // 放下vec4的第四个组成部分
vec3(vec2, float) // vec3.x = vec2.x, vec3.y = vec2.y, vec3.z = float
vec3(float, vec2) // vec3.x = float, vec3.y = vec2.x, vec3.z = vec2.y
vec4(vec3, float)
vec4(float, vec3)
vec4(vec2, vec2)
栗子:
vec4 color = vec4(0.0, 1.0, 0.0, 1.0);
vec4 rgba = vec4(1.0); // 将每个组件设置为1.0
vec3 rgb = vec3(color); // 舍弃第四个组件
要初始化矩阵的对角线,并将所有其他元素设置为零:
mat2(float)
mat3(float)
mat4(float)
通过为mat2,mat3和mat4分别指定向量或所有4,9或16个浮点数来初始化矩阵。 浮点数按列主要顺序分配给元素。
mat2(vec2, vec2);
mat3(vec3, vec3, vec3);
mat4(vec4, vec4, vec4, vec4);
mat2(float, float,
float, float);
mat3(float, float, float,
float, float, float,
float, float, float);
mat4(float, float, float, float,
float, float, float, float,
float, float, float, float,
float, float, float, float);
只要存在足够的组件来初始化矩阵,就存在各种其他可能性。
5.4.3结构体构造器
一旦结构体被定义,并给了一个类型名,那么和其同名的构造器就可以使用了.
struct light {
float intensity;
vec3 position;
};
light lightVar = light(3.0, vec3(1.0, 2.0, 3.0));
传进构造器的参数必须和结构体里面声明的具有相同的顺序和类型.
结构体构造器可以用于初始化器或者用在表达式中.
版权:https://blog.csdn.net/flycatdeng/article/details/88984459