CanvasItem shaders

CanvasItem shaders are used to draw all 2D elements in Godot. These include all nodes that inherit from CanvasItems, and all GUI elements.

Gli shader CanvasItem contengono meno variabili integrate e funzionalità rispetto agli shader Spatial, ma mantengono la stessa struttura di base con funzioni processori di vertici, frammenti e luci.

Modalità di rendering

Modalità di rendering

Descrizione

blend_mix

Modalità di fusione mista (alfa è la trasparenza), predefinita.

blend_add

Modalità di fusione additiva.

blend_sub

Modalità di fusione sottrattiva.

blend_mul

Modalità di fusione moltiplicativa.

blend_premul_alpha

Modalità di fusione alfa premoltiplicato.

blend_disabled

Disabilita la fusione, i valori (incluso l'alfa) sono scritti così come sono.

unshaded

Result is just albedo. No lighting/shading happens in material.

light_only

Disegna solo nel passaggio di luce.

skip_vertex_transform

VERTEX deve essere trasformato manualmente nella funzione vertex().

world_vertex_coords

VERTICE è modificato in coordinate mondiali anziché locali.

Variabili integrate

I valori marcati come in sono di sola lettura. I valori marcati come out sono scrivibili facoltativamente e non contengono necessariamente valori sensati. I valori marcati come inout forniscono un valore predefinito sensato e sono scrivibili facoltativamente. I campionatori non sono scrivibili, quindi non sono marcati.

Not all built-ins are available in all processing functions. To access a vertex built-in from the fragment() function, you can use a varying. The same applies for accessing fragment built-ins from the light() function.

Variabili integrate globali

Le variabili integrate globali sono disponibili ovunque, comprese le funzioni personalizzate.

Integrato

Descrizione

in float TIME

Tempo globale dall'avvio del motore, in secondi. Si ripete ogni 3.600 secondi (che può essere modificato con l'impostazione rollover). È influenzato da time_scale ma non dalla pausa. Se è necessaria una variabile TIME che non sia influenzata dalla scala temporale, aggiungere il proprio uniforme di shader globale da aggiornare a ogni frame.

in float PI

Una costante PI (3.141592). Il rapporto tra la circonferenza di un cerchio e il suo diametro, e la quantità di radianti in mezzo giro.

in float TAU

Una costante TAU (6.283185). Equivalente a PI * 2 e alla quantità di radianti in un giro completo.

in float E

Una costante E (2.718281). Numero di Eulero e base del logaritmo naturale.

Variabili integrate di vertice

