Eigene Shader

Anleitungen, wie Du eigene Shader in Wonderland Engine schreiben kannst.

Vertex vs Fragment Shaders 

In Wonderland Engine bieten wir derzeit APIs zum Schreiben von eigenen Fragment-Shadern an.

Material Struct 

Die Material-Struct definiert die Materialeigenschaften, die als Eingaben für Deinen Shader verwendet werden und für die Generierung der UI.

Diese Struct-Definition ermöglicht es uns, Materialeingaben effizient zu packen und Entpackungscode automatisch im {{ decoder }} Placeholder Deines Shaders zu erzeugen.

Ein Beispiel für eine Material-Struct könnte so aussehen:

1struct Material {
2    lowp vec4 ambientColor;
3    mediump uint diffuseTexture;
4    lowp uint shininess;
5    lowp float ambientFactor;
6    mediump float amplifier;
7};

Property-Typen 

Die folgenden Eigenschaftstypen werden in Kombination mit den Präzisionsspezifikatoren lowp und mediump unterstützt:

  • float, uint, int: Skalare Werte
  • vec2, vec3, vec4: Gleitkomma-Vektoren
  • ivec2, ivec3, ivec4: Ganzzahlen-Vektoren

Präzision 

In Wonderland Engine resultiert lowp immer in einem 8-Bit-pro-Komponente-encodierten Typ, mediump in einem 16-Bit-encodierten Typ (z. B. ein Halbfloater) und highp, wo unterstützt, in einem 32-Bit-encodierten Typ.

Suffixe 

Die folgenden Suffixe haben eine spezielle Bedeutung:

  • *Color: Wird einen Farbwähler generieren. Verwende lowp für LDR-Farben.
  • *Texture: Wird ein Texturressource-Dropdown generieren. Immer mediump verwenden.

Speicher-Alignment 

Aufgrund der Art und Weise, wie das Materialpacking in Wonderland Engine funktioniert, benötigen die meisten Vektortypen eine Ausrichtung auf 32 Bit. Siehe Präzision, um zu erfahren, wie Du Bits pro Komponente zählst.

Präprozessorsymbole 

Um Teile eines Shaders für die Leistungsfähigkeit ausblenden zu können, haben wir eine erweiterte Präprozessor-Implementierung.

Funktionen 

Du kannst “Feature-Symbole” in Shadern definieren, um Teile Deines Shaders ein- und auszuschalten:

1#define FEATURE_ALPHA_MASKED
2#define FEATURE_NORMAL_MAPPING
3#define FEATURE_VERTEX_COLORS
4#define FEATURE_WITH_EMISSIVE

FEATURE_<name> wird verwendet, um ein Feature namens <name> zu definieren. Diese werden in den Views > Resources > Pipelines Einstellungen in der “Features”-Liste angezeigt. Wenn ein Feature aktiviert ist, wird ein Symbol definiert, das Deinem Featurename entspricht, z. B. ALPHA_MASKED in obigem Beispiel (nicht FEATURE_ALPHA_MASKED).

Fragment-Eingaben 

Symbole, die mit USE_<input> beginnen, werden verwendet, um Shader-Eingaben zu aktivieren. Du hast folgende Optionen:

SymbolTypName
USE_POSITION_WORLDhighp vec3fragPositionWorld
USE_POSITION_VIEWhighp vec3fragPositionView
USE_TEXTURE_COORDShighp vec2fragTextureCoords
USE_TEXTURE_COORDS_1highp vec2fragTextureCoords1
USE_COLORmediump vec4fragColor
USE_TANGENTmediump vec4fragTangent
USE_OBJECT_IDmediump uintfragObjectId
USE_MATERIAL_IDmediump uintfragMaterialId
USE_NORMALmediump vec3fragNormal
USE_BARYCENTRICmediump vec3fragBarycentric

Includes 

Wonderland Engine kommt mit einem GLSL-Shader-Include-System. Bitte sieh Dir bestehende Shader an, um zu erfahren, welche Includes üblicherweise benötigt werden.

Uniforms 

Einige spezielle Uniforms, die immer verfügbar sind:

UniformTypBeschreibung
viewIndexuintIndex der derzeit gerenderten Ansicht.

Für andere verwende bitte die Shader, die mit dem Editor geliefert werden, als Referenz. Einige sind nur verfügbar, wenn sie über ein Präprozessorsymbol aktiviert werden.