This article relates to the game "Dota 2". Click here for more information.
This article relates to the SDK/Workshop Tools for "Dota 2 Workshop Tools". Click here for more information.
This article's documentation is for Source 2. Click here for more information.

Динамические выражения материала

From Valve Developer Community
Jump to: navigation, search

English (en)русский (ru)
... Icon-Important.png

Динамические выражения материала могут использоваться для процедурной анимации параметра материала с течением времени или для управления им различными значениями, предоставленными игровым кодом, чтобы материал представлял определенное игровое состояние.

Добавление нового динамического выражения в Material Editor

1. Нажмите на маленькую кнопку-треугольник справа от параметра материала:
Dynamic material expression 1.png

2. В открывшемся диалоговом окне введите свое выражение. Простой пример того, что может быть: 0.5 * sin( 2*time() ) + 0.5. Параметр будет плавно переключался между 0 и 1.

3. Чтобы редактировать существующее динамическое выражение, нажмите на кнопку f(x).
Dynamic material expression 2.png

4. Для удаления динамического выражения из параметров материала откройте диалоговое окно редактирования выражения и очистите поле для редактирования.

Динамическое выражение на параметрах текстуры против других параметров

Важно понимать разницу между параметрами текстуры и другими параметрами, такими как "Color Tint" и скалярными параметрами с ползунками в пользовательском интерфейсе: параметр "Color Tint" передает числовое значение шейдеру, которое можно динамически вычислить с помощью выражения материала, пример которого в разделе выше. Параметр текстуры передает карту текстуры в шейдер, поэтому, если вы попытаетесь добавить выражение, которое вычисляет значение цвета для параметра текстуры, оно не будет работать.

Динамические выражения для параметров текстуры предназначены только для расширенного использования: эти выражения должны ссылаться на атрибут, предоставленный игровым кодом, который указывает на текстуру.

Справочник по Динамическим выражениям

Выражения материала выглядят очень похоже на код HLSL. Выражения могут иметь одну из двух основных структур

Простое встроенное выражение, это всего лишь одно математическое выражение. Примеры:

sin(SomeAttribute)
10 + sqrt( 2 ) * frac( time() )

Выражения также могут состоять из нескольких промежуточных выражений, каждое из которых вычисляет временное значение, за которым следует возвращаемое выражение, использующее промежуточные значения. Пример:

tempVar1 = sin(SomeAttribute); tempVar2 = exists(SomeOtherAttribute) ? float4( 1, 2, 3, 4 ) : float4( 5, 6, 7, 8 ); tempVar3 = cos(tempVar1) return tempVar1 + dot4( tempVar2, SomeThirdAttribute.xyzz ) * tempVar3;


Идентификаторы

Идентификаторы в выражениях могут ссылаться либо на промежуточные значения, хранящиеся в локальных переменных (например, tempVar1 в примере выше), либо на атрибуты, предоставляемые игровым кодом (например, SomeAttribute в примере выше), Если идентификатор не является локальной переменной, предполагается, что он снабжен игровым кодом.

Если выражение опирается на значение, предоставленное игровым кодом, но код не предоставляет его, оценка выражения молча завершится ошибкой, и значение параметра с выражением вернется к значению, установленному для параметра в материале..


Типы данных

Внутренним типом для вычислений является float4, все преобразуется внутри четырехкомпонентного типа с плавающей запятой путем смазывания последнего указанного компонента в оставшиеся.

Примеры:

3.5 становится (3.5, 3.5, 3.5, 3.5)

float2( 1, 2 ) становится (1, 2, 2, 2)

float3( 1, 2, 3 ) становится (1, 2, 3, 3)

vSomeVector.xyz становится vSomeVector.xyzz

vVec3.zx становится vVec3.zxxx

Любая скалярная функция применяется ко всем четырем компонентам входных векторов. Любая функция, которая возвращает скалярный результат, выдаст одинаковый результат всем четырем компонентам.


Операторы

Поддерживаемые операторы в порядке приоритета:

Оператор Описание
01 function call
02 ()
03 . для swizzles, например .xyxy
04 ! - важно, отрицание
05 * / % умножить, разделить, по модулю
06 + - сложение, вычитание
07 < > <= >= сравнения
08 == != равенство, неравенство
09 && логическое И. Ленивая оценка, как в C.
10 || логическое ИЛИ. Ленивая оценка, как в C.
11 ?: условно. Ленивая оценка: оценивается только подвыражение, обозначенное предикатом.
12 = назначение


Встроенные функции

Все функции принимают float4() в качестве параметров. Все скалярные операции будут применены ко всем четырем компонентам ввода. Например, sin(vSomeVector) вычислит выходной вектор (sin(vSomeVector.x), sin(vSomeVector.y), sin(vSomeVector.z), sin(vSomeVector.w))

Функция Описание
exists(x) возвращает 1, если атрибут с именем x существует, 0 в противном случае
sin(x)
cos(x)
tan(x)
frac(x) дробная часть каждого значения с плавающей запятой
floor(x) возвращает наибольшее значение int, которое меньше x
ceil(x) возвращает наименьшее значение int, которое больше x
saturate(x) зажимы x между 0 и 1
clamp(x, min, max) зажимы x между min и max
lerp(a, b, t) линейно интерполирует t между a и b (возвращает a для t=0 и b для t=1)
dot4(v0, v1) четырехкомпонентный точечный продукт
dot3(v0, v1) трехкомпонентный точечный продукт
dot2(v0, v1) двухкомпонентный точечный продукт
log(x)
log2(x)
log10(x)
exp(x)
exp2(x)
sqrt(x)
rsqrt(x) 1/sqrt(x)
sqr(x) возвращает x*x
sign(x)
abs(x)
pow(x, y)
step(a, b) если ( a >= b ), вернуть 1; Иначе вернуть 0;
smoothstep( a, b, t ) вернёт 0 для t==a, 1 для t==b, плавно интерполировать, используя кубический полином для 0<t<1
float4(v0, v1, v2, v3) возвращает (v0.x, v1.x, v2.x, v3.x)
float3(v0, v1, v2) возвращает (v0.x, v1.x, v2.x, v2.x)
float2(v0, v1) возвращает (v0.x, v1.x, v1.x, v1.x)
time() возвращает текущее время
min(v0, v1)
max(v0, v1)
SrgbLinearToGamma(x)
SrgbGammaToLinear(x)
random(xMin, xMax) возвращает случайное значение между xMin.x и xMax.x
normalize(v0) возвращает нормализованный 3-вектор в компонентах xyz. Компонент w остается неизменным
length(v0)> возвращает длину 3-вектора в xyz