Altezzamap, Voxel, terreni poligonali (geometria)


15

In relazione ai terreni Heightmap, Voxel e Polygon (geometria):

  1. Quali sono le principali differenze tra tutti questi tre?
  2. Riesci a formare un terreno "liscio" con Voxels, voglio dire, ad esempio puoi ottenere una montagna liscia con Voxels o Voxels sono limitati ai cubi?
  3. Per quanto riguarda le prestazioni, un mondo 2000x2000 unità, quale sarebbe il terreno più veloce in altezza, terreno Voxel o basato su poligoni, terreno geometrico? (Supponendo che ci siano guadagni / ottimizzazioni delle prestazioni "ragionevoli" per il rendering per ogni possibilità)
  4. Ci sono altre tecniche utilizzate per la creazione del terreno?
  5. Qualche buon titolo che rappresenta ciascuno dei tipi?

Il terreno basato su poligoni PS deve essere completamente traingolato, nessuna roba quadrata.

Risposte:


30

heightmaps

Con una mappa di altezza, memorizzi solo il componente di altezza per ciascun vertice (di solito come trama 2D) e fornisci posizione e risoluzione una sola volta per l'intero quad. La geometria orizzontale viene generata per ogni fotogramma utilizzando lo shader della geometria o la tassellatura hardware. Le mappe altimetriche rappresentano il modo più rapido per archiviare i dati di paesaggio per il rilevamento delle collisioni.

Professionisti:

  • Utilizzo della memoria relativamente basso : è necessario memorizzare solo un valore per vertice e nessun indice. È possibile migliorarlo ulteriormente utilizzando mappe di dettaglio o un filtro antirumore per aumentare i dettagli percepiti.

  • Relativamente veloce : lo shader della geometria per le mappe di altezza è piccolo e funziona veloce. Tuttavia, non è veloce come il terreno della geometria.
    Sui sistemi senza accelerazione 3D basata su triangoli, le mappe di altezza in marcia del raggio sono il modo più veloce per eseguire il rendering del terreno. Questa era definita grafica voxel nei giochi più vecchi.

  • LOD / terreno dinamico : è possibile modificare la risoluzione della mesh generata in base alla distanza dalla telecamera. Ciò causerà la geometria mobile se la risoluzione scende troppo (circa 0:40), ma può essere utilizzata per effetti interessanti.

  • Facile generazione / creazione del terreno : le mappe altimetriche possono essere facilmente create combinando le funzioni di rumore come il frattale Perlin Noise e gli editor delle mappe di altezza sono veloci e facili da usare. Entrambi gli approcci possono essere combinati. Sono anche facili da lavorare in un editor.

  • Fisica efficiente : una posizione orizzontale è mappata direttamente (generalmente) da una a quattro posizioni in memoria, quindi le ricerche geometriche per la fisica sono molto veloci.

Contro:

  • Esattamente un'altezza per coordinata x / y : di solito non possono esserci buchi nel terreno o scogliere a strapiombo.

  • Meno controllo : puoi controllare l'altezza precisa di ciascun punto se la dimensione della griglia corrisponde alle coordinate della trama.

  • Artefatti : se i quattro vertici che definiscono un quadruplo secondario non sono sullo stesso piano, la divisione tra i due vertici diventerà visibile. Questo di solito accade su ripide scogliere con bordi che non seguono una direzione cardinale.

Le mappe altimetriche sono di gran lunga il modo più efficiente per eseguire il rendering del terreno e sono utilizzate in molti giochi più recenti che non si basano su caratteristiche del terreno avanzate e dispongono di ampie aree esterne. Wikipedia ha un elenco di programmi che usano le mappe di altezza , ma non sono sicuro che ciò significhi che li usano solo come risorse o anche per il rendering, quindi qui alcuni giochi che potrebbero usarli:

  • Causa giusta 2: le regioni sono caricate in settori quadrati e non ci sono buchi nel terreno. Nella demo, c'è un buco profondo con triangoli allungati lungo i bordi dove normalmente ci sarebbe un edificio. (L'area è normalmente inaccessibile, ma ci sono mod per rimuovere alcune delle limitazioni della demo ...)

  • Sims 2 ( forse ): il terreno del quartiere è caricato come heightmap, ma ci sono buchi in cui sono posizionati i lotti (siti di costruzione). Tuttavia, ci sono manufatti tipici se crei molte scogliere ed è abbastanza noioso aggiungere una cantina a una casa (e nascondere la scogliera sotto una veranda).

  • Giochi con motore a valvole di Valve: i pennelli rettangolari (geometria a livello statico) possono avere un terreno in altezza sulle loro facce. In questi giochi, le solite stranezze sono spesso nascoste con altri pennelli o oggetti di scena.

