结构体 struct
优质
小牛编辑
126浏览
2023-12-01
在着色器语言GLSL ES前面内容介绍过浮点数float
、整形数int
、三维向量vec3
、4x4矩阵mat4
等各种数据类型,关于结构体主要功能就是利用WebGL着色器已经提供的常见数据类型,自定义一个新的数据类型。
WebGL着色器语言中结构体和C语言类似,结构体是由多个同类或不同类的数据类型构成的一个集合。
// 首先定义一个结构体,也就是自定义一个数据类型
struct DirectionalLight {
vec3 direction;
vec4 color;
float shadowBias;
};
// 使用自定义的结构体,或者说使用自定义的数据类型DirectionalLight声明一个变量
uniform DirectionalLight dirLight;
struct
是声明结构体的关键字,DirectionalLight
是自定义结构体的名称,可以根据表达的含义自由命名,你可以把自定义的结构体DirectionalLight
理解为自定义的数据类型,自定义的数据类型DirectionalLight
就像浮点数float
、三维向量vec3
一样可以用来声明一个变量。
访问分量(点符号.
)
三维向量vec3
、4x4矩阵mat4
等数据类型可以通过点符号.
访问自身的变量或元素,对于结构体关键字struct
自定义的数据类型也一样可以通过点符号访问自身的变量或元素,你可把webgl着色器的结构体类比javascript的对象,对象可以通过点符号访问对象自身的属性。
vec3 dir = vec3(1.0,0.0,0.0);
dir.x = 100.0// x分量赋值
float x = dir.x;// 访问x分量,赋值给其它变量
struct DirectionalLight {
vec3 direction;
vec4 color;
};
uniform DirectionalLight dirLight;
// 结构体成员赋值
dirLight.color = vec4(0.8,0.6,0.1,1.0);
// 访问成员,赋值给其它变量
vec4 newcol = dirLight.color;
结构体uniform
变量数据传递
// 获得结构体位置
var lightColor = gl.getUniformLocation(program,'directionalLight.color');
// 结构体的一个属性传递数据
gl.uniform4f(lightColor, 1.0, 0.0, 1.0,0.7);