2011-10-12 13 views
5

Recentemente ho iniziato a sviluppare il motore voxel. Quello di cui ho bisogno sono solo voxel colorati senza texture, ma in quantità molto grandi (molto più piccoli di Minecraft) - e la domanda è come disegnare la scena molto velocemente? Sto usando C#/xna ma questo a mio parere non è molto importante in questo caso, parliamo di casi generali. Guarda questi due giochi:Voxel Engine and Optimization

  1. http://www.youtube.com/watch?v=EKdRri5jSMs
  2. http://www.youtube.com/watch?v=in0bavLJ8KQ

Soprattutto penso che il video numero 2 rappresenta grandi metodi di ottimizzazione (la mia carta di GFX inizia soffocamento solo a 192 x 192 x 64) Come sono stati raggiunti Questo?

cosa avrei avere nel motore:

  • voxel colorati senza texture, ma ombreggiato
    • molti, molti voxel, dire minima 512 x 512 x 128 per ottenere qualcosa di simile a video # 2
    • ombre (ombre lisce sarà grande, ma questo non è necessario)
    • opzionale: dinamico illuminazione (ad esempio da palle di fuoco volanti, che illuminano in prossimità di strutture voxel)
    • framerate minimo 40 FPS
    • telecamera avere 3 modi di libertà (movimento in asse x, spostare in asse y, muoversi in asse z), nessuna rotazione fotocamera è necessario un
    • funzione infine opzionale può essere Profondità campo (sarà dolce ^^)

Cosa ottimizzazione ho già sanno:

  • rimuovere voxel invisibili che risiede all'interno della struttura voxel (coperto fr om sei direzioni da altri voxel)
    • rimuovere volti invisibili di voxel - a causa della fotocamera non hanno rotazione e sempre guardare di traverso in avanti come nei giochi TPP, quindi se dividiamo schermo da taglio verticale, voxel sinistra e voxel destra mostrerà solo 3 facce
    • mantieni voxel nel dizionario invece che nell'array tridimensionale: saltare attraverso l'array di dimensioni 512 x 512 x 128 richiede millisecondi che è inaccettabile - ma dizionario int: colore dove int descrive impacchettato posizione 3D è molto più veloce
    • utilizzare l'istanza dove applciable
    • occlusione? (Come fare questo?)
    • spazio di divisione/octtree (è buona idea?)

sarò molto grato se qualcuno mi dia un consiglio come migliorare esistenti ottimizzazioni elencati sopra o può condividere idee di nuovi miglioramenti. Grazie

+2

Si noti che entrambi i video mostrano motori che non sembrano supportare la rotazione. Inoltre, il secondo video sta probabilmente usando i tabelloni per gli oggetti fuori fuoco piuttosto che gli oggetti voxel. – Skizz

risposta

8

1) Voxatron utilizza un renderer software anziché la GPU.È possibile leggere alcuni dettagli su di esso, se si leggono i commenti in questo post del blog:

http://www.lexaloffle.com/bbs/?tid=201

non ho guardato in dettaglio me quindi non posso dirvi molto di più.

2) Non ho mai giocato a 3D Dot Game Heroes ma non ho motivo di credere che usi voxel. Voglio dire, non vedo nessun cubo aggiunto o cancellato. Molto probabilmente è solo una mesh poligonale statica con una bella trama applicata.

Per quanto riguarda l'implementazione da soli, non provare a disegnare il mondo eseguendo i cubi poiché questo è molto lento. Dovresti invece elaborare il volume e generare mesh che si trovano sull'intersezione di voxel solidi e vuoti. Rompere il volume in regioni di dimensioni appropriate (ad esempio 32x32x32) e generare una mesh per ciascuna.

Ho scritto un articolo su questo libro che potresti trovare utile. In realtà si tratta di smooth voxel terain, ma molti dei principi si applicano.

Si può leggere su Google books qui: http://books.google.com/books?id=WNfD2u8nIlIC&lpg=PR1&dq=game%20engine%20gems&pg=PA39#v=onepage&q&f=false

E si può trovare il codice sorgente associato qui: http://www.thermite3d.org

2

Dal momento che si sta utilizzando XNA, si può semplicemente utilizzare istanze per ottenere l'effetto desiderato: http://www.float4x4.net/index.php/2010/06/hardware-instancing-in-xna/ http://roecode.wordpress.com/2008/03/17/xna-framework-gameengine-development-part-19-hardware-instancing-pc-only/

Il concetto di base è instancing: questa caratteristica ti consente di specificare una certa quantità di dati ripetuti e una certa quantità di va rying data in una singola chiamata DrawIndexedPrimitive. Nel tuo caso, il flusso dell'istanza sarebbe una singola scatola piena e l'altro flusso sarebbe la trasformazione e le informazioni sul colore.