È impossibile dirlo con certezza senza guardare gli shader perché ogni terreno della mappa di altezza può essere reso come mesh.

voxel

Il terreno Voxel memorizza i dati del terreno per ciascun punto in una griglia 3D. Questo metodo utilizza sempre la maggior quantità di spazio di archiviazione per i dettagli significativi della superficie, anche se si utilizzano metodi di compressione come oculari sparsi.

(Il termine "motore voxel" è stato spesso usato per descrivere un metodo per tracciare le altezze del terreno in marcia dei raggi comuni nei vecchi giochi 3D. Questa sezione si applica solo ai terreni memorizzati come dati voxel.)

Professionisti:

  • Dati 3D continui : i Voxel sono praticamente l'unico modo efficiente per archiviare dati continui sulle caratteristiche del terreno nascosto come le vene minerali.

  • Facile da modificare : i dati voxel non compressi possono essere modificati facilmente.

  • Funzioni avanzate del terreno : è possibile creare strapiombi. I tunnel sono senza soluzione di continuità.

  • Interessante generazione di terreno : Minecraft lo fa sovrapponendo funzioni di rumore e pendenze a caratteristiche del terreno predefinite (alberi, sotterranei). (Leggi Terrain Generation, Parte 1 nel blog di Notch per maggiori informazioni. Non c'è parte 2 al 05.8.2011.)

Contro:

  • Lento : per eseguire il rendering dei dati voxel, è necessario utilizzare un ray tracer o calcolare una mesh, ad esempio con cubi in marcia (ci saranno artefatti). I voxel vicini non sono indipendenti per la generazione di mesh e gli shader sono più complicati e di solito producono geometrie più complesse. Il rendering dei dati voxel con LOD elevato può essere molto lento.

  • Enormi requisiti di archiviazione : l'archiviazione dei dati voxel richiede molta memoria . Per questo motivo spesso non è possibile caricare i dati voxel in VRAM, poiché per compensarli dovresti usare trame più piccole, anche su hardware moderno.

Non è pratico usare voxel per giochi che non si basano su caratteristiche voxel come il terreno deformabile, ma in alcuni casi può consentire interessanti meccaniche di gioco. I motori Voxel sono più comuni nei vecchi giochi , ma ci sono anche esempi più recenti:

  • Motore Atomontage : rendering Voxel.

  • Worms 4: usa "poxels". Secondo Wikipedia è un mix di voxel e poligoni.

  • Minecraft: utilizza voxel per rappresentare il terreno nella RAM, la grafica è grafica poligonale. Si tratta principalmente di software calcolato però.

  • Terraria: un esempio per voxel 2D. Non so come venga visualizzato.

  • Voxels combinati con la fisica : non un gioco. ma mostra bene il potenziale di distruzione.

  • Voxatron : un gioco che utilizza voxel per quasi tutta la grafica, inclusi menu e HUD.

maglie

Le mesh poligonali sono il modo più flessibile e preciso per archiviare e rendere il terreno. Sono spesso utilizzati nei giochi in cui sono necessari un controllo preciso o funzionalità avanzate del terreno.

Professionisti:

  • Molto veloce : devi solo fare il solito calcolo di proiezione nello shader di vertice. Non è necessario uno shader di geometria.

  • Molto preciso : tutte le coordinate sono memorizzate individualmente per ciascun vertice, quindi è possibile spostarle orizzontalmente e aumentare la densità della mesh in punti con dettagli più fini.

  • Basso impatto sulla memoria : ciò significa anche che la mesh di solito avrà bisogno di meno memoria di una mappa heighmap, poiché i vertici possono essere più radi nelle aree con caratteristiche meno piccole.
    (Vedi Rete irregolare triangolata su Wikipedia).

  • Nessun artefatto : la mesh viene resa così com'è, quindi non ci saranno problemi o bordi strani.

  • Funzioni avanzate del terreno : è possibile lasciare buchi e creare strapiombi. I tunnel sono senza soluzione di continuità.

Contro:

  • Povero LOD dinamico : possibile solo con mesh pre-calcolate. Ciò causerà "salti" quando si passa senza dati aggiuntivi per mappare i vertici vecchi e nuovi.

  • Non facile da modificare : la ricerca di vertici che corrispondono a un'area da modificare è lenta.

  • Non molto efficiente per il rilevamento delle collisioni : diversamente dalle altezze e dai dati voxel, l'indirizzo di memoria per una determinata posizione di solito non può essere calcolato direttamente. Ciò significa che la fisica e la logica di gioco che dipendono dall'esatta geometria della superficie funzioneranno molto più lentamente rispetto agli altri formati di archiviazione.

Il terreno poligonale viene spesso utilizzato nei giochi che non hanno grandi aree aperte o che non possono utilizzare il terreno della mappa in altezza a causa della sua mancanza di precisione e sporgenze. Non ho un elenco, ma ne sono abbastanza sicuro

  • ogni 3D Zelda e

  • ogni gioco di Mario 3D

Usa questo.

Altri metodi

È possibile creare un terreno interamente nella pipeline dello shader. Se l'algoritmo viene eseguito solo nel frammento / pixel shader, i dettagli possono essere praticamente illimitati mentre l'impatto della memoria è quasi zero. Gli aspetti negativi ovvi non hanno quasi alcun controllo sulla forma e sui problemi quando la fotocamera interseca la superficie di rendering originale. È ancora utile nei giochi spaziali in cui i giocatori non interagiscono con la superficie di un pianeta. Le animazioni dei parametri funzionano meglio con questo tipo di terreno.

Dovrebbe essere possibile scaricare la geometria del terreno generata dalla scheda grafica per usarla per il resto del motore di gioco, ma non so come siano le prestazioni di questo o se questo è stato fatto finora.

Conclusione

Non esiste un metodo che funzioni bene per ogni scenario, ma è abbastanza facile sceglierne uno per un determinato compito:

  • Le mappe altimetriche sono la soluzione migliore se non hai bisogno di sporgenze o buchi nella superficie del terreno e usi fisica o terreno dinamico. Sono scalabili e funzionano bene per la maggior parte dei giochi.

  • Le mesh hanno la massima precisione e possono descrivere sporgenze, fori e tunnel. Usali se hai un terreno complesso che non cambia spesso.

  • I Voxel sono buoni per descrivere terreni molto dinamici con molte caratteristiche complesse. Evitare di renderizzarli direttamente in quanto richiedono grandi quantità di memoria ed elaborazione.

  • Altri metodi possono essere migliori di uno qualsiasi dei precedenti se non devi interagire con il terreno o hai bisogno di una grafica molto dettagliata. Di solito funzionano solo per scenari molto specifici.

È possibile combinare metodi diversi per ottenere funzionalità da più di uno, ad esempio tessellando il terreno mesh con una mappa di altezza per aumentare la struttura dei dettagli di una scogliera.

La generazione dinamica del terreno è ampiamente utilizzata nella simulazione spaziale procedurale e alcuni sono diventati molto avanzati negli ultimi anni . I forum di questi progetti dovrebbero avere alcune risorse sull'argomento.


3
Il motore di origine non utilizza le mappe di altezza per il suo terreno. Usano quadratini tassellati chiamati "Displacements" developer.valvesoftware.com/wiki/Displacement
Tetrad

1
Questa è una risposta dolce lì, darebbe un +3 a questo, se fosse possibile. Grazie per le informazioni dettagliate, molto apprezzate.
jolt

@Tetrad Le risoluzioni disponibili per gli spostamenti sono potenze di due (una restrizione comune per i buffer delle trame), l'unica coordinata salvata per vertice è l'altezza e l'altezza del terreno sono rappresentate come quadrupoli tassellati. Il wiki dice anche che il costo di rendering degli spostamenti è inferiore a quello della geometria normale. Penso che sia giusto presumere che siano la stessa cosa con nomi diversi.
Tamschi,

1
@NickWiggill Il significato di "voxel" sembra essere cambiato un po 'negli ultimi 10 anni. Vado con l'attuale definizione di voxel di Wikipedia come valori su una normale griglia 3D . La voce su Outcast menziona la differenza di significato. Ho aggiunto alla mia risposta per chiarire questo.
Tamschi,

2
Nota a margine: il "terreno poligonale" è anche chiamato " Triangular Irregular Network " ("TIN" in breve) in GIS; e di solito è significativamente meno intensivo della memoria rispetto a un'altezza della stessa risoluzione effettiva, poiché non si preoccupa di registrare dati non essenziali o luoghi in cui non vi sono dati. Il primo gioco gotico lo usava (non sono sicuro degli altri).
Martin Sojka,

8

Vorrei sottolineare che nessuno dei termini che hai citato si escludono a vicenda - potresti persino avere un gioco basato su voxel che utilizzava le mappe di altezza e il rendering usando poligoni.

  1. Le mappe di altezza sono rappresentazioni bidimensionali dell'altezza del terreno in ciascun punto specifico. Sono spesso memorizzati come immagini in scala di grigi, dove la luminosità rappresenta l'altezza di quel punto. I Voxel sono fondamentalmente una bitmap 3D. Esistono varie tecniche utilizzate per il rendering di uno spazio voxel.

  2. Puoi creare un terreno liscio con voxel e non si limitano ai cubi. Uno di questi modi è usare un algoritmo come cubi in marcia , che può convertire una rappresentazione voxel in un elenco poligonale.

  3. Quello con il minor numero di triangoli renderebbe il più veloce: 3

  4. Algoritmi frattali come il rumore di Perlin possono essere utilizzati per creare paesaggi con molti
    dettagli. Superfici parametriche come i nurbs possono essere utilizzate per creare terreni lisci con scarse esigenze di stoccaggio permanente.

  5. Delta Force è un vecchio gioco che utilizza voxel. Minecraft può usare l'archiviazione voxel per rappresentare il paesaggio (incerto). Sacrifice di Shiny è un gioco che utilizza le mappe di altezza per ottenere buoni risultati. La maggior parte dei giochi con paesaggi usa terreni geometrici.


1
Una nota, al punto 3, mentre la GPU si preoccupa solo del conteggio dei poligoni, c'è ancora il lato della generazione della geometria delle cose. Generare la geometria per un campo voxel è di solito un processo più lento (i blocchi / i cubi in marcia sono entrambi processi più complessi) rispetto al terreno heightmap (che è un processo semplice) o basato su poligoni (che ovviamente sono già dati geometrici). Modifica: dipende anche dal fatto che il terreno sia deformabile.
Michael,

Per il 3 ° punto ... Beh, l'altezza deve ancora essere elaborata e solo allora si trasforma in una geometria, giusto? Tenendo presente questo, una mesh poligonale sarebbe un po 'più veloce? Potresti indicare alcune delle tecniche usate per rendere i voxel?
jolt

2
È possibile utilizzare uno shader di geometria per generare la mesh da una mappa di altezza. In questo modo si memorizzano solo la mappa di altezza e parametri come la posizione e la risoluzione mentre la geometria viene generata ogni frame nella pipeline dello shader. È più veloce dei cubi in marcia e più lento di una maglia poligonale. Il vantaggio delle mappe di altezza è il basso consumo di memoria: solo un po 'più di 1/3 di ciò di cui una mesh avrebbe bisogno. Il rovescio della medaglia è che non è così flessibile (senza piccoli dettagli, senza sporgenze). È possibile regolare dinamicamente i dettagli della mesh generata, ma ciò provoca uno spostamento della geometria.
Tamschi,

@Tamschi, se solo avessi fornito una risposta, esattamente quello che stavo cercando. :)
Modalità jolt

@Tom vedrò se riesco a ottenere questo formattato e troverò qualche altro esempio.
Tamschi,
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.