Illuminazione in un mondo di Minecraft


10

Minecraft è un gioco che si basa in gran parte su una heightmap e utilizza le informazioni heigtmap per inondare il mondo di luce. Da quanto ho capito, il punto più alto nella mappa dell'altezza è la fine dell'area influenzata dalla luce solare. Tutto ciò che è illuminato dalla luce del sole, tutto ciò che è influenzato dalla luce vicina in un raggio di 8 blocchi.

Quindi se hai un'isola galleggiante sulla cima del tuo mondo, tutto ciò che sta sotto sarà visto essenzialmente come una grotta. Quando due luci influenzano lo stesso punto vince la luce più luminosa (incerta su ciò).

In entrambi i casi ci sono un paio di problemi con il modello di illuminazione di minecraft: prima di tutto, se il tuo mondo non ha una mappa di altezza, diventa più difficile capire cosa dovrebbe esattamente emettere luce solare e cosa no. Un modo semplice sarebbe quello di supporre che il mondo sia (nel mio caso) una roccia fluttuante e quindi attraversare ogni asse da entrambe le direzioni e capire dove inizia e finisce la roccia. Ma questo non elimina completamente il problema in quanto non si suppone che le ammaccature nella roccia siano nell'oscurità.

Minecraft stesso memorizzerà nella cache le informazioni leggere nei suoi blocchi insieme alle informazioni sul materiale di un blocco. Quindi solo se il mondo viene modificato l'illuminazione deve essere aggiornata. Sfortunatamente questo processo è ancora piuttosto lento sugli aggiornamenti e sui rapidi cambi di luce si può vedere il ritardo dell'illuminazione dietro. Ciò è particolarmente vero se cambiano molti blocchi (TNT, tramonto ecc.) E non si esegue il computer più veloce (o Java su Mac).

Dalla mia comprensione ancora limitata dell'illuminazione grafica 3D, un mondo come Minecraft non dovrebbe essere il problema più grande. Come affronteresti il ​​problema?

Penso che i requisiti di base per l'illuminazione in un mondo voxel sarebbero

  1. si aggiorna abbastanza velocemente da poter avvenire in un singolo frame. Uno potrebbe essere in grado di fare l'illuminazione nel dispositivo grafico e scaricare le informazioni sulla luce cambiate nella RAM principale.
  2. le informazioni sulla luce devono essere rapidamente disponibili per la logica di gioco principale, quindi non interamente basate sul dispositivo grafico: ragionamento: la luce influenza la crescita dell'erba, la generazione di mostri ecc.
  3. gli aggiornamenti leggeri dovrebbero essere locali per un pezzo o avere qualche altro limite in modo da non dover riaccendere il mondo intero che potrebbe essere di dimensioni molto grandi.

L'idea principale sarebbe quella di rendere veloci gli aggiornamenti della luce, non necessariamente più belli. Per miglioramenti generali delle prestazioni di rendering della luce si potrebbe facilmente aggiungere SSAO oltre a quello che dovrebbe tradursi in mondi molto più belli.

Risposte:


7

L'illuminazione in Minecraft viene calcolata in modo asincrono e viene inserita nella geometria. Non è fatto in tempo reale.

Ogni voxel memorizza l'illuminazione per quel voxel, probabilmente come un singolo byte (o 2, notch utilizza un approccio a strati per rendere possibili i cicli diurni e notturni). Ci sono solo 16 livelli di luce. Per illuminare il mondo, Minecraft fa 2 passaggi. Uno per la luce del sole e un altro per propagare o inondare la luce in caverne e simili. L'illuminazione è localizzata perché qualsiasi sorgente luminosa può propagare la propria luce a massimo 16 blocchi di distanza. L'acqua e la lava funzionano quasi allo stesso modo.

Maggiori informazioni sono disponibili sul suo blog: http://notch.tumblr.com/post/434902871/per-request-this-is-how-the-new-lighting-will-work


Lo so. Penso di averlo scritto sopra (meno la luminosità a 4 bit di risoluzione).
Armin Ronacher,

1

Non puoi usare GPU Render to Texture e doppio buffer dei risultati in modo da avere sempre a disposizione informazioni di illuminazione calcolate per rileggere ogni frame?

Il modo in cui organizzeresti questi dati per l'illuminazione dipende interamente da te, ma non vedo perché questa non dovrebbe essere la prima opzione da investigare se tutto ciò che stai cercando di fare è migliorare la velocità del tuo algoritmo di illuminazione ..?


Esattamente quello che stavo pensando. Praticamente tutte le GPU, a differenza della maggior parte delle CPU, sono PROGETTATE per questo tipo di massiccio esercizio di calcolo parallelo.
Grant Peters,

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.