定制表达式

Custom(定制)

Custom(定制)表达式允许您编写定制 HLSL 着色器代码,这些代码可对任意数量的输入执行操作,并输出操作结果。

项目 说明

属性

代码(Code) 包含表达式将执行的着色器代码。(请参阅下文中的 警告
输出类型(Output Type) 指定表达式所输出的值的类型。
说明(Description) 指定要在材质编辑器中的表达式栏中显示的文本。
输入(Inputs) 表达式所使用的输入数组。

输入名称(Input Name)

指定输入的名称。这是材质编辑器中显示在此表达式上的名称,并且是 HLSL 代码中用来引用输入值的名称。

请向“输入”(Inputs)数组添加任意数目的输入,并对其进行命名。然后,您可以在“代码”(Code)属性中编写代码。您可输入包含 return 语句的完整函数体(如示例所示),也可输入简单表达式,例如 Input.bgr。另外,您还必须在 OutputType(输出类型)中指定输出数据类型。

T_Custom_Node.png

这里是以上示例中使用的代码,您可以使用此代码自行尝试 Custom(定制)节点。

float3 blur = Texture2DSample(Tex, TexSampler, UV);

for (int i = 0; i < r; i++)
{

  blur += Texture2DSample(Tex, TexSampler, UV + float2(i * dist, 0));
  blur += Texture2DSample(Tex, TexSampler, UV - float2(i * dist, 0));

}

for (int j = 0; j < r; j++)
{ 

  blur += Texture2DSample(Tex, TexSampler, UV + float2(0, j * dist));
  blur += Texture2DSample(Tex, TexSampler, UV - float2(0, j * dist));

}

blur /= 2*(2*r)+1;
return blur;

使用 Custom(定制)节点会阻止常量折叠,并且,与使用内置节点实现的等效版本相比,可能会大幅增加所使用的指令!常量折叠是 UE4 在内部利用的一项优化功能,旨在必要时减少着色器指令数。例如,“Time(时间)> Sin(正弦)> 乘以(Mul)参数 > 加入(Add)某内容”表达式链可以并且将会由 UE4 折叠为单一指令,即最终的相加。可以做到这一点的原因是,该表达式的所有输入(Time(时间)和参数)在整个绘制调用中保持不变,而不是随像素而变化。UE4 无法折叠 Custom(定制)节点中的任何内容,与使用现有节点实现的等效版本相比,这可能会生成效率欠佳的着色器。因此,最好是仅当 Custom(定制)节点允许您访问无法通过现有节点访问的功能时,才使用 Custom(定制)节点。

在 Custom(定制)节点中编写的着色器代码将“按原样”针对目标平台进行编译。这意味着,如果是针对 PC 来编译着色器,那么将假定它是有效的 HLSL。如果是针对 PS3 进行编译,那么将假定它是有效的 Cg。