Uniform - Руководство по Вердж3Д - Софт Эйт Софт
Description: Узнайте как использовать Uniform в интерактивных 3Д-веб-приложениях сделанных на Вердж3Д

# Uniform

Униформы являются глобальными 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 | Integer
uint (WebGL 2) | Integer
float | Float
bool | Boolean
bool | Integer
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, содержащего компоненты всех векторов или матриц в массиве.

## Структурированные униформы

Иногда вы хотите организовать униформы как `структуры` в коде шейдера. Чтобы «Вердж3Д» мог обрабатывать структурированные данные униформы, необходимо использовать следующий стиль.

`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];`

## Конструктор

### Uniform(value : Object)

value — объект, содержащий значение для настройки униформа. Его тип должен быть одним из типов униформа, описанных выше.

## Свойства

### # .value : Object

Текущее значение униформа.

## Методы

### # .clone() → Uniform

Возвращает клон данного униформа. Если свойство value униформа является объектом с методом clone(), то используется этот метод, в противном случае значение копируется путем присваивания. Значения массива разделяются между клонированными униформами.

## Исходный файл

О том как получить исходный код этого модуля читайте тут.