动态材质表达式

From Valve Developer Community
Jump to: navigation, search
English (en)русский (ru)
... Icon-Important.png

动态表达式可以用来循环地播放材质参数或者用游戏代码提供的数值迫使材质表达某个游戏状态。

在材质编辑器中新建动态表达式

  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() )

表达式也可以由多个中间表达式组成——每个都计算一个临时数值——由return表达式紧接来使用这些中间数值,例如:

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

任何计数函数被传入四维。任何返回计数数值的函数输出四维且每维的值相同。

操作符

按优先级排序:

  1. function call
  2. ()
  3. . (比如.xyxy)
  4.  ! - (-NOT运算)
  5. * / % (乘/除/模)
  6. + - (加/减)
  7. < > <= >= (比较符)
  8. == != (等于/不等于)
  9. && (AND运算,C语言)
  10. || (OR运算,C语言)
  11.  ?: (条件运算:只有指向谓项的表达式被估算)
  12. = (赋值)

嵌入函数

所有函数以float4()作为参数。所有计数操作将被传递四维。例如sin(vSomeVector) 会输出向量(sin(vSomeVector.x),sin(vSomeVector.y),sin(vSomeVector.z),sin(vSomeVector.w))

  • exists(x) - x存在返回1,否则返回0
  • sin(x)
  • cos(x)
  • tan(x)
  • frac(x) - 返回x的小数部分
  • floor(x) - 返回小于等于x的最大整数
  • ceil(x) - 返回大于等于x的最小整数
  • saturate(x) - 饱和处理,大于1变成1,小于0变成0
  • clamp(x, min, max) - 饱和处理,大于max变成max,小于min变成min
  • lerp(a, b, t) - 在a和b之间线性插值,参数t在[0,1]之间变化(t=0返回a,t=1返回b)
  • 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) - If ( a >= b ) return 1; else return 0;
  • smoothstep( a, b, t ) - t=a返回0,t=b返回1,参数0<t<1,其余返回0-1之间的hermite插值
  • 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) - 返回单位向量,xyz轴单位化,w轴保持不变
  • length(v0) - 返回向量在xyz轴的模