Verwenden von for-Schleifen im ShaderFX-Netzwerk

Verwenden eines Benutzercode-Knotens

Sie können eine for-Schleife auf verschiedene Arten erstellen. Sie können einen Benutzercode-Knoten erstellen. Wählen Sie "Hilfsmittel" "Erweiterten Modus umschalten", um auf den erweiterten Modus zuzugreifen, und wählen Sie anschließend "Hw Shader Nodes" "Various" "Custom Code". Klicken Sie in der Gruppe "Eigenschaften" auf die Schaltfläche "Bearbeiten", um ihren Code im Dialogfeld "///Benutzercode-Editor///" einzugeben. Verwenden Sie Funktionen, die mit dem DirectX-Ansichtsfenster-Treiber kompatibel sind.

Verwenden eines for-Schleifen-Knotens

Sie müssen im erweiterten Modus arbeiten, um einen for-Schleifen-Knoten zu erstellen.

Im folgenden Beispiel wird veranschaulicht, wie Sie eine for-Schleife verwenden, um eine Textur dreimal mit verschiedenen UV-Abständen zu sampeln. Die gesampelten Werte werden addiert, die Summe durch drei geteilt und der Durchschnittswert auf den Streufarbenkanal von TraditionalGameSurfaceShader angewendet.

Richten Sie die for-Schleife ein:

  1. Klicken Sie im Arbeitsbereich von ShaderFX mit der rechten Maustaste und wählen Sie Hilfsmittel Erweiterten Modus umschalten, um sicherzustellen, dass der erweiterte Modus aktiv ist.
  2. Klicken Sie mit der rechten Maustaste und wählen Sie Hw Shader Nodes Flow Control Für Schleife, um einen ForOp-Knoten zu erstellen.
    Tipp: Ein rechteckiger Port bedeutet, dass der Port mehr als eine Eingabe akzeptieren kann.
  3. Wählen Sie "Hw Shader Nodes" "Werte" "Int", um einen Ganzzahl-Knoten zu erstellen. Stellen Sie in der Gruppe "Eigenschaften" seinen Wert auf 3 ein. Verbinden Sie ihn mit dem B-Attribut der for-Schleife.
    • Das A-Attribut stellt den Beginn der Schleife dar.
    • Das B-Attribut stellt das Ende der Schleife dar.
    • Das C-Attribut stellt das Intervall der Schleife dar.
    • Der Vorgabewert von A ist 0 und der von C ist 1. Wenn Sie diese Vorgabewerte für die Schleife verwenden, müssen Sie diese Attribute nicht verbinden.

      In diesem Beispiel wurde für i = 0; i< 3, i++ eingestellt; daher müssen die Werte für A und C nicht ausdrücklich eingestellt werden.

  4. Wählen Sie "Hw Shader Nodes" "Various" "Zeichenfolge", um eine Zeichenfolge zu erstellen, die dann als Iterator verwendet wird. Wählen Sie in der Gruppe "Eigenschaften" aus der Dropdown-Liste "Vorgabeoptionen" die Option i aus (Sie müssen einen Bildlauf nach unten durchführen, damit diese Option angezeigt wird). Verbinden Sie den Ausgabeport des Zeichenfolgeknotens mit dem Iteratorattribut des for-Schleifen-Knotens.
  5. Wählen Sie "Hw Shader Nodes" "Werte" "Float3", um eine Variable zum Speichern der Werte zu erstellen, die in der Schleife berechnet wurden.
    Tipp: Verwenden Sie "Float3" oder "Float4", um die Werte zu speichern. Verwenden Sie keinen Farbknoten.
  6. Benennen Sie in der Gruppe "Eigenschaften" den Float3-Knoten auf LoopResult um, und stellen Sie sicher, dass die drei Werte auf 1.0 initialisiert sind.
  7. Verbinden Sie denLoopResult-Knoten mit dem Variablenattribut des for-Schleifen-Knotens. Da dies eine einfache Schleife ist, bei der nur eine Variable verwendet wird, verbinden Sie LoopResult auch mit dem Ausgabeattribut der for-Schleife.

