Униформы являются глобальными GLSL переменными. Они передаются в шейдерные программы.
При объявлении формы ShaderMaterial она объявляется по значению или по объекту.
uniforms: {
time: { value: 1.0 },
resolution: new Uniform(new Vector2())
};
Каждая униформа должна иметь свойство value. Тип значения должен соответствовать типу однородной переменной в коде GLSL, как указано для примитивных типов GLSL в таблице ниже. Также поддерживаются унифицированные структуры и массивы. Массивы GLSL примитивного типа должны быть заданы либо как массив соответствующих объектов v3d, либо как плоский массив, содержащий данные всех объектов. Другими словами, GLSL-примитивы в массивах не должны быть представлены массивами. Это правило не применяется транзитивно. Массив массивов vec2, каждый из которых имеет длину пять векторов, должен быть массивом массивов, состоящим либо из пяти объектов Vector2, либо из десяти number.
GLSL type | JavaScript type |
---|---|
int | Number |
uint (WebGL 2) | Number |
float | Number |
bool | Boolean |
bool | Number |
vec2 | v3d.Vector2 |
vec2 | Float32Array (*) |
vec2 | Array (*) |
vec3 | v3d.Vector3 |
vec3 | v3d.Color |
vec3 | Float32Array (*) |
vec3 | Array (*) |
vec4 | v3d.Vector4 |
vec4 | v3d.Quaternion |
vec4 | Float32Array (*) |
vec4 | Array (*) |
mat2 | Float32Array (*) |
mat2 | Array (*) |
mat3 | v3d.Matrix3 |
mat3 | Float32Array (*) |
mat3 | Array (*) |
mat4 | v3d.Matrix4 |
mat4 | Float32Array (*) |
mat4 | Array (*) |
ivec2, bvec2 | Float32Array (*) |
ivec2, bvec2 | Array (*) |
ivec3, bvec3 | Int32Array (*) |
ivec3, bvec3 | Array (*) |
ivec4, bvec4 | Int32Array (*) |
ivec4, bvec4 | Array (*) |
sampler2D | v3d.Texture |
samplerCube | v3d.CubeTexture |
(*) То же самое для внутреннего(innermost) массива размерности (dimension) того же типа GLSL, содержащего компоненты всех векторов или матриц в массиве.
Иногда вы хотите организовать униформы как структуры в коде шейдера. Чтобы Verge3D мог обрабатывать структурированные данные униформы, необходимо использовать следующий стиль.
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];
value — Объект, содержащий значение для настройки униформы. Его тип должен быть одним из типов униформы, описанных выше.
Текущее значение униформы.
Возвращает клон данной униформы
Если свойство value униформы является Object с методом clone(), то используется этот метод, в противном случае значение копируется путем присваивания.
Значения массива разделяются между клонированными Uniforms.
О том как получить исходный код этого модуля читайте тут.