Ho bisogno di aiuto con l'ombreggiatura / illuminazione 3d


8

Come gestite l'ombreggiatura in un gioco 3D? Ho una fonte di luce direzionale che oscura un lato di un albero fatto di cubi. I restanti 3 lati ottengono tutti solo ombreggiatura ambientale. Quindi l'effetto 3d si perde guardando due lati ombreggiati nell'ambiente. Mi sto perdendo qualcosa? Dovrei ombreggiare il lato più lontano dalla fonte di luce ancora più scuro? Ho provato a guardare Fallout 3 e sembra che sia quello che fanno, tuttavia Minecraft sembra ombreggiare un tumulo di erba con due lati opposti chiari e gli altri due lati opposti scuri danno l'effetto che ci sono due luci direzionali per le due luci lati ombreggiati e luce ambientale per i lati ombreggiati scuri.

Risposte:



5

Il tuo problema è che la tua luce ambientale ha un colore costante. In realtà la luce ambientale tende ad essere luminosa dall'alto e al buio dal basso, perché la luce viene tipicamente dall'alto.

C'è molto che puoi fare per risolvere questo problema. Come minimo, dovresti avere le costanti dello shader di vertice "top ambient color", "bottom ambient color" e "top ambient direction".

Nel tuo vertex shader, prendi il prodotto punto della "direzione ambientale superiore" e del vertice normale e usa il risultato per passare da "colore ambientale superiore" a "colore ambientale inferiore:"

float value = dot( vertex_normal, top_ambient_direction ) * 0.5 + 0.5;
ambient_color = lerp( bottom_ambient_color, top_ambient_color, value );

Questo è uno dei modi più semplici per rendere migliore l'ambiente, ed è stato usato spesso nei giochi PS2 e XBOX1. I giochi contemporanei vanno oltre usando una "mappa cubica ambientale" o "coefficienti armonici sferici ambientali".


3

Questo è un argomento complesso, e sono a malapena qualificato per parlarne, ma ci proverò. Molti giochi utilizzano una mappa della luce precotta che tiene conto del fatto che la luce rimbalza su più superfici, quindi combina quella con l'illuminazione dinamica per produrre un ambiente veloce, realistico e di bell'aspetto. Probabilmente ci sono giochi moderni che fanno rimbalzare la luce in tempo reale.

Qualcosa da tenere a mente è che la luce si attenua con la distanza; se la lampada è inclinata rispetto a una superficie, il bordo più vicino sarà più luminoso del bordo più lontano. Le cose tendono ad apparire molto false se una lampada brilla su di esse direttamente anziché in un angolo.

L'illuminazione di Minecraft è speciale, perché utilizza uno strano sistema in cui la luce viene trattata quasi come il calore che si diffonde nel mondo: http://www.minecraftwiki.net/wiki/Light Non si estende facilmente a una soluzione di uso generale.

L'effetto più bello che ho visto usato è chiamato occlusione ambientale. È costoso e di solito viene utilizzato solo in una soluzione precotta, ma tiene conto di come gli angoli della stanza sono più scuri perché le pareti occludono la luce ambientale; il centro del muro ha un valore di luce di un emisfero che lo colpisce, mentre l'angolo in cui si incontrano tre superfici ha solo un valore di luce di un emidemisemisfero (1/8 di sfera). https://secure.wikimedia.org/wikipedia/en/wiki/Ambient_occlusion

Ci sono tonnellate e tonnellate di scritti là fuori sui sistemi di illuminazione; la ricerca intorno probabilmente ti servirà bene.


0

L'illuminazione / ombreggiatura deve essere più avanzata di una semplice decisione binaria. I blocchi non sono illuminati o spenti completamente da una luce, possono essere parzialmente illuminati. A volte il viso dovrebbe essere totalmente lucido, nel qual caso viene colpito direttamente dalla luce. A volte vuoi solo la luce ambientale, se non è completamente intatta dalla luce. Tuttavia, quando è parzialmente oscurato, è necessario dargli un valore di luce tra completamente illuminato e completamente spento.

Il metodo di illuminazione di base standard passa dalla luce zero alla luce massima in base alla differenza di angolo tra il raggio di luce in entrata e la normale della superficie della faccia che si sta illuminando.

Se la normale della superficie è uguale (o opposta, a seconda di come la stai guardando), hai la massima luminosità. Man mano che l'angolo tra la luce in arrivo e la normale alla superficie aumenta, si ottiene sempre meno luce su quella faccia da quella luce.

In questo modo, con due luci, ogni faccia dovrebbe ricevere una luminosità che è una combinazione di quanta luminosità ogni luce mette su ogni faccia in base al suo angolo.

Questo dovrebbe essere molto più naturale che cercare di determinare se una singola faccia è illuminata o meno. Avrai un gradiente naturale man mano che le superfici si allontanano ulteriormente dalla luce e otterrai un bilanciamento per le superfici effettuate da più di una luce.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.