Shader (Schattierer)

Einführung

Shader (Schattierer) sind eigenständige Programme die auf der GPU laufen. Sie werden genutzt um die Mesh-Daten (Vertex Positionen, Farben, Normals, usw.) auszuwerten und auf dem Bildschirm zu zeichnen. Shader verarbeiten Daten nicht auf die gleiche Weise wie ein normales Programm, da sie auf der GPU laufen und dafür optimiert wurden. Ein Konsequenz daraus ist, dass Shader ihre Daten nach dem Durchlauf verlieren; sie geben eine Farbe auf dem Bildschirm aus und fahren fort. Demzufolge gibt es keinen Weg auf diese Farbausgabe vom letzten Shaderdurchlauf zuzugreifen.

Godot verwendet eine Shader-Sprache, die GLSL sehr ähnlich ist, jedoch mit zusätzlicher Funktionalität und etwas weniger Flexibilität. Der Grund dafür ist, dass Godot eingebaute Funktionen integriert, um das Schreiben komplexer Shader erheblich zu vereinfachen. Godot verpackt den vom Benutzer geschriebenen Shader-Code in eigenen Code. Auf diese Weise verarbeitet Godot viele der Dinge auf niedriger Ebene, um die sich der Benutzer keine Sorgen machen muss, und es ist in der Lage, Ihren Shader-Code zu analysieren und ihn zur Beeinflussung der Rendering-Pipeline zu verwenden. Bei fortgeschritteneren Shadern können Sie diese Funktion mit einem render_mode deaktivieren.

Dieses Dokument bietet Ihnen einige Information über Shader, speziell in Godot. Für eine detaillierte Referenz der Shader-Sprache in Godot siehe Godot Shader-Sprache.

Shader-Typen

Anstatt eine Universalkonfiguration für alle Verwendungszwecke (2D, 3D, Partikel) bereitzustellen, müssen Godot-Shader angeben wofür sie bestimmt sind. Verschiedene Typen unterstützen verschiedene Rendermodi, integrierte Variablen und Verarbeitungsfunktionen.

Alle Shader müssen ihren Typ in der ersten Zeile spezifizieren, im folgenden Format:

shader_type spatial;

gültige Typen sind:

Detaillierte Informationen zu jedem Shader-Typ finden Sie im entsprechenden Referenzdokument.

Render-Modi

Verschiedene Shader-Typen unterstützen unterschiedliche Render-Modi. Sie sind optional und müssen, falls angegeben, nach dem shader_type stehen. Render-Modi werden verwendet, um die Art und Weise zu ändern, wie integrierte Funktionen behandelt werden. Beispielsweise ist es üblich, den Rendermodus unshaded zu verwenden, um die integrierte Lichtprozessorfunktion zu überspringen.

Rendermodi werden nach dem Shader-Typ angegeben:

shader_type spatial;
render_mode unshaded, cull_disabled;

Für jeden Shader-Typ steht eine andere Liste von Rendermodi zur Verfügung. Eine vollständige Liste der Rendermodi finden Sie im Dokument für jeden Shader-Typ.

Prozessor-Funktionen

Je nach Shader-Typ können optional verschiedene Prozessorfunktionen überschrieben werden. Für "spatial" und "canvas_item" ist es möglich, vertex, fragment, und light zu überschreiben. Für "Partikel" kann nur vertex überschrieben werden.

Vertex-Prozessor

Die vertex Verarbeitungsfunktion wird einmal für jeden Vertex in den Shadern "spatial" und "canvas_item" aufgerufen. Für "Partikel" -Shader wird es für jedes Partikel einmal aufgerufen.

Die Funktion vertex wird verwendet um Informationen pro Vertex zu ändern, die an die Fragmentfunktion weitergegeben werden. Es kann auch verwendet werden um Variablen festzulegen, die mithilfe von Variationen an die Fragmentfunktion gesendet werden (siehe anderes Dokument).

Standardmäßig nimmt Godot Ihre Vertex-Informationen und transformiert sie entsprechend, um sie zu zeichnen. Wenn dies unerwünscht ist, können Sie die Daten mithilfe von Rendermodi selbst transformieren. Ein Beispiel hierfür finden Sie im Spatial Shader Dokument.

Fragment-Prozessor oder Pixel-Prozessor

Die fragment Verarbeitungsfunktion wird verwendet um die Godot-Materialparameter pro Pixel einzurichten. Dieser Code wird auf jedem sichtbaren Pixel ausgeführt, das das Objekt oder Grundelement zeichnet. Es ist nur in den Shadern "spatial" und "canvas_item" verfügbar.

The standard use of the fragment function is to set up material properties that will be used to calculate lighting. For example, you would set values for ROUGHNESS, RIM, or TRANSMISSION which would tell the light function how the lights respond to that fragment. This makes it possible to control a complex shading pipeline without the user having to write much code. If you don't need this built-in functionality, you can ignore it and write your own light processing function and Godot will optimize it away. For example, if you do not write a value to RIM, Godot will not calculate rim lighting. During compilation, Godot checks to see if RIM is used; if not, it cuts all the corresponding code out. Therefore, you will not waste calculations on effects that you do not use.

Beleuchtungs-Prozessor

The light processor runs per pixel too, but also runs for every light that affects the object (and does not run if no lights affect the object). It exists as a function called inside the fragment processor and typically operates on the material properties setup inside the fragment function.

The light processor works differently in 2D than it does in 3D; for a description of how it works in each, see their documentation, CanvasItem shaders and Spatial shaders, respectively.