I dati dei vertici (VERTEX) sono presentati nello spazio locale (coordinate in pixel, relative all'origine del Node2D). Se non vengono scritti, questi valori non saranno modificati e saranno trasmessi così come sono arrivati.

The user can disable the built-in model to world transform (world to screen and projection will still happen later) and do it manually with the following code:

shader_type canvas_item;
render_mode skip_vertex_transform;

void vertex() {

    VERTEX = (MODEL_MATRIX * vec4(VERTEX, 0.0, 1.0)).xy;
}

Anche altre variabili integrate, come UV e COLOR, vengono passate alla funzione fragment() se non vengono modificate.

Per l'istanzazione, la variabile INSTANCE_CUSTOM contiene i dati personalizzati dell'istanza. Quando si utilizzano particelle, queste informazioni sono solitamente:

  • x: Angolo di rotazione in radianti.

  • y: Fase durante il ciclo di vita (da 0.0 a 1.0).

  • z: Fotogramma di animazione.

Integrato

Descrizione

in mat4 MODEL_MATRIX

Trasformazione da spazio locale a spazio mondiale. Lo spazio mondiale corrisponde alle coordinate che normalmente si usano nell'editor.

in mat4 CANVAS_MATRIX

Trasformazione da spazio mondiale a spazio del canvas. Nello spazio del canvas, l'origine è l'angolo in alto a sinistra dello schermo e le coordinate vanno da (0.0, 0.0) alle dimensioni della viewport.

in mat4 SCREEN_MATRIX

Canvas space to clip space. In clip space coordinates ranging from (-1.0, -1.0) to (1.0, 1.0).

in int INSTANCE_ID

ID di istanza per l'istanziazione.

in vec4 INSTANCE_CUSTOM

Dati personalizzati dell'istanza.

in bool AT_LIGHT_PASS

Sempre false.

in vec2 TEXTURE_PIXEL_SIZE

Dimensioni normalizzate dei pixel della texture 2D predefinita. Per uno Sprite2D con una texture di 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

inout vec2 VERTEX

Posizione del vertice, nello spazio locale.

in int VERTEX_ID

L'indice del vertice attuale nel buffer dei vertici.

inout vec2 UV

Coordinate normalizzate della texture. Intervallo da 0.0 a 1.0.

inout vec4 COLOR

Colore derivante dalla primitiva del vertice moltiplicato per la modulazione di CanvasItem moltiplicato per la modulazione a se stesso di CanvasItem.

inout float POINT_SIZE

Dimensione dei punti per il disegno di punti.

in vec4 CUSTOM0

Valore personalizzato dalla primitiva del vertice.

in vec4 CUSTOM1

Valore personalizzato dalla primitiva del vertice.

Variabili integrate di frammento

COLOR e TEXTURE

La variabile integrata COLOR è utilizzata per un po' di cose:

  • Nella funzione vertex(), COLOR contiene il colore della primitiva di vertice moltiplicato per la modulazione del CanvasItem moltiplicato per modulazione a se stesso del CanvasItem.

  • Nella funzione fragment(), il valore di input COLOR è quello stesso valore moltiplicato per il colore dalla TEXTURE predefinita (se presente).

  • Nella funzione fragment(), COLOR è anche l'output finale.

Alcuni nodi (ad esempio, Sprite2D) visualizzano una texture predefinita, ad esempio texture. Quando si utilizza una funzione fragment() personalizzata, sono disponibili alcune opzioni su come campionare questa texture.

Per leggere solo il contenuto della texture predefinita, ignorando il COLOR del vertice:

void fragment() {
  COLOR = texture(TEXTURE, UV);
}

Per leggere il contenuto della texture predefinita moltiplicato per il COLOR del vertice:

void fragment() {
  // Equivalent to an empty fragment() function, since COLOR is also the output variable.
  COLOR = COLOR;
}

Per leggere solo il COLOR del vertice in fragment(), ignorando la texture principale, è necessario passare COLOR come varying, e poi leggerlo in fragment():

varying vec4 vertex_color;
void vertex() {
  vertex_color = COLOR;
}
void fragment() {
  COLOR = vertex_color;
}

NORMAL

Similmente, se si utilizza una mappa normale nel CanvasTexture, Godot la usa come predefinita e ne assegna il valore alla variabile integrata NORMAL. Se si utilizza una mappa normale progettata per l'uso in 3D, apparirà invertita. Per utilizzarla nello shader, è necessario assegnarla alla proprietà NORMAL_MAP. Godot si occuperà di convertirla per l'uso in 2D e sovrascrivere NORMAL.

NORMAL_MAP = texture(NORMAL_TEXTURE, UV).rgb;

Integrato

Descrizione

in vec4 FRAGCOORD

Coordinate del centro in pixel. Nello spazio dello schermo. xy specifica la posizione nella viewport. In alto a sinistra della viewport si trova l'origine, (0.0, 0.0).

in vec2 SCREEN_PIXEL_SIZE

Dimensioni dei singoli pixel. Equivale all'inverso della risoluzione.

in vec2 POINT_COORD

Coordinate per disegnare punti.

sampler2D TEXTURE

Texture 2D predefinita.

in vec2 TEXTURE_PIXEL_SIZE

Dimensioni normalizzate dei pixel della texture 2D predefinita. Per uno Sprite2D con una texture di 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in bool AT_LIGHT_PASS

Sempre false.

sampler2D SPECULAR_SHININESS_TEXTURE

Texture di lucidità speculare di questo oggetto.

in vec4 SPECULAR_SHININESS

Colore di lucidità speculare, come campionato dalla texture.

in vec2 UV

UV dalla funzione vertex().

in vec2 SCREEN_UV

Coordinate UV dello schermo per il pixel attuale.

sampler2D SCREEN_TEXTURE

Rimosso in Godot 4. Utilizzare invece un sampler2D con hint_screen_texture.

inout vec3 NORMAL

Lettura normale da NORMAL_TEXTURE. Scrivibile.

sampler2D NORMAL_TEXTURE

Texture 2D di normali predefinita.

out vec3 NORMAL_MAP

Configura le mappe di normali pensate per il 3D per l'uso in 2D. Se utilizzato, sovrascrive NORMAL.

out float NORMAL_MAP_DEPTH

Profondità della mappa di normali per il ridimensionamento.

inout vec2 VERTEX

Posizione del pixel nello spazio dello schermo.

inout vec2 SHADOW_VERTEX

Uguale a VERTEX ma ci si può scrivere per modificare le ombre.

inout vec3 LIGHT_VERTEX

Uguale a VERTEX, ma può essere scritto per modificare l'illuminazione. La componente Z rappresenta l'altezza.

inout vec4 COLOR

COLOR dalla funzione vertex() moltiplicato per il colore della TEXTURE. È anche l'output del valore del colore.

Variabili integrate di luce

Le funzioni processori di luce funzionano in modo diverso in Godot 4.x rispetto a Godot 3.x. In Godot 4.x tutta l'illuminazione viene eseguita durante la fase regolare di disegno. In altre parole, Godot non ridisegna più l'oggetto per ogni luce.

Utilizza la modalità di rendering unshaded se non è necessario che la funzione light() sia eseguita. Utilizza la modalità di rendering light_only se è necessario solo vedere l'impatto dell'illuminazione su un oggetto; ciò può essere utile quando si desidera che l'oggetto sia visibile solo dove è coperto dalla luce.

Se si definisce una funzione light(), questa sostituirà la funzione integrata di luce, anche se la funzione definita è vuota.

Di seguito vi è un esempio di uno shader di luce che tiene conto della mappa di normali di un CanvasItem:

void light() {
  float cNdotL = max(0.0, dot(NORMAL, LIGHT_DIRECTION));
  LIGHT = vec4(LIGHT_COLOR.rgb * COLOR.rgb * LIGHT_ENERGY * cNdotL, LIGHT_COLOR.a);
}

Integrato

Descrizione

in vec4 FRAGCOORD

Coordinate del centro in pixel. Nello spazio dello schermo. xy specifica la posizione nella viewport. In alto a sinistra della viewport si trova l'origine, (0.0, 0.0).

in vec3 NORMAL

Normale in ingresso.

in vec4 COLOR

Colore di input. Questo è l'output della funzione fragment().

in vec2 UV

UV dalla funzione vertex(), equivalente all'UV nella funzione fragment().

sampler2D TEXTURE

Texture attualmente in uso per il CanvasItem.

in vec2 TEXTURE_PIXEL_SIZE

Dimensioni normalizzate dei pixel di TEXTURE. Per uno Sprite2D con una TEXTURE di 64x32 pixel, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in vec2 SCREEN_UV

Coordinate UV dello schermo per il pixel attuale.

in vec2 POINT_COORD

UV for Point Sprite.

in vec4 LIGHT_COLOR

Il colore del Light2D. Se la luce è una PointLight2D, è moltiplicato per la texture della luce.

in float LIGHT_ENERGY

Moltiplicatore di energia del Light2D.

in vec3 LIGHT_POSITION

Posizione del Light2D nello spazio dello schermo. Se si utilizza DirectionalLight2D, questa posizione è sempre (0.0, 0.0, 0.0).

in vec3 LIGHT_DIRECTION

Direzione della Light2D nello spazio dello schermo.

in bool LIGHT_IS_DIRECTIONAL

true se questo passaggio è una DirectionalLight2D.

in vec3 LIGHT_VERTEX

Posizione del pixel nello spazio dello schermo, come modificata nella funzione fragment().

inout vec4 LIGHT

Colore in uscita per questo Light2D.

in vec4 SPECULAR_SHININESS

Lucentezza speculare, come impostata nella texture dell'oggetto.

out vec4 SHADOW_MODULATE

Moltiplica le ombre proiettate in questo punto per questo colore.

Funzioni SDF

Sono implementate alcune funzioni aggiuntive per campionare una texture con Signed Distance Field generata automaticamente. Queste funzioni sono disponibili per le funzioni fragment() e light() degli shader di CanvasItem. Anche le funzioni personalizzate possono utilizzarle, purché siano chiamate dalle funzioni supportate.

Il signed distance field viene generato dai nodi LightOccluder2D presenti nella scena con la proprietà Collisione SDF abilitata (il che è predefinito). Consultare la documentazione di Luci e ombre 2D per ulteriori informazioni.

Funzione

Descrizione

float texture_sdf (vec2 sdf_pos)

Effettua una ricerca di texture SDF.

vec2 texture_sdf_normal (vec2 sdf_pos)

Calcola una normale dalla texture SDF.

vec2 sdf_to_screen_uv (vec2 sdf_pos)

Converte un SDF in UV dello schermo.

vec2 screen_uv_to_sdf (vec2 uv)

Converte UV dello schermo in un SDF.