Le uniform sono delle variabili GLSL globali. Vengono passate ai programmi shader.
Quando si dichiara una uniform di uno [page:ShaderMaterial], viene dichiarata per valore o per oggetto.
uniforms: {
time: { value: 1.0 },
resolution: new Uniform( new Vector2() )
};
Ogni uniform deve avere una proprietà `value`. Il tipo di value deve corrispondere al tipo della variabile uniform nel codice GLSL come specificato per i tipi primitivi GLSL nella tabella sotto. Anche le strutture uniform e gli array sono supportati. Gli array GLSL di tipo primitivo devono essere specificati come un array del corrispondente oggetto THREE o come un array flat contenente i dati di tutti gli oggetti. In altre parole; le primitive GLSL negli array non devono essere rappresentate dagli array. Questa regola non si applica in modo transitivo. Un array di array `vec2`, ciascuno con una lunghezza di cinque vettori, deve essere un array di array, di cinque oggetti [page:Vector2] o di dieci `numeri`.
GLSL type | JavaScript type |
---|---|
int | [page:Number] |
uint (WebGL 2) | [page:Number] |
float | [page:Number] |
bool | [page:Boolean] |
bool | [page:Number] |
vec2 | [page:Vector2 THREE.Vector2] |
vec2 | [page:Float32Array Float32Array] (*) |
vec2 | [page:Array Array] (*) |
vec3 | [page:Vector3 THREE.Vector3] |
vec3 | [page:Color THREE.Color] |
vec3 | [page:Float32Array Float32Array] (*) |
vec3 | [page:Array Array] (*) |
vec4 | [page:Vector4 THREE.Vector4] |
vec4 | [page:Quaternion THREE.Quaternion] |
vec4 | [page:Float32Array Float32Array] (*) |
vec4 | [page:Array Array] (*) |
mat2 | [page:Float32Array Float32Array] (*) |
mat2 | [page:Array Array] (*) |
mat3 | [page:Matrix3 THREE.Matrix3] |
mat3 | [page:Float32Array Float32Array] (*) |
mat3 | [page:Array Array] (*) |
mat4 | [page:Matrix4 THREE.Matrix4] |
mat4 | [page:Float32Array Float32Array] (*) |
mat4 | [page:Array Array] (*) |
ivec2, bvec2 | [page:Float32Array Float32Array] (*) |
ivec2, bvec2 | [page:Array Array] (*) |
ivec3, bvec3 | [page:Int32Array Int32Array] (*) |
ivec3, bvec3 | [page:Array Array] (*) |
ivec4, bvec4 | [page:Int32Array Int32Array] (*) |
ivec4, bvec4 | [page:Array Array] (*) |
sampler2D | [page:Texture THREE.Texture] |
samplerCube | [page:CubeTexture THREE.CubeTexture] |
(*) Lo stesso per un array (dimensione) (più interno) dello stesso tipo GLSL, contenente i componenti di tutti i vettori o le matrici nell'array.
A volte vuoi organizzare le uniform come `structs` nel tuo codice shader. È necessario utilizzare lo stile seguente in modo che three.js sia in grado di elaborare dati strutturati uniform.
uniforms = {
data: {
value: {
position: new Vector3(),
direction: new Vector3( 0, 0, 1 )
}
}
};
Questa definizione può essere mappata con il seguente codice GLSL:
struct Data {
vec3 position;
vec3 direction;
};
uniform Data data;
È anche possibile gestire `structs` negli array. La sintassi per questo caso d'uso appare così:
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 ]
}
};
Questa definizione può essere mappata con il seguente codice GLSL:
struct Data {
vec3 position;
vec3 direction;
};
uniform Data data[ 2 ];
value -- Un oggetto contenente il valore per impostare la uniform. Il suo tipo deve essere uno dei tipi uniform descritti sopra.
Il valore corrente della uniform.
Restituisce un clone della uniform.
Se il valore della proprietà uniform è un [page:Object] con un metodo clone(), viene utilizzato, altrimenti il valore è copiato per assegnazione.
I valori dell'array sono condivisi tra le [page:Uniform] clonate.
[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]