Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Luci e ombre 3D
Introduzione
Le sorgenti luminose emettono luce che si fonde ai materiali e produce un risultato visibile. La luce può provenire da diversi tipi di sorgenti in una scena:
Dal materiale stesso, sotto forma di colore di emissione (sebbene non influisca sugli oggetti vicini, a meno che non sia abilitata l'illuminazione indiretta precalcolata o nello spazio dello schermo).
Light nodes: DirectionalLight3D, OmniLight3D, SpotLight3D, and AreaLight3D.
Luce ambientale in Environment o Sonde di riflessi.
Illuminazione globale (LightmapGI, VoxelGI o SDFGI).
Il colore di emissione è una proprietà del materiale. Si può saperne di più nel tutorial Standard Material 3D and ORM Material 3D.
Vedi anche
È possibile confrontare vari tipi di luci in azione attraverso il progetto demo Luci e ombre 3D.
Nodi di luce
There are four types of light nodes: DirectionalLight3D, OmniLight3D, SpotLight3D, and AreaLight3D. Let's take a look at the common parameters for lights:
Ogni proprietà ha una funzione specifica:
Colore: colore base della luce emessa.
Energia: moltiplicatore di energia. Utile per saturare le luci o per lavorare con Illuminazione ad alta gamma dinamica.
Energia indiretta: moltiplicatore secondario utilizzato con la luce indiretta (rimbalzi della luce). Funziona con Utilizzare l'illuminazione globale con lightmap, VoxelGI o SDFGI.
Energia della nebbia volumetrica: moltiplicatore secondario utilizzato con la nebbia volumetrica. Ha effetto solo quando la nebbia volumetrica è abilitata.
Negativa: la luce diventa sottrattiva anziché additiva. A volte è utile compensare manualmente alcuni angoli bui.
Speculare: influisce sull'intensità della macchia speculare negli oggetti colpiti da questa luce. A zero, questa luce diventa una luce puramente diffusa.
Modo di precalcolo: imposta la modalità di precalcolo per la luce. Consultare Utilizzare l'illuminazione globale con lightmap.
Maschera di selezione: Gli oggetti che si trovano negli strati selezionati sottostanti saranno influenzati da questa luce. Si noti che gli oggetti disabilitati tramite questa maschera di culling proietteranno comunque ombre. Se non si desidera che gli oggetti disabilitati proiettino ombre, regolare la proprietà Proietta ombra su GeometryInstance3D al valore desiderato.
Vedi anche
Consultare Unità fisiche di luce e telecamera se si desidera utilizzare unità di misura del mondo reale per configurare l'intensità e la temperatura del colore delle luci.
Limiti al numero di luci
When using the Forward+ renderer, Godot uses a clustering approach for real-time lighting. As many lights as desired can be added (as long as performance allows). However, there's still a default limit of 512 clustered elements that can be present in the current camera view. A clustered element is an omni light, a spot light, an area light, a decal, or a reflection probe. This limit can be increased by adjusting Max Clustered Elements in Project Settings > Rendering > Limits > Cluster Builder.
Utilizzando il renderer Mobile, c'è un limite di 8 OmniLight + 8 SpotLight per ogni risorsa mesh. C'è anche un limite di 256 OmniLight + 256 SpotLight che si possono renderizzare nella vista della telecamera attuale. Al momento non è possibile cambiare questi limiti.
Utilizzando il renderer Compatibilità, è possibile renderizzare fino a 8 OmniLight + 8 SpotLight per ogni risorsa mesh. È possibile aumentare questo limite nelle Impostazioni del progetto avanzate regolando il Numero massimo di elementi renderizzabili e/o Numero massimo di luci per oggetto in Rendering > Limiti > OpenGL, a scapito delle prestazioni e di tempi più lunghi per compilare gli shader. È possibile anche ridurre il limite per ridurre i tempi di compilazione degli shader e migliorare leggermente le prestazioni.
Con tutti i metodi di rendering, è possibile visualizzare fino a 8 DirectionalLight allo stesso tempo. Tuttavia, ogni DirectionalLight in più con ombre abilitate ridurrà la risoluzione effettiva delle ombre di ogni DirectionalLight. Questo perché l'atlante delle ombre direzionali è condiviso tra tutte le luci.
Se si supera il limite di rendering, le luci cominceranno a comparire e scomparire durante il movimento della telecamera, il che può essere fastidioso. Abilitare Dissolvenza a distanza sui nodi di luce può aiutare a ridurre questo problema, migliorando allo stesso tempo le prestazioni. Anche suddividere le mesh in porzioni più piccole può aiutare, soprattutto per la geometria dei livelli (il che migliora anche l'efficienza del culling).
Se è necessario renderizzare più luci di quante ne sia possibile in un certo renderer, considera di utilizzare lightmap precalcolate con la modalità di precalcolo delle luci impostata su Static. Questo consente alle luci di essere completamente precalcolare, rendendole anche molto più rapide da renderizzare. Si possono anche utilizzare materiali emissivi con qualsiasi tecnica di illuminazione globale al posto dei nodi di luce per emettere luce su un'area più ampia.
Mappatura delle ombre
Le luci possono facoltativamente proiettare ombre. Questo offre loro un maggiore realismo (la luce non raggiunge le aree occluse), ma può comportare un maggiore costo di prestazioni. Esiste un elenco di parametri generici per le ombre, ognuno dei quali ha una funzione specifica:
Enabled: selezionare per abilitare la mappatura delle ombre in questa luce.
Opacità: le aree occluse sono oscurate da questo fattore di opacità. Le ombre sono completamente opache normalmente, ma si può cambiare per renderle traslucide per una determinata luce.
Bias: quando questo parametro è troppo basso, le ombre degli oggetti rischiano di proiettarsi su loro stessi. Quando è troppo alto, le ombre si separano dalla loro origine. Regolare il valore in base alle proprie esigenze.
Bias normale: quando questo parametro è troppo basso, le ombre degli oggetti rischiano di proiettarsi su loro stessi. Quando è troppo alto, le ombre appaiono disallineate rispetto alla loro origine. Regolare il valore in base alle proprie esigenze.
Transmittance Bias: When this parameter is too low, self-shadowing occurs on materials that have transmittance enabled. When too high, shadows will not affect materials that have transmittance enabled consistently. Tweak to what works best for you.
Reverse Cull Face: alcune scene funzionano meglio quando le ombre sono renderizzate con il face culling invertito.
Blur: moltiplica il raggio di sfocatura dell'ombra per questa luce. Funziona sia con la mappatura delle ombre tradizionale sia con le ombre contact-hardening (luci con Angular Distance o Size maggiore di
0.0). Valori più alti producono ombre più sfumate, che appariranno anche più stabili nel tempo per gli oggetti in movimento. Lo svantaggio di aumentare la sfocatura è che renderà più evidente il motivo granuloso usato per il filtro. Vedi anche Modalità di filtro delle ombre.Caster Mask: Shadows are only cast by objects in these layers. Note that this mask does not affect which objects shadows are cast onto.
Aggiustare il bias delle ombre
Di seguito è riportata un'immagine che mostra cosa succede regolando il bias. I valori predefiniti funzionano nella maggior parte dei casi, ma in generale, dipendono dalle dimensioni e dalla complessità della geometria.
Se il Shadow Bias o il Shadow Normal Bias è impostato su un valore troppo basso per una determinata luce, l'ombra sarà "sbavata" sugli oggetti. Ciò oscurerà l'aspetto previsto della luce, fenomeno noto come acne d'ombra:
D'altra parte, se il Shadow Bias o il Shadow Normal Bias sono impostati su un valore troppo alto per una determinata luce, l'ombra potrebbe apparire scollegata dall'oggetto. Questo fenomeno è detto peter-panning:
In generale, è preferibile aumentare Shadow Normal Bias piuttosto che Shadow Bias. Aumentare Shadow Normal Bias non causa lo stesso effetto peter-panning di Shadow Bias, ma può comunque correggere efficacemente gran parte dei problemi di acne d'ombra. Lo svantaggio di aumentare Shadow Normal Bias è che può far apparire le ombre più sottili per alcuni oggetti.
Qualsiasi sorta di problema di bias si può correggere aumentando la risoluzione della mappa delle ombre, a scapito delle prestazioni.
Nota
Regolare le impostazioni della mappatura delle ombre è un'arte: non esistono impostazioni "a taglia unica". Per ottenere i migliori risultati visivi, potrebbe essere necessario utilizzare valori di bias diversi per ogni singola luce.
Nota sui cambiamenti all'aspetto: abilitando le ombre su una luce, tieni presente che l'aspetto della luce potrebbe cambiare rispetto a quando è renderizzata senza ombre nel renderer di Compatibilità. A causa delle limitazioni dei dispositivi mobili più vecchi, le ombre sono implementate usando un approccio di rendering multi-pass, quindi le luci con ombre sono renderizzate nello spazio sRGB anziché nello spazio lineare. Questo cambio dello spazio di rendering può talvolta alterare drasticamente l'aspetto della luce. Per ottenere un aspetto simile a quello di una luce senza ombre, potrebbe essere necessario regolare l'impostazione dell'energia della luce.
Luce direzionale
Questo è il tipo di luce più comune e rappresenta una sorgente luminosa molto distante (come il sole). È anche la luce meno costosa da calcolare e si dovrebbe utilizzare ogni volta che è possibile (sebbene non sia la mappa delle ombre meno costosa da calcolare, ma ne parleremo più avanti).
I modelli di illuminazione direzionale simulano un numero infinito di raggi luminosi paralleli che illuminano l'intera scena. Il nodo di luce direzionale è rappresentato da una grande freccia che indica la direzione dei raggi luminosi. Tuttavia, la posizione del nodo non influisce proprio sull'illuminazione e può essere ovunque.
Ogni superficie la cui parte frontale è colpita dai raggi luminosi è illuminata, mentre le altre rimangono al buio. A differenza di quasi tutti gli altri tipi di luce, le luci direzionali non hanno parametri specifici.
La luce direzionale offre anche una proprietà Angular Distance, che determina l'ampiezza angolare della luce, in gradi. Aumentando questo valore oltre 0.0, le ombre risulteranno più sfumate a distanze maggiori dalla loro sorgente , influenzando anche l'aspetto del sole nei materiali procedurali del cielo (procedural sky). Questa è detta contact-hardening shadow (nota anche come PCSS).
Per riferimento, la distanza angolare del Sole visto dalla Terra è di circa 0.5. Questo tipo di ombra è costoso, quindi dare un'occhiata le raccomandazioni in Raccomandazioni per PCSS se si imposta questo valore oltre 0.0 sulle luci con ombre abilitate.
Mappatura delle ombre direzionali
Per calcolare le mappe delle ombre, la scena è renderizzata (solo la profondità) da un punto di vista ortogonale che copre l'intera scena (o fino alla distanza massima). C'è, tuttavia, un problema con questo approccio, perché gli oggetti più vicini alla telecamera ricevono ombre a bassa risoluzione che possono apparire squadrate.
Per risolverlo, si utilizza una tecnica chiamata Parallel Split Shadow Maps (PSSM). Questa tecnica divide il frustum di visualizzazione in 2 o 4 aree. Ogni area ottiene la propria mappa delle ombre. Ciò consente alle piccole aree vicine all'osservatore di avere la stessa risoluzione delle ombre di un'area enorme e lontana. Quando le ombre sono abilitate per DirectionalLight3D, la modalità predefinita è PSSM con 4 divisioni. Negli scenari in cui un oggetto è abbastanza grande da apparire in tutte e quattro le divisioni, ci sarà un aumento delle chiamate di disegno. Nello specifico, tale oggetto verrà renderizzato cinque volte in totale: una volta per ciascuna delle quattro divisioni delle ombre e una volta per il rendering finale della scena. Questo può influire sulle prestazioni; è importante comprendere questo comportamento per ottimizzare la scena e gestire le aspettative di prestazioni.
Con questo, le ombre diventano più dettagliate:
Per controllare PSSM, sono esposti vari parametri:
Ogni distanza di divisione è relativa alla distanza lontana (far) della telecamera (o alla Max Distance dell'ombra se maggiore di 0.0). 0.0 corrisponde alla posizione dell'occhio e 1.0 è il punto in cui l'ombra termina a distanza. Le divisioni si trovano tra questi due valori. I valori predefiniti generalmente funzionano bene, ma è comune regolare leggermente la prima divisione per dare più dettagli agli oggetti vicini (come un personaggio in un gioco in terza persona).
Assicurarsi sempre di impostare la Max Distance delle ombre in base alle esigenze della scena. Una distanza massima più bassa produrrà ombre dall'aspetto migliore e prestazioni migliori, poiché meno oggetti dovranno essere inclusi nel rendering delle ombre. È anche possibile regolare Fade Start per controllare l'intensità della dissolvenza delle ombre in lontananza. Per le scene in cui la Max Distance copre completamente la scena in qualsiasi posizione della telecamera, è possibile aumentare Fade Start a 1.0 per evitare che l'ombra si dissolva in lontananza. Non si dovrebbe fare in scene in cui la Max Distance non copre completamente la scena, poiché l'ombra apparirà tagliata bruscamente in lontananza.
A volte, la transizione tra una divisione e la prossima può sembrare sbrutta. Per correggerlo, è possibile attivare Blend Splits, che sacrifica dettagli e prestazioni in cambio di transizioni più fluide:
Il parametro Shadow > Normal Bias può servire per correggere casi particolari di auto-ombreggiatura quando gli oggetti sono perpendicolari alla luce. L'unica pecca è che rende l'ombra leggermente più sottile. È consigliabile aumentare Shadow > Normal Bias prima di aumentare Shadow > Bias nella maggior parte delle situazioni.
Infine, Pancake Size è una proprietà che si può regolare per correggere eventuali ombre mancanti quando si utilizzano oggetti grandi con mesh non suddivise. Cambiare questo valore solo se si notano ombre mancanti non causati da problemi di bias delle ombre.
Directional contact shadows
Nota
Contact shadows are only available in the Forward+ renderer.
By default, contact shadows are allowed in each DirectionalLight3D, but they are not rendered unless Rendering > Lights and Shadows > Contact Shadow > Enabled is checked in the Project Settings.
DirectionalLight3D also supports contact shadows, which are screen-space shadows that are rendered in a separate pass. This allows for detailed small-scale shadows to be rendered, which has several benefits.
Objects get better contact hardening, which means objects look more grounded in the scene by having shadows become progressively sharper the closer the surface is to the caster:
Objects that are too small to be rendered in the shadow map will still cast contact shadows. This is useful for small objects like foliage, debris, and other small details that would otherwise not cast shadows:
Objects with Geometry > Cast Shadow set to Off (typically for performance reasons) will still cast contact shadows, as long as they write to the depth buffer.
Objects that are opaque or use alpha scissor/hash transparency write to depth by default. Objects with the Depth Pre-Pass transparency mode also write to the depth buffer and can cast contact shadows, but they will not receive contact shadows. Objects with the Alpha transparency mode do not write to the depth buffer, and won't cast or receive contact shadows.
DirectionalLight3D offers several properties to control contact shadows:
Allowed: This is the checkbox in the contact shadows section of the inspector. If unchecked, the light won't cast contact shadows even if the project setting is enabled.
Opacity: This controls how dark the contact shadows are. A value of
1.0results in opaque contact shadows, while lower values result in less visible contact shadows.Blur: This controls how blurry the contact shadows are. A value of
0.0means contact shadows are as sharp as possible, while higher values result in softer contact shadows. When using contact shadows primarily for foliage, you may want to increase this value to make the shadows appear softer and more natural.
Enabling contact shadows has a moderate GPU performance cost, but it is generally cheaper than increasing the shadow map resolution. Since contact shadows make it more viable to disable shadow casting on small objects, they can indirectly improve performance, especially with a large number of small objects (such as grass).
The maximum length of contact shadows is determined by the Rendering > Lights and Shadows > Contact Shadow > Shadow Length project setting. Higher values provide better coverage (especially at higher viewport resolutions and at more grazing light angles), but are more demanding on the GPU.
Lastly, you can also adjust the Rendering > Lights and Shadows > Contact Shadow > Surface Thickness project setting. Higher values widen the depth interval in which an occluder is considered to block light, which can fill in gaps in thin geometry but may also cause shadows to bleed through surfaces if set too high.
Nota
Since contact shadows are rendered in screen space, they are limited to what's visible on screen. Off-screen objects will not cast contact shadows, and objects occluded by other objects won't cast contact shadows either.
Luce omnidirezionale
Omni light è una sorgente puntiforme che emette luce sfericamente in tutte le direzioni entro una determinata portata.
Nella vita reale, l'attenuazione della luce è una funzione inversa, il che significa che le luci omnidirezionali non hanno una portata. Questo è un problema perché implica che calcolare numerose luci omnidirezionali diventerebbe impegnativo.
Per rimediare, viene introdotto un parametro Range insieme a una funzione di attenuazione.
Questi due parametri consentono di aggiustare visivamente il funzionamento per ottenere risultati esteticamente gradevoli.
Un parametro Size è anche disponibile in OmniLight3D. Aumentando questo valore, la luce si attenuerà più lentamente e le ombre appariranno più sfocate quando la sorgente è lontana. Può servire per simulare le luci d'area, fino a un certo punto. L'ombra è detta contact-hardening shadow (anche nota come PCSS). Questo tipo di ombra è costoso, quindi si consiglia di consultare le raccomandazioni in Raccomandazioni per PCSS se si imposta questo valore su un valore più grande di 0.0 per le luci con le ombre abilitate.
Mappatura di ombre omnidirezionali
La mappatura delle ombre dalle luci omnidirezionali è relativamente semplice. Il problema principale da considerare è l'algoritmo utilizzato per renderizzarle.
Le ombre omnidirezionali si possono renderizzare con mappatura Dual Paraboloid o Cube. La mappatura Dual Paraboloid è veloce, ma può causare deformazioni, mentre la Cube è più precisa, ma più lenta. La mappatura predefinita è Cube, ma si consiglia di passare a Dual Paraboloid per le luci per cui non fa molta differenza visiva.
Se gli oggetti da renderizzare sono perlopiù irregolari e suddivisi, Dual Paraboloid solitamente basta. In ogni caso, poiché queste ombre sono memorizzate in un atlante di ombre (maggiori dettagli alla fine), potrebbe non fare alcuna differenza sulle prestazioni per la maggior parte delle scene.
Le luci omnidirezionali con ombre abilitate possono utilizzare i proiettori. La texture di proiettore moltiplica il colore della luce per il colore in un determinato punto nella texture. Di conseguenza, le luci appariranno generalmente più scure una volta assegnata una texture di proiettore; è possibile aumentare Energy per compensare.
Le texture di proiettore per le luci omnidirezionali richiedono una mappatura speciale panoramica a 360°, simile alle texture di PanoramaSkyMaterial.
Con la texture di proiettore mostrata di seguito, si ottiene il seguente risultato:
Suggerimento
If you have omni projectors in the form of cubemap images, you can use this web-based conversion tool to convert them to a single panorama image.
Luce spot
Le luci spot sono simili alle luci omnidirezionali, con la differenza che emettono luce solo in un cono (o "angolo di taglio"). Sono utili per simulare torce elettriche, fari per auto, catarifrangenti, faretti, ecc. Questo tipo di luce è inoltre attenuato nella direzione opposta a quella verso cui è puntato.
Le luci spot condividono la stessa portata, attenuazione e dimensione di OmniLight3D, e aggiungono due parametri in più:
Angle: l'angolo di apertura della luce.
Angle Attenuation: l'attenuazione del cono, che contribuisce a sfumare i bordi del cono.
Mappatura delle ombre spot
Le luci spot hanno gli stessi parametri delle luci omnidirezionali per la mappatura delle ombre. Renderizzare le ombre delle luci spot è significativamente più veloce rispetto alle luci omnidirezionali, poiché è necessario renderizzare una sola texture d'ombra (invece di renderizzare 6 facce, o 2 in modalità a doppio paraboloide).
Le luci spot con ombre abilitate possono utilizzare i proiettori. La texture di proiettore moltiplica il colore della luce per il colore in un determinato punto nella texture. Di conseguenza, le luci appariranno generalmente più scure una volta assegnata una texture di proiettore; è possibile aumentare Energy per compensare.
A differenza dei proiettori delle luci omnidirezionali, la texture di proiettore di una luce spot non necessita di seguire un formato speciale per apparire corretta. Sarà mappata in modo simile a una decalcomania.
Con la texture di proiettore mostrata di seguito, si ottiene il seguente risultato:
Nota
Le luci spot con angoli ampi produrranno ombre di qualità inferiore rispetto alle luci spot con angoli stretti, poiché la mappa delle ombre è distribuita su una superficie più ampia. Con angoli superiori a 89 gradi, le ombre delle luci spot smetteranno di funzionare completamente. Se hai bisogno di ombre per luci più ampie, usa invece una luce omnidirezionale.
Luce d'area
A volte, si desidera che l'illuminazione provenga da un'ampia area anziché da un singolo punto. Le luci d'area sono utili per simulare un'illuminazione tenue e diffusa, come la luce proveniente da una finestra o da un cartellone pubblicitario illuminato.
Godot fornisce il nodo AreaLight3D per questo scopo, che emette luce da un'area rettangolare. Il nodo emette solo luce e non ha altre rappresentazioni visive nella scena. Gli screenshot seguenti utilizzano un nodo Sprite3D come figlio della luce d'area a scopo di visualizzazione.
Avvertimento
Questo tipo di luce è il più esigente da renderizzare in tempo reale. Si dovrebbe utilizzare con moderazione, soprattutto quando le ombre sono abilitate. Si consiglia solo per le sequenze cinematiche o quando si punta a dispositivi di fascia alta.
In Forward+, non appena una luce d'area è visibile nel frustum di visualizzazione, comporta un costo aggiuntivo sulle prestazioni per tutti gli oggetti renderizzati nella scena, anche quelli non raggiunti da una luce d'area. Questo compromesso consente di renderizzare un numero maggiore di luci d'area (illuminazione clusterizzata).
In Mobile e Compatibilità, solo gli oggetti raggiunti da una luce d'area comportano un costo aggiuntivo sulle prestazioni.
Le luci d'area possono anche proiettare ombre, con penombra variabile simulata tramite PCSS come valore predefinito. La dimensione di questa penombra si può controllare con la proprietà Size del Light3D. Questo effetto può essere piuttosto impegnativo, quindi si può disattivare impostando Size su 0.0.
Nota
Le ombre proiettate da una luce d'area potrebbero apparire errate se l'oggetto che le proietta non ha abbastanza suddivisioni ed è molto vicino alla luce d'area. Questa è la stessa limitazione della modalità d'ombra Dual Paraboloid su una luce omnidirezionale.
Nota
Poiché le luci d'area sono difficili da simulare in un renderer rasterizzato in tempo reale, presentano certe limitazioni.
Per piccole sorgenti luminose, è probabile che si ottengano risultati migliori usando luci puntiformi. Le ombre generate dalle luci d'area sono approssimazioni grossolane, poiché sono calcolate come se fossero luci puntiformi, e potrebbero apparire distorte ai bordi. Per ottenere un risultato migliore, assicurarsi che le mesh nella portata della luce siano suddivise abbastanza.
Le luci d'area soffrono di perdite di luce sul retro degli oggetti geometrici posti proprio di fronte a loro con angolazioni radenti, quindi bisogna fare attenzione a dove posizionarle.
Infine, non tutte le funzionalità dei materiali sono completamente supportate; le luci d'area sono praticamente limitate alla diffusione lambertiana e alla specularità GGX, mentre i materiali anisotropi appariranno come se fossero isotropi. Nemmeno l'ombreggiatura per vertice è implementata per le luci d'area.
Le luci d'area emettono luce in un'area rettangolare definita dalla proprietà Area > Size (da non confondere con la proprietà generica Size di Light3D). Per ottenere un risultato fisicamente accurato, è necessario ridimensionare quest'area così da corrispondere alle dimensioni della sorgente luminosa reale che si sta cercando di simulare. Ad esempio, se si sta simulando un tubo al neon di 1 metro di lunghezza e 10 centimetri di larghezza, impostare la dimensione dell'area su (1, 0.1) e regolare l'energia adeguatamente.
Come predefinito, l'energia della luce è normalizzata: maggiore è l'area, più debole è la luce. Ciò consente di cambiare le dimensioni dell'area senza dover regolare l'energia per compensare, il che è utile per le animazioni. È possibile disabilitare questo comportamento deselezionando Area > Normalize Energy se si desidera che l'energia sia indipendente dalle dimensioni dell'area.
L'area rettangolare può essere opzionalmente texturizzata. Questo può servire efficacemente per cambiare la forma della luce in qualsiasi forma 2D, o per tingerla con colori diversi. Il canale alfa della texture è trattato come nero (nessuna luce lo attraversa). La texture della luce d'area sarà visibile nei riflessi in base alla rugosità della superficie. Questo comportamento è diverso da quello dei proiettori omnidirezionali/spot, in quanto non proietta la texture direttamente su tutta la luce diffusa.
Quando si utilizzano texture trasparenti o nere verso i bordi, potrebbe essere opportuno lasciare uno spazio di qualche pixel per garantire che la texture appaia sfumata gradualmente.
Nota
Modificare la texture di una luce d'area in fase di esecuzione può essere costoso, soprattutto se la texture è grande.
Per ridurre l'impatto sulle prestazioni del cambio di texture in fase di esecuzione, assicurarsi che ogni dimensione di una texture di area sia un multiplo di 128 pixel, o una potenza di due. Questo elimina la necessità di un passaggio di ridimensionamento, il che rallenterebbe i cambi di texture. Le texture non devono necessariamente essere quadrate per essere ottimali. Esempi di dimensioni ottimali per le texture includono 32×64, 128×128 e 256×384.
Le luci d'area texturizzate non sono supportate nel renderer Compatibilità.
Atlante delle ombre
Unlike Directional lights, which have their own shadow texture, omni, spot, and area lights are assigned to slots of a shadow atlas. This atlas can be configured in the advanced Project Settings (Rendering > Lights And Shadows > Positional Shadow).
La risoluzione si applica all'intero atlante delle ombre. Questo atlante è diviso in quattro quadranti:
Ciascun quadrante può essere ulteriormente suddiviso per allocare un numero qualsiasi di mappe d'ombra; la suddivisione predefinita è la seguente:
L'atlante delle ombre assegna lo spazio come segue:
La dimensione più grande della mappa delle ombre (quando nessuna suddivisione è utilizzata) rappresenta una luce delle dimensioni dello schermo (o più grande).
Le suddivisioni (mappe più piccole) rappresentano le ombre delle luci più lontane dal punto di vista e proporzionalmente più piccole.
Per ogni frame, la seguente procedura viene effettuata per tutte le luci:
Verifica che la luce stia in uno slot della dimensione corretta. Se non, ri-renderizzala e trasferiscila in uno slot più grande/più piccolo.
Verifica se qualunque oggetto che influenza la mappa delle ombre è cambiato. Se sì, ri-renderizza la luce.
Se nessuna delle condizioni precedenti è avvenuta, non si fa nulla e l'ombra rimane intatta.
Se gli slot in un quadrante sono pieni, le luci vengono rimandate in slot più piccoli, a seconda delle dimensioni e della distanza. Se tutti gli slot in tutti i quadranti sono pieni, alcune luci non saranno in grado di renderizzare ombre anche se le loro ombre sono abilitate.
La strategia predefinita di allocazione delle ombre consente di renderizzare un massimo di 88 luci con ombre abilitate nel frustum della telecamera (4 + 4 + 16 + 64):
Il primo e più dettagliato quadrante può memorizzare 4 ombre.
Il secondo quadrante può contenere altre 4 ombre.
Il terzo quadrante può memorizzare 16 ombre, con meno dettagli.
Il quarto e meno dettagliato quadrante può memorizzare 64 ombre, con ancora meno dettagli.
Utilizzare un numero maggiore di ombre per quadrante consente di supportare una quantità maggiore di luci totali con ombre abilitate, migliorando al contempo le prestazioni (poiché le ombre saranno renderizzate a una risoluzione più bassa per ciascuna luce). Tuttavia, aumentare il numero di ombre per ogni quadrante porta a ridurre la qualità delle ombre.
In alcuni casi, potrebbe essere opportuno utilizzare una strategia di allocazione diversa. Ad esempio, in un gioco con visuale dall'alto in cui tutte le luci hanno più o meno le stesse dimensioni, si potrebbe voler impostare tutti i quadranti con la stessa suddivisione in modo che tutte le luci abbiano ombre con un simile livello di qualità.
Equilibrare le prestazioni e la qualità
Il rendering delle ombre è un aspetto cruciale per le prestazioni del rendering 3D. È importante fare le scelte giuste per evitare di creare colli di bottiglia.
Le impostazioni di qualità delle ombre direzionali si possono cambiare in fase di esecuzione richiamando gli appositi metodi del RenderingServer.
Positional (omni/spot/area) shadow quality settings can be changed at runtime on the root Viewport.
Dimensioni della mappa delle ombre
Un'alta risoluzione delle ombre risulta in ombre più nitide, ma a un impatto significativo sulle prestazioni. Va inoltre notato che ombre più nitide non sono sempre più realistiche. Nella maggior parte dei casi, è consigliabile mantenere il valore predefinito di 4096 o ridurlo a 2048 per le GPU di fascia bassa.
Se le ombre posizionali diventano troppo sfocate dopo aver ridotto le dimensioni della mappa delle ombre, è possibile compensare regolando i quadranti dell'atlante delle ombre in modo che contengano meno ombre. Ciò consentirà a ciascuna ombra di essere renderizzata a una risoluzione più alta.
Modalità di filtro delle ombre
Qui è possibile scegliere diverse impostazioni di qualità per la mappa delle ombre. Il valore predefinito Soft Low è un buon compromesso tra prestazioni e qualità per le scene con texture dettagliate, poiché il livello di dettaglio delle texture aiuta a rendere meno evidente l'effetto dithering.
Tuttavia, nei progetti con texture meno dettagliate, il motivo di dithering nelle ombre si potrebbe notare di più. Per nascondere questo motivo, è possibile abilitare Antialiasing temporale (TAA), AMD FidelityFX Super Resolution 2.2 (FSR2), Antialiasing approssimativo rapido (FXAA) oppure aumentare la qualità del filtro delle ombre a Soft Medium o superiore.
L'impostazione Soft Very Low ridurrà automaticamente la sfocatura delle ombre per rendere meno visibili gli artefatti dovuti al basso numero di campioni. Inversamente, le impostazioni Soft High e Soft Ultra aumenteranno automaticamente la sfocatura delle ombre per sfruttare al meglio il maggior numero di campioni.
16 bit contro 32 bit
Come predefinito, Godot utilizza texture di profondità a 16 bit per renderizzare le mappe delle ombre. Questo è consigliato nella maggior parte dei casi, in quanto offre prestazioni migliori senza una differenza di qualità percepibile.
Se l'opzione 16 bit è disabilitata, saranno utilizzate texture di profondità a 32 bit. Ciò può ridurre gli artefatti in scene complesse e con luci intense e ombre abilitate. Tuttavia, la differenza è spesso a malapena percettibile, eppure può avere un impatto drastico sulle prestazioni.
Dissolvenza a distanza di luci/ombre
OmniLight3D, SpotLight3D, and AreaLight3D offer several properties to hide distant lights. This can improve performance significantly in large scenes with dozens of lights or more.
Enabled: controlla se la dissolvenza a distanza (una forma di LOD) è abilitata. La luce svanirà gradualmente per Begin + Length, dopodiché sarà scartata e non inviata proprio allo shader. Utilizzare questa opzione per ridurre il numero di luci attive in una scena e quindi migliorare le prestazioni.
Begin: la distanza dalla telecamera alla quale la luce inizia a svanire (in unità 3D).
Shadow: la distanza dalla telecamera alla quale l'ombra inizia a svanire (in unità 3D). Si può utilizzare per far svanire le ombre più presto rispetto alla luce, migliorando ulteriormente le prestazioni. Disponibile solo se le ombre sono abilitate per la luce.
Length: la distanza su cui la luce e l'ombra svaniscono (in unità 3D). La luce diventa gradualmente più trasparente su questa distanza, fino a diventare completamente invisibile. Valori più elevati rendono la dissolvenza più graduale, più adatta quando la telecamera si muove velocemente.
Raccomandazioni per PCSS
Le percentage-closer soft shadows (PCSS) offrono un aspetto più realistico alla mappatura delle ombre, con la dimensione della penombra che varia a seconda della distanza tra la sorgente luminosa e la superficie che riceve l'ombra. Questo comporta un elevato impatto sulle prestazioni, soprattutto per le luci direzionali.
Per evitare problemi di prestazioni, si consiglia di:
Utilizzate solo un po' di luci con ombre PCSS abilitate. L'effetto è generalmente più visibile sulle luci grandi e luminose. Le sorgenti luminose secondarie che sono più deboli di solito non usufruiscono molto dall'uso di ombre PCSS.
Fornire un'impostazione che consenta agli utenti di disabilitare le ombre PCSS. Per le luci direzionali, ciò si può fare impostando la proprietà
light_angular_distancedei DirectionalLight3D su0.0in uno script. Per le luci posizionali, si può fare impostando la proprietàlight_sizedegli OmniLight3D o SpotLight3D su0.0in uno script.
Modalità di filtro dei proiettori
Anche il modo in cui sono renderizzati i proiettori ha un impatto sulle prestazioni. L'impostazione avanzata del progetto Rendering > Texture > Proiettori di luce > Filtro consente di controllare come filtrare le texture dei proiettori. Con Nearest/Linear non utilizzano mipmap, il che li rende più veloci da renderizzare. Tuttavia, i proiettori appariranno sgranati se visti da lontano. Con Nearest/Linear Mipmaps appariranno più uniformi da lontano, ma i proiettori appariranno sfocati se visti da angolazioni oblique. Ciò si può risolvere usando Nearest/Linear Mipmaps Anisotropic, che è la modalità di qualità più alta, ma anche la più costosa sulle prestazioni.
Se il proprio progetto ha uno stile pixel art, si consiglia di impostare il filtro su uno dei valori Nearest in modo che i proiettori utilizzino il filtro vicino più ravvicinato. Altrimenti, mantenere Lineare.