Ein Skript ist ein Programm in einer Computersprache, das in Filter Forge ausgeführt wird – genauer gesagt, in den Komponenten Abbildungs-Skript und Kurven-Skript. Im Wesentlichen kannst du mit Skripten deine eigenen Komponenten mit benutzerdefinierten Eingaben und interner Logik programmieren. Skripte in Filter Forge sind in Lua geschrieben.
In diesem Artikel wird davon ausgegangen, dass du mit den folgenden Punkten bereits vertraut bist:
Dieser Abschnitt ist ein kurzer Lehrgang, der die Ausführung eines einfachen Skripts demonstriert. Wir würden gerne das Standardbeispiel "Hallo Welt" verwenden, aber Filter Forge verfügt nicht über Funktionen zur Ausgabe von Strings, daher werden wir einen einfachen Generator für radiale Farbverläufe demonstrieren:


Hier ist der Code in Textform, damit du ihn in eine Abbildungs-Skript Komponente kopieren/einfügen kannst:
function prepare() end; function get_sample(x, y) d = math.sqrt (x*x + y*y) return d, d, d, 1 end;
Folge diesen Schritten, um diesen Code in Filter Forge auszuführen:
Schauen wir uns das Beispielskript genauer an.
Wie du vielleicht schon erraten hast, erfolgt die Bilderzeugung mit der Funktion get_sample(), die zwei Koordinaten x und y als Argumente akzeptiert und die auf der Grundlage dieser Koordinaten berechnete Ausgangsfarbe zurückgibt. Die Farbe wird als eine Liste von vier Zahlen zurückgegeben, die RGBA-Kanäle darstellen. Es gibt eine weitere Funktion, prepare(), die normalerweise für die Vorberechnung und die Abfrage von nicht zugeordneten Eingaben zuständig ist, aber in diesem speziellen Skript bleibt sie leer – sie tut nichts.
Um den Farbverlauf zu erzeugen, berechnet das Skript den Abstand zwischen dem Sample-Punkt (der durch die beiden Koordinaten gegeben ist) und dem Punkt mit den Koordinaten 0, 0 (die linke obere Ecke des Bildes) und gibt den Abstand einfach als Farbe zurück.
Beachte, dass das Beispielskript keine Loops über Pixel oder eine andere Form der Iteration enthält – es gibt lediglich die Bildfunktion an, die vom Filter Forge-Renderer oder den Komponenten aufgerufen werden soll. Filter Forge-Komponenten erzeugen keine Bilder, indem sie ihre Pixel direkt malen. Stattdessen "fragt" Filter Forge eine Komponente: "Welche Farbe hat dein Bild an den Koordinaten x und y?", und die Komponente "antwortet" mit vier RGBA-Werten. Mit anderen Worten: Das resultierende Bild wird implizit von der Komponente definiert, anstatt explizit von ihr gemalt zu werden. Weitere Informationen über den Ansatz von Filter Forge bei der Bilderzeugung findest du unter: Filter Forge's Sample-basierte Architektur.
Wie andere Filter Forge-Komponenten können auch Skriptkomponenten über Abbildungs-Eingaben, Kurven-Eingaben und numerische Eingaben verfügen. Im Gegensatz zu den eingebauten Komponenten, die einen fest programmierten Satz von Eingaben haben, kannst du bei Skriptkomponenten benutzerdefinierte Eingaben über das Dialogfeld Eingabe-Editor definieren. In diesem Beispiel wird ein einfaches Skript ausgeführt, das den Status einer einzelnen Checkbox mit dem Namen "Tick" abfragt:


Hier ist das Skript. Beachte, dass es eine Zeile enthält, die sich auf eine Eingabe namens "Tick" bezieht:
function prepare() chk = get_checkbox_input(TICK) end; function get_sample(x, y) if chk then return 1, 1, 1, 1 else return 0, 0, 0, 1 end; end;
Befolge diese Schritte, um das Skript zum Laufen zu bringen:
Jetzt solltest du eine Fehlermeldung im Meldungsprotokoll sehen. Der Fehler wird angezeigt, weil sich das Skript auf eine Eingabe namens TICK bezieht, aber im Eingabe-Editor keine Eingabe mit dem Skript-Identifikator TICK finden kann. Öffne den Eingabe-Editor, um diese Eingabe zu erstellen, und versuche erneut, das Skript auszuführen:



