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 uses a shader language very similar to GLSL, but with added functionality and slightly less flexibility. The reason for doing this is that Godot integrates built-in functionality to make writing complex shaders substantially easier. Godot wraps the user-written shader code in code of its own. That way, Godot handles a lot of the low-level stuff that the user doesn't need to worry about, and it is able to parse your shader code and use it to affect the rendering pipeline. For more advanced shaders, you can turn this functionality off using a render_mode.

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:

Für detaillierte Informationen über jeden Shader Typ, siehe in das zugehörige 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 `` 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 :ref:`Spatial Shader Dokument <doc_spatial_shader>.

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.