Using a
Custom Code node
You can create a
for loop in different ways. You can create a
Custom Code node. Select
Settings > Toggle Advanced Mode from the ShaderFX menu bar to enter advanced mode, then select
Hw Shader Nodes > Various > Custom Code. Press
Edit in the
Attribute Editor to enter your code in the
Custom Code editor that appears. Use functions that run in both DirectX and OpenGL if you plan to use both modes.
Using a
For Loop node
You must also be in advanced mode in order to create a
For Loop node.
The following example demonstrates how to use a
for loop to sample a texture three times with different UV offsets. The sampled values are added; the total divided by three, and the average value applied to the
Diffuse Color channel of the
TraditionalGameSurfaceShader.
Setting up the for loop
- Select
Hw Shader Nodes > Flow Control > For Loop to create a
For Loop node.
Tip: A square port signifies that it can accept more than one input.
- Select
Hw Shader Nodes > Values > Int to create an Integer node. Set its value to 3 in the
Attribute Editor and connect it to the
B attribute of the
For Loop node.
- The
A attribute represents the start of the loop.
- The
B attribute represents the end of the loop.
- The
C attribute represents the interval of the loop.
By default, the value of
A is 0 and the value of
C is 1. If you use these default values for your loop, you do not need to connect these attributes.
In this example, we set
for i = 0, i < 3, i++; therefore, we do not need to explicitly set the
A and
C values.
- Select
Hw Shader Nodes > Various > String to create an iterator. In its
Attribute Editor, select
i from the
Default options drop-down list, and connect it to the
Iterator attribute of the
For Loop node.
- Select
Hw Shader Nodes > Values > Float3 to create a variable to store the values that are calculated within the loop.
Tip: Use
Float3 or
Float4 to store the values. Do not use
Color.
- In the
Float3
Attribute Editor, rename the node to
Loop Result and initialize the values to 1.
- Connect the
float3 attribute to the
Variables attribute of the
For Loop node. Because this is a simple loop where only one variable is used, connect
float3 to the
Output attribute of the
For Loop as well.
Setting up the texture sampling
- Select
Hw Shader Nodes > Textures > Texture Map to create a
Texture Map node. Connect your texture to the
MyTexture/Path attribute in the
Attribute Editor.
- Select
Hw Shader Nodes > Values > Array to create an
Array node. The three set of offset values are stored in an array.
- Select
Hw Shader Nodes > Values > Float2 three times to create three
Float2 nodes for three sets of offset values. For each
Float2 node, set its attributes in the
Attribute Editor as follows:
-
Name: Offset1,
X: 0.1,
Y: 0.3
-
Name: Offset2,
X: 0.2,
Y: -0.4
-
Name: Offset3,
X: 0.3,
Y: 0.2
- Connect all three
Float2 nodes to the
Values attribute of the
Array node.
- Select the
Texture Map node. In its
Attribute Editor, ensure that the
Sampler / U Coordinate and
Sampling / V Coordinate attributes are set to
WRAP.
Because the texture is sampled with an offset, the sampling may exceed the 0-1 UV range. Setting this attribute to
WRAP ensures that pixels are sampled from the beginning of the texture when the UV range exceeds 1.0.
- Select
Hw Shader Nodes > Inputs Common > UV Set
and
Hw Shader Nodes > Math > Add to create a
UV Set node and an
Add node, respectively.
- Connect the nodes as follows:
- Connect the
Value attribute of
Array to the
Value attribute of
Add.
- Connect the
UV attribute of
UV set to the other
Value attribute of
Add.
- Connect the
Result attribute of
Add to
UV attribute of
Texture Map.
- Connect the
Output attribute of the iterator (String node) to the
Index attribute of
Array. This allows the
For Loop to obtain the offset values.
- Connect the
Color attribute of
Texture Map to the
Calculations attribute of
For Loop. This sets the calculations in the for loop, which samples the texture map three times.
Calculate the average of the sampled results
- Select
Hw Shader Nodes > Various > String to create a
String node, then select
+= from the
Default options drop-down list.
- Connect the
Output value of
String to the
Operators attribute of the
For Loop node. The
For Loop adds the results of the texture sampling to the
Loop Result variable.
- Select
Hw Shader Nodes > Math > Divide to create a
Divide node. Connect the
Output attribute of
For Loop to the first
Value attribute of
Divide. Because
Loop Result is the sum of three sampled values, it must be divided by three to obtain its average.
- Select
Hw Shader Nodes > Values > Float to create a
Float node and set its value to 3 in the
Attribute Editor. Connect its
float attribute to the other
Value attribute of
Divide to divide the sum of the sampled results by three.
- Connect the
Result attribute of
Divide to the
Diffuse Color attribute of
TraditionalGamesSurfaceShader.
You can export your
ShaderFX material to a shader file and examine the shader code to see the
for loop you just created:
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 = numberTestTexture.Sample(MMMLWWWSampler, AddOp);
LoopResult += Sampler.xyz;
}
For more information about exporting to a shader file, see
Export ShaderFX materials to HLSL, CgFX and GLSL.