Shader Personalizzati
Guide su come scrivere i tuoi shader in Wonderland Engine.
Shader di Vertice vs Fragment Shader
In Wonderland Engine, attualmente forniamo API per scrivere shader di frammento personalizzati.
Struttura del Materiale
La struttura del materiale definisce le proprietà del materiale da inserire nel tuo shader e generare l’interfaccia utente.
Questa definizione di struttura ci permette di imballare efficientemente gli input del materiale e generare
codice di estrazione automaticamente nel segnaposto {{ decoder }}
del tuo shader.
Un esempio di struttura del materiale potrebbe essere simile a questo:
Tipi di Proprietà
I seguenti tipi di proprietà sono supportati in combinazione con i specificatori di precisione lowp
e mediump
:
float
,uint
,int
: Valori scalarivec2
,vec3
,vec4
: Vettori a virgola mobileivec2
,ivec3
,ivec4
: Vettori interi
Precisione
In Wonderland Engine, lowp
risulterà sempre in un tipo codificato a 8 bit per componente,
mediump
in un tipo codificato a 16 bit (ad esempio, un half float) e highp
, se supportato,
sarà un tipo codificato a 32 bit.
Suffissi
I seguenti suffissi hanno un significato speciale:
*Color
: Genererà un selettore di colori. Usalowp
per i colori LDR.*Texture
: Genererà un menu a tendina per risorse texture. Usa sempremediump
.
Allineamento della Memoria
A causa del funzionamento del confezionamento del materiale di Wonderland Engine, la maggior parte dei tipi di vettore richiede allineamento a 32 bit. Vedi precisione per come contare i bit per componente.
Simboli del Preprocessore
Per escludere porzioni di un shader per migliorare le prestazioni, abbiamo un’implementazione estesa del preprocessore.
Caratteristiche
Puoi definire “Simboli di Caratteristica” negli shader per abilitare e disabilitare parti del tuo shader:
FEATURE_<name>
viene usato per definire una caratteristica chiamata <name>
. Queste saranno esposte nelle
impostazioni Viste > Risorse > Pipeline
nella lista “Caratteristiche”.
Se una caratteristica è abilitata, un simbolo sarà definito per corrispondere al tuo nome di caratteristica, ad esempio ALPHA_MASKED
nell’esempio sopra (non FEATURE_ALPHA_MASKED
).
Input di Frammento
I simboli prefissati con USE_<input>
vengono utilizzati per abilitare gli input dello shader. Hai le seguenti opzioni:
Simbolo | Tipo | Nome |
---|---|---|
USE_POSITION_WORLD | highp vec3 | fragPositionWorld |
USE_POSITION_VIEW | highp vec3 | fragPositionView |
USE_TEXTURE_COORDS | highp vec2 | fragTextureCoords |
USE_TEXTURE_COORDS_1 | highp vec2 | fragTextureCoords1 |
USE_COLOR | mediump vec4 | fragColor |
USE_TANGENT | mediump vec4 | fragTangent |
USE_OBJECT_ID | mediump uint | fragObjectId |
USE_MATERIAL_ID | mediump uint | fragMaterialId |
USE_NORMAL | mediump vec3 | fragNormal |
USE_BARYCENTRIC | mediump vec3 | fragBarycentric |
Include
Wonderland Engine dispone di un sistema di inclusione per shader GLSL. Si prega di fare riferimento agli shader esistenti per quali include sono comunemente richiesti.
Uniform
Alcuni uniform speciali che sono sempre disponibili:
Uniform | Tipo | Descrizione |
---|---|---|
viewIndex | uint | Indice della vista corrente in fase di rendering. |
Per gli altri, utilizzare come riferimento gli shader forniti con l’editor. Alcuni di essi sono disponibili solo quando abilitati tramite un simbolo del preprocessore.