Shader im Node-Network
Samstag, 18. April 2009 | Autor: Nikita
TG2 basiert alle seine Berechnungen auf einem baumartigen Netzwerk, dem Node-Network (im folgenden NN abgekürzt). In diesem befinden sich alle Objekte, Shader, Functions und Verbindungen zwischen ihnen. Dennoch ist es Vielen eher suspekt.
Nodes und Shader in der Standardwelt
TG2 generiert standardmäßig eine Welt, d.h. ein NN, in dem bereits die grundlegenden Nodes enthalten sind. Nodes, das sind die kleinen bunten Kästchen, die durch Linien miteinander verbunden sind.
Im Bereich Terrain ist erstmal ein grüner Node. Das ist ein Heightfield-Operator. Er lädt, generiert oder verarbeitet Heightfields – also meist quadratische Terrains, die man mit einem externen Programm erstellt hat.
Heightfield-Operatoren bilden eine besondere Klasse Nodes. Andere solche Klassen sind Objekte, welche durch graue Nodes repräsentiert sind, sowie Beleuchtungs-Modelle (gelb), Atmosphärische Effekte (blau) , Kameras (violett) und Render-Nodes (orange).
Diese speziellen Nodes erklären sich oft selbst und haben nur wenige Einsatzmöglichkeiten. Um diese geht es hier nicht.
Drei weitere Nodes hier sind rot – diese werden Shader genannt. Sie bearbeiten die Eigenschaften von Oberflächen. Sie befinden sich daher nicht nur als Surface-Shader auf dem Terrain, sondern auch auf Objekten und Wasserflächen. Um diese soll es hier hauptsächlich gehen.
Eine letzte Klasse sind Functions (blau) – sie arbeiten im Gegensatz zu Shadern nur auf jeweils einem Datentyp.
Shader
Shader manipulieren die Oberfläche von Objekten (Der Planet ist auch ein großes Objekt).
Jeder Shader hat oben einen oder mehrere Inputs und unten einen Output. Diese nennt man manchmal auch Ports oder Anschlüsse. Oben kommen Informationen rein, unten kommen sie, gegebenenfalls geändert, wieder raus. Da Shader auf Oberflächen arbeiten, fließen durch sie ganz verschiedene Arten von Informationen gleichzeitig:
- Farbe
- Spezialeigenschaften wie Specularity, Reflectivity, Transparency, …
- Displacement und verwandte Daten – also die Form des Terrains und der Surface
Eingaben und Ausgaben
Beispiel Base colours (ein umbenannter Power-Fractal-Shader): Er besitzt die typischen Ports: Input node, Blending shader und Output. Die Input-Ports sind nach dem Zweck benannt, dem der dort angeschlossene Node dient. Der Blending shader beispielsweise dient als Maske.
Der Input Node ist etwas diffus benannt. Im Input-Node-Port kommen die bisher berechneten Daten an. In Fall von Base colours sind das in aller Regel Displacement-Daten, sprich: das Terrain, das vorher berechnet wurde. Würde man diese Verbindung entfernen, würde das Terrain nicht im späteren Render auftauchen.
Was macht TG2, wenn am Input-Node-Port keine Daten anliegen – keine Verbindung irgendwo hin besteht? Dann nimmt TG2 einen leeren Datensatz – ohne Farbe (schwarz), ohne Dispalcement (flach) ohne überhaupt irgendwas. Das geschieht beispielsweise ganz am Anfang des Netzwerks. Der oberste Shader hat keinen Input. Normalerweise ist das ein Shader, der Displacement einfügt, in der Regel ein Terrain. Dann hat die Welt aber immer noch eine schwarze Surface! Deswegen kommt später im Netz der Base-colour-Node, der Farbe auf das Terrain malt.
Was macht TG2, wenn an die Input-Ports Daten angeschlossen sind, die im Zusammenhang keinen Sinn ergeben? Das kommt drauf an – Nodes der falschen Klasse kann man in der Regel nicht anschließen. Zum Beispiel geht kein Heightfield-Operator-Node als Blending-Shader.
Zwei unpassende Shader zusammenzuschließen geht allerdings ohne Probleme. Man kann zum Beispiel ein Terrain ohne Farbe als Blending-Shader nehmen. TG2 hat jedoch keine Ahnung, ob eine Schaltung Sinn ergibt und kann das auch nicht prüfen, da es ja gar nicht wissen kann, was der Nutzer will! Deswegen muss bei der Arbeit im NN Acht geben, dass man sinnvolle Dinge tut.
Displacement und Farbe
Bei Shadern gibt es im wesentlichen nur zwei Datentypen: Displacement und Farbe. Diese beiden fließen gemeinsam, aber voneinander unabhängig, durch das Netzwerk. Diese werden von TG2 auch nie automatisch ineinander umgewandelt!
Um Farbinformationen in ein Displacement umzuwandeln gibt es einen eigenen Shader – den Displacement-Shader. Dieser nimmt als Eingabe eine „Function“ – dort kann man eine Farbe anschließen. Deren Helligkeit(!) wird dann in einen Wert zwischen Null und Eins umgewandelt. Weiß wird als 1 interpretiert, Schwarz als 0.
Um ein Displacement in Farbe „umzuwandeln“ gibt es den Distribution-Shader. Der überschreibt die eingegebene Farbe durch eine Schwarz-Weiß-Maske. Weiß, wo das Terrain innerhalb der vorgegebenen Werte liegt, ansonsten Schwarz.
Die meisten Shader können sowohl Farbe als auch Displacement bearbeiten. Ein Beispiel ist der Surface-Layer. Er kann Displacement hinzufügen, dazu muss man nur im Tab Displacement eine Function angeben. Standardmäßig ist dieses Feld allerdings leer – TG2 interpretiert das korrekterweise als Null – kein Displacement. Der Surface-Layer modifiziert allerdings die Farbe. In Standardeinstellung stellt er als Farbe Grau ein – jede vorher vorhandene Farbe wird dadurch überschrieben.
Wichtig: Vorher im Netz erzeugtes Displacement wird hierdurch nicht beeinflusst! Dieses wird unangetastet von Input-Node-Port zum Output weitergereicht.
Auch andersherum gilt: Shader, die nur das Displacement beeinflussen (etwa der Displacement-Shader) reichen Farbinformationen einfach vom Input-Node-Port an den Output-Port durch.
Der Schlüssel zum Verständnis liegt darin, zu wissen, wie die konkreten Shader Farbe und Displacement beeinflussen. Oft kann man einem Shader Farbe oder Displacement abschalten. Beispielsweise im Surface-Layer mit Apply colour oder im PFS mit Apply displacement. Meist kann man optional Displacement anschalten, indem man eine Displacement-Function anschließt oder eingibt.
Allgemeine Funktionen
Einige Funktionen besitzen alle Nodes. Zum einen kann man fast immer Shader auch per Hand in ein entsprechendes Feld tippen, statt die Nodes im NN zu verbinden.
Alle Nodes kann man deaktivieren. Wenn das passiert, fließen alle am Input-Node-Port anliegenden Daten unverändert zum Output des Nodes.