This article relates to the game Dota 2. Click here for more information.
This article relates to the workshop tools for Dota 2. Click here for more information.
This article's documentation is for Source 2. Click here for more information.

Dynamic Material Expressions:ru

From Valve Developer Community
Jump to: navigation, search
English


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

Добавление нового динамического выражения в 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" и скалярными параметрами с помощью ползунков UI (...пользовательского интерфейса): параметр «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 </ code> в примере выше), либо на атрибуты, предоставляемые игровым кодом (например, SomeAttribute </ code> в примере выше), Если идентификатор не является локальной переменной, предполагается, что он снабжен игровым кодом.

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

Типы данных

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

Примеры:

  • 3.5 becomes (3.5, 3.5, 3.5, 3.5)
  • float2( 1, 2 ) becomes (1, 2, 2, 2)
  • float3( 1, 2, 3 ) becomes (1, 2, 3, 3)
  • vSomeVector.xyz becomes vSomeVector.xyzz
  • vVec3.zx becomes vVec3.zxxx

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

Операторы

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

  1. function call
  2. ()
  3. . (для swizzles, например .xyxy)
  4.  ! - (важно, отрицание)
  5. * / % (умножить, разделить, по модулю)
  6. + - (сложение, вычитание)
  7. < > <= >= (сравнения)
  8. == != (равенство, неравенство)
  9. && (logical and. Lazy evaluation like in C.)
  10. || (logical or. Lazy evaluation like in C.)
  11.  ?: (conditional. Lazy evaluation: Only the subexpression indicated by the predicate is evaluated.)
  12. = (назначение)

Встроенные функции (BuiltIn Functions)

Все функции принимают 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.