Richten Sie das Textur-Sampling ein:

  1. Wählen Sie "Hw Shader Nodes" "Texturen" "Textur-Map", um einen Textur-Map-Knoten zu erstellen. Verwenden Sie in der Gruppe "Eigenschaften" die Steuerelmente von "MyTexture / Pfad", um diesem Knoten eine Texturdatei zuzuweisen.

    Stellen Sie im Bereich "Eigenschaften" auch sicher, dass die Attribute "Sampler / U-Koordinate" und "Sampler / V-Koordinate" auf "WRAP" (Umwickeln) eingestellt sind.

    Da die Textur mit einem Abstand gesampelt wird, könnte das Sampling den UV-Bereich 0-1 überschreiten. Wenn Sie diese Attribute auf "WRAP" einstellen, wird sichergestellt, dass die Pixel vom Beginn der Textur gesampelt werden, wenn der UV-Bereich 1.0 überschreitet.

  2. Wählen Sie "Hw Shader Nodes" "Werte" "Anordnung", um einen Anordnungsknoten zu erstellen. Die drei Abstandswerte werden in dieser Anordnung gespeichert.
  3. Wählen Sie "Hw Shader Nodes" "Werte" "Float2" dreimal, um drei Float2-Knoten zum Speichern der drei Absatzwertsätze zu erstellen. Verwenden Sie die Gruppe "Eigenschaften", um die drei Float2-Attribute wie folgt einzustellen:
    • Name: Offset1, X: 0.1, Y: 0.3
    • Name: Offset2, X: 0.2, Y: -0.4
    • Name: Offset3, X: 0.3, Y: 0.2
  4. Verbinden Sie alle drei Float2-Knoten mit dem Wertattribut des Anordnungsknotens.
  5. Wählen Sie "Hw Shader Nodes" "Inputs Common" "UV Set" und "Hw Shader Nodes" "Math" "Hinzufügen", um einen UV-Set-Knoten und einen Add-Knoten zu erstellen.
  6. Verbinden Sie die Knoten wie folgt:
    • Verbinden Sie das Wertattribut von "Anordnung" mit dem Wertattribut von "Add".
    • Verbinden Sie die UV-Attribute von "UV-Set" mit dem anderen Wertattribut von "Add".
    • Verbinden Sie das Ergebnisattribut von "Add" mit dem UV-Attribut von "Textur-Map".
    • Verbinden Sie das Ausgabeattribut des Iterators (Zeichenfolgeknoten) mit dem Indexattribut von "Anordnung". Dadurch kann die for-Schleife, die Abstandswerte abrufen.
    • Verbinden Sie das Farbattribut von "Textur-Map" mit dem Berechnungsattribut der for-Schleife. Dadurch werden die Berechnungen in der for-Schleife eingestellt, die das Textur-Map dreimal sampelt.

Berechnen Sie den Durchschnitt der gesampelten Ergebnisse:

  1. Wählen Sie "Hw Shader Nodes" "Various" "Zeichenfolge", um einen Zeichenfolgeknoten zu erstellen. Wählen Sie in der Gruppe "Eigenschaften" in der Dropdown-Liste "Vorgabeoptionen" die Option +=.
  2. Verbinden Sie den Ausgabewert des neuen Zeichenfolgeknotens mit dem Operatorattribut der for-Schleife.

    Die for-Schleife fügt die Ergebnisse des Textur-Samplings der Variable "Loop Result" hinzu.

  3. Wählen Sie "Hw Shader Nodes" "Math" "Teilen", um einen Divide-Knoten zu erstellen. Verbinden Sie das Ausgabeattribut der for-Schleife mit dem ersten Wertattribut von "Divide".

    Da "Loop Result" die Summe von drei gesampelten Werten ist, muss sie durch drei geteilt werden, um den Durchschnitt zu ermitteln.

  4. Wählen Sie "Hw Shader Nodes" "Werte" "Float", um einen Float-Knoten zu erstellen. Stellen Sie in der Gruppe Eigenschaften seinen Wert auf 3.0 ein. Verbinden Sie sein Float-Attribut mit dem anderen Wertattribut von "Divide", um die Summe der gesampelten Ergebnisse durch drei zu teilen.
  5. Verbinden Sie das Ergebnisattribut von "Divide" mit dem Attribut "Streufarbe" von TraditionalGameSurfaceShader.

Ergebnis der Iteration eines Schachbrettmusters (gerendert mit dem Quicksilver-Renderer)

Sie können das ShaderFX-Material in eine Shader-Datei exportieren und den Shader-Code überprüfen, um die for-Schleife zu sehen, die Sie gerade erstellt haben:

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;
}

Weitere Informationen zum Exportieren in eine Shader-Datei finden Sie unter Exportieren in HLSL, CgFX und GLSL.