Uniform 类型

每个 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

有时你可能希望在着色器代码中将 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;

带数组的结构化 Uniform

也可以在数组中管理 `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 ];