Werfen wir einen Blick auf das Skript.
Die Funktion prepare(), die im ersten Beispiel leer war, enthält nun einen Aufruf der Funktion get_checkbox_input() und speichert den zurückgegebenen Wert in einer Variablen namens chk. Das einzige Argument der Funktion ist der Skript-Identifikator der Checkbox-Eingabe, die wir abfragen wollen.
Dieser Funktionsaufruf ist der wichtigste Teil dieses Beispiels – er fragt die Checkbox mit dem angegebenen Skript-Identifikator ab und gibt seinen Status entweder als true oder false an (in diesem Fall bedeutet das "markiert" bzw. "nicht markiert".)
Damit das Skript korrekt ausgeführt werden kann, muss die an die Funktion Skript-Identifikator mit der Skript-Identifikator übereinstimmen, die für die Eingabe im Eingabe-Editor angegeben wurde. Wenn es im Eingabe-Editor keine Eingabe mit einer solchen Skript-Identifikator gibt oder die Eingabe mit dem passenden Skript-Identifikator keine Checkbox ist, wird das Skript mit einem Fehler abgebrochen.
Verschiedene Arten von Eingaben werden mit unterschiedlichen Funktionen abgefragt – auf Checkboxen wird über get_checkbox_input() zugegriffen, auf Schiebderegler über get_slider_input() usw. abbildbare Eingaben wie Farb-Abbildungs-Eingaben, Graustufen-Abbildungs-Eingaben und Kurven-Eingaben müssen durch Aufruf der entsprechenden Funktionen aus get_sample() abgefragt werden, während numerische Eingaben wie Checkbox Eingabe oder Slider Eingabe aus prepare() abgefragt werden müssen, wie im obigen Beispielskript gezeigt. Eine vollständige Liste der Eingabetypen und ihrer entsprechenden Abfragefunktionen findest du unter: Eingaben aus Skripten referenzieren.
Um die Referenzierung von Eingaben zu vereinfachen, zeigt der Eingabe-Editor Codeschnipsel an, die dir zeigen, wie du jede Art von Eingabe abfragen oder abfragen lassen kannst. Diese Schnipsel funktionieren, wenn sie in das Skript eingefügt werden, sodass du dich nicht jedes Mal, wenn du eine Eingabe hinzufügst, an die Details erinnert oder auf diesen Artikel verweisen musst.
Dieses Beispiel ist wahrscheinlich das wichtigste – wir werden mit Abbildungs-Eingaben arbeiten, die der Eckpfeiler der Leistungsfähigkeit und Flexibilität von Filter Forge sind. Das Skript in diesem Beispiel implementiert eine einfache Verzerrungskomponente, die zwei Abbildungs-Eingänge hat – einen für das Quellbild und einen weiteren für die Verzerrungs-Karte, deren RGB-Kanäle die Richtung und das Ausmaß der Verzerrung bestimmen werden:

Hier ist das Skript. Beachte zwei Aufrufe der Funktion get_sample_map():
function prepare() end; function get_sample(x, y) rd, gd, bd, ad = get_sample_map(x, y, DISTORTER) samplex = x + (rd + bd/2) * ad sampley = y + (gd + bd/2) * ad r, g, b, a = get_sample_map(samplex, sampley, SOURCE) return r, g, b, a end;
Folge diesen Schritten, um das Skript auszuführen:
Jetzt sollten die beiden von dir erstellten Eingänge als anschließbare Slots auf dem Komponentenkörper im Filterbearbeitungsbereich erscheinen. Du kannst einige Komponenten mit diesen Eingängen verbinden, um das Ergebnis besser zu sehen. Zum Beispiel kannst du Bricks mit "Source" und Perlin Noise mit "Distorter" verbinden, wie im obigen Beispielbild gezeigt.
Schauen wir uns das Skript an.
Der Sinn dieses Beispiels ist es, zu demonstrieren, wie Abbildungs-Komponenten (einschließlich Abbildungs-Skripten) ihre Arbeit verrichten, indem sie get_sample()-Funktionen von Komponenten aufrufen, die mit ihren Eingängen verbunden sind, während sie ihre eigene get_sample()-Funktion ausführen.
Das obige Beispielskript enthält zwei get_sample_map() -Aufrufe. Der erste Aufruf erhält die RGBA-Werte der verzerrten Karte an den ursprünglichen Sample-Koordinaten, die durch die x und y Argumente der skripteigenen Funktion get_sample() angegeben werden, und der zweite Aufruf erhält die RGBA-Werte der Quellkarte an verzerrten Koordinaten, die vor dem Aufruf berechnet und in den Variablen samplex und sampley gespeichert werden. Die RGBA-Werte, die an den Koordinaten nach der Verzerrung erhalten werden, werden als endgültige Farbe zurückgegeben.
Beachte, dass der zweite get_sample_map()-Aufruf andere Sample-Koordinaten verwendet als die ursprünglichen Sample-Koordinaten, die dem skripteigenen get_sample() über seine x and y Argumente übergeben wurden. Filter Forge-Komponenten, einschließlich Skripten, können ihre Abbildungs-Eingaben beliebig oft mit beliebigen Sample-Koordinaten abtasten und die von diesen Aufrufen zurückgegebenen RGBA-Werte auf beliebige Weise verwenden, einschließlich der Berechnung von Sample-Koordinaten für nachfolgende Sampling-Aufrufe, wie im obigen Beispielskript. Weitere Informationen zum Sampling und zum Koordinatensystem von Filter Forge findest du unter: Sample-basierte Architektur von Filter Forge.
Beachte, dass Eingabe-Sampling-Funktionen wie get_sample_map() von der Funktion get_sample() des Skripts aufgerufen werden müssen. Wenn du sie von prepare() aus aufrufst, bricht das Skript mit einem Fehler ab. Weitere Informationen findest du unter: Referenzierung von Eingaben aus Skripten.