Shader Spatial
Spatial shaders are used for shading 3D objects. They are the most complex type of shader Godot offers. Spatial shaders are highly configurable with different render modes and different rendering options (e.g. Subsurface Scattering, Transmission, Ambient Occlusion, Rim lighting etc). Users can optionally write vertex, fragment, and light processor functions to affect how objects are drawn.
Modalità di rendering
Per esempi visivi di queste modalità di rendering, consultare Standard Material 3D e ORM Material 3D.
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 |
Premultiplied alpha blend mode (fully transparent = add, fully opaque = mix). |
depth_draw_opaque |
Only draw depth for opaque geometry (not transparent). |
depth_draw_always |
Always draw depth (opaque and transparent). |
depth_draw_never |
Never draw depth. |
depth_prepass_alpha |
Do opaque depth pre-pass for transparent geometry. |
depth_test_disabled |
Disabilita il test di profondità. |
sss_mode_skin |
Subsurface Scattering mode for skin (optimizes visuals for human skin, e.g. boosted red channel). |
cull_back |
Cull back-faces (default). |
cull_front |
Cull front-faces. |
cull_disabled |
Culling disabled (double sided). |
unshaded |
Il risultato è solo albedo. Non c'è alcuna illuminazione/ombreggiatura nel materiale, il che lo renderizza più velocemente. |
wireframe |
La geometria viene disegnata utilizzando linee (utile per risolvere problemi). |
debug_shadow_splits |
Le ombre direzionali vengono disegnate utilizzando colori diversi per ogni divisione (utile per risolvere problemi). |
diffuse_burley |
Burley (Disney PBS) for diffuse (default). |
diffuse_lambert |
Lambert shading for diffuse. |
diffuse_lambert_wrap |
Lambert-wrap shading (roughness-dependent) for diffuse. |
diffuse_toon |
Toon shading for diffuse. |
specular_schlick_ggx |
Schlick-GGX for direct light specular lobes (default). |
specular_toon |
Toon for direct light specular lobes. |
specular_disabled |
Disable direct light specular lobes. Doesn't affect reflected light (use |
skip_vertex_transform |
|
world_vertex_coords |
|
ensure_correct_normals |
Da utilizzare quando alla mesh è applicata una scala non uniforme (nota: attualmente non implementato). |
shadows_disabled |
Disable computing shadows in shader. The shader will not receive shadows, but can still cast them. |
ambient_light_disabled |
Disabilita la contribuzione della luce ambientale e della mappa di radianza. |
shadow_to_opacity |
Lighting modifies the alpha so shadowed areas are opaque and non-shadowed areas are transparent. Useful for overlaying shadows onto a camera feed in AR. |
vertex_lighting |
Use vertex-based lighting instead of per-pixel lighting. |
particle_trails |
Abilita le scie quando utilizzato sulla geometria di particelle. |
alpha_to_coverage |
Modalità di antialiasing per la trasparenza, consulta qui saperne di più. |
alpha_to_coverage_and_one |
Modalità di antialiasing per la trasparenza, consulta qui saperne di più. |
fog_disabled |
Disabilita la ricezione di nebbia volumetrica o basata sulla profondità. Utile per i materiali con |
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 |
in float PI |
Una costante |
in float TAU |
Una costante |
in float E |
Una costante |
in bool OUTPUT_IS_SRGB |
|
in float CLIP_SPACE_FAR |
Spazio di ritaglio per il valore |
Variabili integrate di vertice
I dati dei vertici (VERTEX, NORMAL, TANGENT e BITANGENT) sono presentati nello spazio modello (detto anche spazio locale). Se non vengono scritti, questi valori non saranno modificati e saranno trasmessi così come sono arrivati, poi trasformati nello spazio visivo per essere utilizzati in fragment().
Facoltativamente, si possono presentare nello spazio mondiale tramite la modalità di rendering world_vertex_coords.
Users can disable the built-in modelview transform (projection will still happen later) and do it manually with the following code:
shader_type spatial;
render_mode skip_vertex_transform;
void vertex() {
VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
NORMAL = normalize((MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
BINORMAL = normalize((MODELVIEW_MATRIX * vec4(BINORMAL, 0.0)).xyz);
TANGENT = normalize((MODELVIEW_MATRIX * vec4(TANGENT, 0.0)).xyz);
}
Anche altre variabili integrate, come UV, UV2 e COLOR, vengono passate alla funzione fragment() se non vengono modificate.
Users can override the modelview and projection transforms using the POSITION built-in. If POSITION is written
to anywhere in the shader, it will always be used, so the user becomes responsible for ensuring that it always has
an acceptable value. When POSITION is used, the value from VERTEX is ignored and projection does not happen.
However, the value passed to the fragment shader still comes from VERTEX.
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.0a1.0).z: Fotogramma di animazione.
This allows you to easily adjust the shader to a particle system using default particles material. When writing a custom particle shader, this value can be used as desired.
Integrato |
Descrizione |
|---|---|
in vec2 VIEWPORT_SIZE |
Dimensioni della viewport (in pixel). |
in mat4 VIEW_MATRIX |
Trasformazione dallo spazio mondiale allo spazio visivo. |
in mat4 INV_VIEW_MATRIX |
Trasformazione dallo spazio visivo allo spazio mondiale. |
in mat4 MAIN_CAM_INV_VIEW_MATRIX |
Trasformazione dallo spazio visivo allo spazio mondiale della telecamera utilizzata per disegnare la viewport attuale. |
in mat4 INV_PROJECTION_MATRIX |
Trasformazione dallo spazio di ritaglio allo spazio visivo. |
in vec3 NODE_POSITION_WORLD |
Posizione del nodo, nello spazio mondiale. |
in vec3 NODE_POSITION_VIEW |
Posizione del nodo, nello spazio visivo. |
in vec3 CAMERA_POSITION_WORLD |
Posizione della telecamera, nello spazio mondiale. |
in vec3 CAMERA_DIRECTION_WORLD |
Direzione della telecamera, nello spazio mondiale. |
in uint CAMERA_VISIBLE_LAYERS |
Strati di culling della telecamera che renderizza il passaggio attuale. |
in int INSTANCE_ID |
ID di istanza per l'istanziazione. |
in vec4 INSTANCE_CUSTOM |
Dati personalizzati dell'istanza (per le particelle, principalmente ). |
in int VIEW_INDEX |
La vista che stiamo renderizzando. |
in int VIEW_MONO_LEFT |
Costante per Mono o l'occhio sinistro, sempre |
in int VIEW_RIGHT |
Costante l'occhio destro, sempre |
in vec3 EYE_OFFSET |
Offset di posizione per l'occhio che si sta renderizzando. Applicabile solo per il rendering multivista. |
inout vec3 VERTEX |
Posizione del vertice, nello spazio modello. È nello spazio mondiale se si utilizza |
in int VERTEX_ID |
L'indice del vertice attuale nel buffer dei vertici. |
inout vec3 NORMAL |
Normale, nello spazio modello. È nello spazio mondiale se si utilizza |
inout vec3 TANGENT |
Tangente, nello spazio modello. È nello spazio mondiale se si utilizza |
inout vec3 BINORMAL |
Binormale, nello spazio modello. È nello spazio mondiale se si utilizza |
out vec4 POSITION |
Se scritto, sovrascrive la posizione finale del vertice nello spazio di ritaglio. |
inout vec2 UV |
Canale principale degli UV. |
inout vec2 UV2 |
Canale secondario degli UV. |
inout vec4 COLOR |
Colore dai vertici. |
out float ROUGHNESS |
Rugosità per l'illuminazione del vertice. |
inout float POINT_SIZE |
Dimensione dei punti per il rendering dei punti. |
inout mat4 MODELVIEW_MATRIX |
Trasformazione dallo spazio modello/locale allo spazio visivo (da usare se possibile). |
inout mat3 MODELVIEW_NORMAL_MATRIX |
|
in mat4 MODEL_MATRIX |
Trasformazione dallo spazio modello/locale allo spazio mondiale. |
in mat3 MODEL_NORMAL_MATRIX |
|
inout mat4 PROJECTION_MATRIX |
Trasformazione dallo spazio visivo allo spazio di ritaglio. |
in uvec4 BONE_INDICES |
|
in vec4 BONE_WEIGHTS |
|
in vec4 CUSTOM0 |
Valore personalizzato dalla primitiva del vertice. Quando si utilizzano UV aggiuntivi, |
in vec4 CUSTOM1 |
Valore personalizzato dalla primitiva del vertice. Quando si utilizzano UV aggiuntivi, |
in vec4 CUSTOM2 |
Valore personalizzato dalla primitiva del vertice. Quando si utilizzano UV aggiuntivi, |
in vec4 CUSTOM3 |
Valore personalizzato dalla primitiva del vertice. |
Nota
MODELVIEW_MATRIX combina entrambi MODEL_MATRIX e VIEW_MATRIX ed è più adatto quando potrebbero sorgere problemi di virgole mobili. Ad esempio, se l'oggetto è molto lontano dall'origine del mondo, si potrebbero verificare problemi di virgole mobili quando si utilizzano MODEL_MATRIX e VIEW_MATRIX separati.
Nota
INV_VIEW_MATRIX è la matrice utilizzata per renderizzare l'oggetto in quel passaggio, a differenza di MAIN_CAM_INV_VIEW_MATRIX, che è la matrice della telecamera nella scena. Nel passaggio di ombra, la vista di INV_VIEW_MATRIX si basa sulla telecamera che si trova nella posizione della luce.
Variabili integrate di frammento
L'uso predefinito di una funzione processore dei frammenti in Godot consiste nel configurare le proprietà del materiale dell'oggetto e lasciare che il renderer integrato gestisca lo shading finale. Tuttavia, non è obbligatorio utilizzare tutte queste proprietà e, se non le si scrive, Godot ottimizzerà la funzionalità corrispondente.
Integrato |
Descrizione |
|---|---|
in vec2 VIEWPORT_SIZE |
Dimensioni della viewport (in pixel). |
in vec4 FRAGCOORD |
Coordinata del centro in pixel nello spazio dello schermo. |
in bool FRONT_FACING |
|
in vec3 VIEW |
Vettore normalizzato dalla posizione del frammento alla telecamera (nello spazio visivo). Questo è lo stesso sia per le telecamere prospettiche sia per quelle ortogonali. |
in vec2 UV |
UV che deriva dalla funzione |
in vec2 UV2 |
UV2 che deriva dalla funzione |
in vec4 COLOR |
COLOR che deriva dalla funzione |
in vec2 POINT_COORD |
Coordinata di punto per disegnare punti con |
in mat4 MODEL_MATRIX |
Trasformazione dallo spazio modello/locale allo spazio mondiale. |
in mat3 MODEL_NORMAL_MATRIX |
Trasformazione dallo spazio modello/locale allo spazio mondiale per le normali. Questo valore è solitamente uguale a |
in mat4 VIEW_MATRIX |
Trasformazione dallo spazio mondiale allo spazio visivo. |
in mat4 INV_VIEW_MATRIX |
Trasformazione dallo spazio visivo allo spazio mondiale. |
in mat4 PROJECTION_MATRIX |
Trasformazione dallo spazio visivo allo spazio di ritaglio. |
in mat4 INV_PROJECTION_MATRIX |
Trasformazione dallo spazio di ritaglio allo spazio visivo. |
in vec3 NODE_POSITION_WORLD |
Posizione del nodo, nello spazio mondiale. |
in vec3 NODE_POSITION_VIEW |
Posizione del nodo, nello spazio visivo. |
in vec3 CAMERA_POSITION_WORLD |
Posizione della telecamera, nello spazio mondiale. |
in vec3 CAMERA_DIRECTION_WORLD |
Direzione della telecamera, nello spazio mondiale. |
in uint CAMERA_VISIBLE_LAYERS |
Strati di culling della telecamera che renderizza il passaggio attuale. |
in vec3 VERTEX |
Posizione del frammento (pixel) nello spazio visivo. È il valore |
inout vec3 LIGHT_VERTEX |
Una versione scrivibile di |
in int VIEW_INDEX |
La vista che stiamo renderizzando. Utilizzato per distinguere tra viste nel rendering multivista/stereo. |
in int VIEW_MONO_LEFT |
Costante per Mono o l'occhio sinistro, sempre |
in int VIEW_RIGHT |
Costante l'occhio destro, sempre |
in vec3 EYE_OFFSET |
Offset di posizione per l'occhio che si sta renderizzando. Applicabile solo per il rendering multivista. |
sampler2D SCREEN_TEXTURE |
Rimosso in Godot 4. Utilizzare invece un |
in vec2 SCREEN_UV |
Coordinate UV dello schermo per il pixel attuale. |
sampler2D DEPTH_TEXTURE |
Rimosso in Godot 4. Utilizzare invece un |
out float DEPTH |
Valore di profondità personalizzato (nell'intervallo di |
inout vec3 NORMAL |
Normale che deriva dalla funzione |
inout vec3 TANGENT |
Tangente che deriva dalla funzione |
inout vec3 BINORMAL |
Binormale che deriva dalla funzione |
out vec3 NORMAL_MAP |
Imposta qui la normale se legge la normale da una texture anziché da |
out float NORMAL_MAP_DEPTH |
Profondità da |
out vec3 ALBEDO |
Albedo (bianco come predefinito). Colore di base. |
out float ALPHA |
Alfa (nell'intervallo di |
out float ALPHA_SCISSOR_THRESHOLD |
Se ci si scrive, i valori inferiori a una certa quantità di alfa vengono scartati. |
out float ALPHA_HASH_SCALE |
Scala dell'hash alfa quando si utilizza la modalità di trasparenza hash alfa. Il valore predefinito è |
out float ALPHA_ANTIALIASING_EDGE |
La soglia al di sotto della quale si dovrebbe usare l'antialiasing alfa a copertura. Il valore predefinito è |
out vec2 ALPHA_TEXTURE_COORDINATE |
Le coordinate della texture da utilizzare per l'antialiasing alfa a copertura. Richiede la modalità di rendering |
out float PREMUL_ALPHA_FACTOR |
Fattore alfa premoltiplicato. Efficace solo se si utilizza |
out float METALLIC |
Metallico (nell'intervallo di |
out float SPECULAR |
Speculare (non fisicamente accurato da cambiare). Il valore predefinito è |
out float ROUGHNESS |
Rugosità (nell'intervallo di |
out float RIM |
Bordo (nell'intervallo di |
out float RIM_TINT |
Tinta del bordo, intervallo da |
out float CLEARCOAT |
Piccola macchia speculare aggiunta sopra quella esistente. Se utilizzata, Godot calcola l'effetto di rivestimento trasparente. |
out float CLEARCOAT_GLOSS |
Lucidità del rivestimento trasparente. Se utilizzato, Godot calcola l'effetto di rivestimento trasparente. |
out float ANISOTROPY |
Per distorcere la macchia speculare in base allo spazio tangente. |
out vec2 ANISOTROPY_FLOW |
Direzione della distorsione, da utilizzare con le flowmap. |
out float SSS_STRENGTH |
Intensità del subsurface scattering. Se utilizzata, il subsurface scattering sarà applicato all'oggetto. |
out vec4 SSS_TRANSMITTANCE_COLOR |
Colore della trasmittanza del subsurface scattering. Se utilizzata, la trasmittanza del subsurface scattering sarà applicata all'oggetto. |
out float SSS_TRANSMITTANCE_DEPTH |
Profondità della trasmittanza del subsurface scattering. Valori più elevati permettono all'effetto di raggiungere più in profondità nell'oggetto. |
out float SSS_TRANSMITTANCE_BOOST |
Aumenta la trasmittanza del subsurface scattering se impostato su un valore superiore a |
inout vec3 BACKLIGHT |
Colore della retroilluminazione (funziona come la luce diretta, ma è ricevuta anche se la normale è leggermente rivolta nella direzione opposta alla luce). Se utilizzata, la retroilluminazione sarà applicata all'oggetto. Si può utilizzare come approssimazione più performante del subsurface scattering. |
out float AO |
Intensità dell'occlusione ambientale. Da utilizzare con AO precalcolato. |
out float AO_LIGHT_AFFECT |
Quanto l'occlusione ambientale influisce sulla luce diretta (nell'intervallo di |
out vec3 EMISSION |
Colore di emissione (può superare |
out vec4 FOG |
Se ci si scrive, fonde il colore finale del pixel con |
out vec4 RADIANCE |
Se ci si scrive, fonde la radianza della mappa ambientale con |
out vec4 IRRADIANCE |
Se ci si scrive, fonde l'irradianza della mappa ambientale con |
Nota
Gli shader che passano per la pipeline trasparente quando si scrive su ALPHA potrebbero presentare problemi di ordinamento per trasparenza. Consultare la sezione sull'ordinamento per trasparenza nella pagina sulle limitazioni del rendering 3D per ulteriori informazioni e modi per evitare problemi.
Variabili integrate di luce
Scrivere funzioni processori di luce è completamente facoltativo. È possibile ignorare la funzione light() utilizzando la modalità di rendering unshaded. Se nessuna funzione di luce viene scritta, Godot userà le proprietà del materiale scritte nella funzione fragment() per calcolare l'illuminazione (a seconda della modalità di rendering).
La funzione light() viene chiamata per ogni luce in ogni pixel. Viene chiamata all'interno di un ciclo per ogni tipo di luce.
Di seguito è riportato un esempio di una funzione light() personalizzata che utilizza un modello di illuminazione lambertiano:
void light() {
DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * LIGHT_COLOR / PI;
}
Se si desidera che le luci si sommino, aggiungere il contributo della luce a DIFFUSE_LIGHT tramite +=, anziché sovrascriverlo.
Avvertimento
La funzione light() non sarà eseguita se la modalità di rendering vertex_lighting è abilitata o se Rendering > Qualità > Shading > Forza l'ombreggiatura per vertice è abilitato nelle Impostazioni del progetto. (È abilitato come predefinito sulle piattaforme mobili.)
Integrato |
Descrizione |
|---|---|
in vec2 VIEWPORT_SIZE |
Dimensioni della viewport (in pixel). |
in vec4 FRAGCOORD |
Coordinate del centro in pixel nello spazio dello schermo. |
in mat4 MODEL_MATRIX |
Trasformazione dallo spazio modello/locale allo spazio mondiale. |
in mat4 INV_VIEW_MATRIX |
Trasformazione dallo spazio visivo allo spazio mondiale. |
in mat4 VIEW_MATRIX |
Trasformazione dallo spazio mondiale allo spazio visivo. |
in mat4 PROJECTION_MATRIX |
Trasformazione dallo spazio visivo allo spazio di ritaglio. |
in mat4 INV_PROJECTION_MATRIX |
Trasformazione dallo spazio di ritaglio allo spazio visivo. |
in vec3 NORMAL |
Vettore normale, nello spazio visivo. |
in vec2 SCREEN_UV |
Coordinate UV dello schermo per il pixel attuale. |
in vec2 UV |
UV che deriva dalla funzione |
in vec2 UV2 |
UV2 che deriva dalla funzione |
in vec3 VIEW |
Vettore di vista, nello spazio visivo. |
in vec3 LIGHT |
Vettore di luce, nello spazio visivo. |
in vec3 LIGHT_COLOR |
Colore della luce moltiplicato per energia della luce moltiplicato per |
in float SPECULAR_AMOUNT |
Per OmniLight3D e SpotLight3D, |
in bool LIGHT_IS_DIRECTIONAL |
|
in float ATTENUATION |
Attenuazione basata sulla distanza o sull'ombra. |
in vec3 ALBEDO |
Albedo di base. |
in vec3 BACKLIGHT |
|
in float METALLIC |
Metallico. |
in float ROUGHNESS |
Rugosità. |
out vec3 DIFFUSE_LIGHT |
Risultato della luce diffusa. |
out vec3 SPECULAR_LIGHT |
Risultato della luce speculare. |
out float ALPHA |
Alfa (nell'intervallo di |
Nota
Gli shader che passano per la pipeline trasparente quando si scrive su ALPHA potrebbero presentare problemi di ordinamento per trasparenza. Consultare la sezione sull'ordinamento per trasparenza nella pagina sulle limitazioni del rendering 3D per ulteriori informazioni e modi per evitare problemi.
Inoltre, i materiali trasparenti non possono proiettare ombre o apparire nelle uniformi hint_screen_texture e hint_depth_texture. Ciò a sua volta impedisce che tali materiali appaiano in riflessi o rifrazioni nello spazio dello schermo. i riflessi netti SDFGI non sono visibili sui materiali trasparenti (per essi sono visibili solo riflessi approssimativi).