每个 uniform 都必须有一个 `value` 属性。其值的类型必须与 GLSL 代码中 uniform 变量的类型相对应,具体的 GLSL 基本类型对应关系见下表。Uniform 结构体和数组同样受支持。基本类型的 GLSL 数组必须指定为对应 THREE 对象的数组,或者包含所有对象数据的扁平数组。换言之,GLSL 基本类型本身不应再嵌套一层数组。此规则不具有传递性。例如,一个由 `vec2` 数组组成的数组,每个子数组包含五个向量,则必须是一个数组的数组,其中每个元素可以是五个 `Vector2` 对象或十个 `number`。
| GLSL 类型 | JavaScript 类型 |
|---|---|
| int | Number |
| uint | Number |
| float | Number |
| bool | Boolean |
| bool | Number |
| vec2 | Vector2 |
| vec2 | Float32Array (*) |
| vec2 | Array (*) |
| vec3 | Vector3 |
| vec3 | Color |
| vec3 | Float32Array (*) |
| vec3 | Array (*) |
| vec4 | Vector4 |
| vec4 | Quaternion |
| vec4 | Float32Array (*) |
| vec4 | Array (*) |
| mat2 | Float32Array (*) |
| mat2 | Array (*) |
| mat3 | Matrix3 |
| mat3 | Float32Array (*) |
| mat3 | Array (*) |
| mat4 | Matrix4 |
| mat4 | Float32Array (*) |
| mat4 | Array (*) |
| ivec2, bvec2 | Float32Array (*) |
| ivec2, bvec2 | Array (*) |
| ivec3, bvec3 | Int32Array (*) |
| ivec3, bvec3 | Array (*) |
| ivec4, bvec4 | Int32Array (*) |
| ivec4, bvec4 | Array (*) |
| sampler2D | Texture |
| samplerCube | CubeTexture |
(*) 对于相同 GLSL 类型的(最内层)数组(维度)同样适用,其中包含数组中所有向量或矩阵的分量。
有时你可能希望在着色器代码中将 uniform 组织为 `struct`(结构体)。必须使用以下方式,`three.js` 才能正确处理结构化的 uniform 数据。
uniforms = {
data: {
value: {
position: new Vector3(),
direction: new Vector3( 0, 0, 1 )
}
}
};
此定义可以映射到以下 GLSL 代码:
struct Data {
vec3 position;
vec3 direction;
};
uniform Data data;
也可以在数组中管理 `structs`。此用法的语法如下:
const entry1 = {
position: new Vector3(),
direction: new Vector3( 0, 0, 1 )
};
const entry2 = {
position: new Vector3( 1, 1, 1 ),
direction: new Vector3( 0, 1, 0 )
};
uniforms = {
data: {
value: [ entry1, entry2 ]
}
};
此定义可以映射到以下 GLSL 代码:
struct Data {
vec3 position;
vec3 direction;
};
uniform Data data[ 2 ];