在 ShaderFX 网络中使用 for 循环

使用自定义代码节点

可以通过不同方式创建 for 循环。您可以创建自定义代码节点。选择“工具”“切换高级模式”进入高级模式,然后选择“硬件明暗器节点”“各种”“自定义代码”。在“特性”面板中,单击“编辑”按钮,以便在显示的“自定义代码编辑器”对话框中输入代码。使用与 DirectX 视口驱动程序兼容的函数。

使用“For 循环”节点

要创建“For 循环”节点,您还必须启用高级模式。

以下示例说明了如何使用 for 循环对具有不同 UV 偏移的纹理采样三次。采样值相加,然后总和除以三,所得平均值应用到 TraditionalGameSurfaceShader 的“漫反射颜色”通道。

设置 for 循环:

  1. 在 ShaderFX 工作区域中,单击鼠标右键并选择“工具”“切换高级模式”以确保“高级”模式处于活动状态。
  2. 单击鼠标右键并选择“硬件明暗器节点”“流动控制”“For 循环”以创建 ForOp 节点。
    提示: 方形端口表明端口可以接受多个输入。
  3. 选择“硬件明暗器节点”“值”“整型”创建一个整数节点。在“属性”面板上,将其值设置为 3。将其连接到 for 循环节点的 B 属性。
    • A 属性表示循环的开头。
    • B 属性表示循环的结尾。
    • C 属性表示循环的间隔。
    • 默认情况下,A 的值为 0,C 的值为 1。如果您在循环中使用这些默认值,则无需连接这些属性。

      在此示例中,我们设置了 i = 0, i < 3, i++;因此,我们不需要明确设置 A 和 C 值

  4. 选择“硬件明暗器节点”“各种”“字符串”来创建将用作枚举器的字符串。在“属性”面板中,从“默认选项”下拉列表选择 i(您必须向下滚动才能看到此选项)。将“字符串”节点的“输出”端口连接到“For 循环”节点的“枚举器”属性。
  5. 选择“硬件明暗器节点”“值”“float3”创建变量,以存储循环中计算的值。
    提示: 使用 float3 或 float4 存储值。不要使用“颜色”节点。
  6. 在“属性”面板上,将“float3”节点重命名为 LoopResult,并确认这三个值初始化为 1.0。
  7. LoopResult 节点连接到“For 循环”节点的“变量”属性。因为这是一个只使用一个变量的简单循环,也可以将 LoopResult 连接到“For 循环”节点的“输出”属性。

设置纹理采样:

  1. 选择“硬件明暗器节点”“纹理”“纹理贴图”以创建“纹理贴图”节点。在“属性”面板中,使用“MyTexture/路径”控件为此节点指定纹理文件。

    也可以在“属性”面板中,确保“采样器/U 坐标”和“采样器/V 坐标”属性设定为“WRAP”。

    由于对该纹理进行采样偏移,采样可能会超出 0 到 1 的 UV 范围。将这些属性设置为“WRAP”可确保在 UV 范围超出 1.0 时从纹理开始之处对进行像素采样。

  2. 选择“硬件明暗器节点”“值”“数组”以创建“数组”节点。三组偏移值存储在此数组中。
  3. 选择“硬件明暗器节点”“值”“float2”三次,以创建三个 float2 节点来存储三组偏移值。使用“属性”面板来设置三个 float2 属性,如下所示:
    • 名称:Offset1,X:0.1、Y:0.3
    • 名称:Offset2,X:0.2、Y:-0.4
    • 名称:Offset3,X:0.3、Y:0.2
  4. 将所有三个 float2 节点连接到“数组”节点的“值”属性。
  5. 选择“硬件明暗器节点”“输入公用”“UV 集和硬件明暗器节点”“数学”“添加”以创建“UV 集”节点和“添加”节点。
  6. 按如下所示连接节点:
    • 将“数组”的“值”属性连接到“添加”的“值”属性。
    • 将“UV 集”的“UV”属性连接到“添加”的另一个“值”属性。
    • 将“添加”的“结果”属性连接到“纹理贴图”的“UV”属性。
    • 将枚举器(“字符串”节点)的“输出”属性连接到“数组”的“索引”属性。这样可让 for 循环获得偏移值。
    • 将“纹理贴图”的“颜色”属性连接到 for 循环的“计算”属性。这将设置 for 循环中的计算,在此示例中该计算将对纹理贴图采样三次。

计算采样的平均结果:

  1. 选择“硬件明暗器节点”“各种”“字符串”来创建“字符串”节点。在“属性”面板中,从“默认选项”下拉列表中选择 + =
  2. 将新“字符串”节点的“输出”值连接到“For 循环”的“操作符”属性。

    For 循环将纹理采样的结果添加至“循环结果”变量。

  3. 选择“硬件明暗器节点”“数学”“拆分”将创建“拆分”节点。将 For 循环的“输出”属性连接到“拆分”的第一个“值”属性。

    由于“循环结果”是三个采样值的和,必须将它除以三个才能获取其平均值。

  4. 选择“硬件明暗器节点”“值”“浮点”以创建“浮点”节点。在“属性”面板中,将其“值”设置为 3.0。将其“浮点”属性连接到“拆分”的其他“值”属性,以将采样结果的和除以三。
  5. 将“拆分”的“结果”属性的连接到 TraditionalGamesSurfaceShader 的“漫反射颜色”属性。

迭代棋盘图案的结果(使用 Quicksilver 渲染器渲染)

可以将 ShaderFX 材质导出到明暗器文件并检查明暗器代码,以查看刚创建的 For 循环:

float3 LoopResult = float3(1.0, 1.0, 1.0);	
for(int i=0; i<3; i+=1)	
{		
    float2 AddOp = (Array_bphdfiwhhj[i] + IN.map1.xy);		
    float4 Sampler = chessboard_woodjpg.Sample(MMMLWWWSampler, AddOp);		
    LoopResult += Sampler.xyz;
}

有关导出到明暗器文件的详细信息,请参见导出到 HLSL、CgFX 和 GLSL