2009-06-12 12 views
31

Ho letto molto sul potenziale utilizzo di spox voxel octrees nei futuri motori grafici.che cosa sono sparse voxel octrees?

Tuttavia non sono riuscito a trovare informazioni tecniche su di essi.

Capisco cos'è un voxel, tuttavia non so quali siano gli spox voxel octrees o quanto siano più efficienti delle tecniche poligonali attualmente in uso.

Qualcuno potrebbe spiegarmi o indicarmi una spiegazione per questo?

risposta

26

Ecco un frammento su id Software on this subject.

id Tech 6 userà una tecnica più avanzata che si basa sull'idea MegaTexture e virtualizza sia la geometria e le texture per ottenere geometria unica verso il basso per l'equivalente del texel: Sparse Voxel Octree (SVO).

Funziona tramite raycasting la geometria rappresentata da voxel (anziché triangoli) memorizzati in un otto.

L'obiettivo è essere in grado di eseguire lo streaming di parti degli otto nella memoria video, andando più in basso lungo l'albero per gli oggetti vicini per dare loro maggiori dettagli e per usare voxel di livello superiore, più grandi per ulteriori oggetti, che danno un sistema di livello automatico di dettaglio (LOD) sia per la geometria che per le trame allo stesso tempo.

anche here's a paper on this.

Trovato ulteriori informazioni in questo great blog entry.

Beh, voxel da soli non sono poi così interessante, perché per qualsiasi detailed ragionevolmente modellato, si avrebbe bisogno estremamente enormi quantità di voxel (se usando una griglia uniforme).

Quindi, è necessario un sistema gerarchico, che ci porta in octrees. Un octree è una struttura di dati spaziali molto semplice, che suddivide ciascun nodo in 8 sottonodi ugualmente grandi.

Un octree rada è un octree dove la maggior parte dei nodi sono vuoti, simili alle matrici sparse che si ottiene quando discretizzazione equazioni differenziali

+0

ho letto che prima, ma che davvero non fornisce particolari dettagli tecnici. come quello che è 'scarso' sugli alberi? perché l'albero d'oro e non binario o albero 'hexa'? – pdeva

+0

Aggiornato con un documento su questo. –

+1

Si chiamano octree perché lo spazio è diviso in 8 sottospazi di uguale dimensione ogni volta. – schnaader

4

in realtà, le 1.15 bit mi fanno il sospetto che solo memorizzare le cose in modo sequenziale, in un modo straordinariamente semplice. cioè, se stanno solo memorizzando i dati del volume e non cose come il colore o i dati di texture.

pensa in questo modo: 1 voxel deve essere solo 1 bit: è lì o non c'è? (essere o non essere, in altre parole: P). il nodo octree in cui è inserito è composto da 8 voxel e un po 'per memorizzare se la cosa contiene qualcosa. questo è un bit per voxel più uno per 8. 1 + 1/8 = 1.125. aggiungi un altro nodo genitore con 7 fratelli e ottieni 1 + 1/8 + 1/8/8 = 1,140625. sospettosamente vicino all'1.15 di cui hanno parlato. anche se probabilmente sono lontano, potrebbe dare qualche indizio a qualcuno.

+0

1 + 1/8 + 1/8/8 + 1/8/8/8 + 1/8/8/8/8 + 1/8/8/8/8/8 + 1/8/8/8/8/8/8 + 1/8/8/8/8/8/8/8 + 1/8/8/8/8/8/8/8/8 + 1/8/8/8/8/8/8/8/8/8 = 1.14285714179277420043 – nonchip

+0

ha fatto altri calcoli, 1.14285714285714285705 è il valore più accurato che ottengo con la calcolatrice di base di GNU e il mathlib. Immagino che possiamo lavorare con quello. – nonchip

+0

@nonchip Somma da 0 a Inf (1/(8^n)) == 8/7 bit per voxel. Ma puoi effettivamente fare meglio a rappresentare le coordinate spaziali sparse in modo succinto con 9/8 bit per voxel. È possibile utilizzare una matrice di una matrice di 8 unità a 9 bit raccolte in modo contiguo in una superunità a 72 bit (64 voxel). Nell'unità a 9 bit, il bit 0 si attiva se il nodo octree discende più in profondità attraverso i suoi 8 figli (ovvero un'altra super unità a 72 bit aggiunta all'array) o termina bruscamente (consentendo la sparsità), con i bit 1-8 che attivano i voxel dei bambini correnti . Indica con eleganza dalle coordinate voxel in LUT colori/texture. – user13972

1

Si può anche semplicemente rasterizzare tutti i punti, raytrace o raycast necessari in questi giorni, poiché le schede video possono proiettare quantità oscene di punti. Usi un octree perché è una forma a cubo, dividendosi continuamente facendo cubi sempre più piccoli. (voxels) Ho un motore sulla strada che ora usa una tecnica rasterizzata e ha un bell'aspetto. Per quelli che dicono che non riesco ad animare i voxel penso che abbiano davvero pensato molto sull'argomento, ovviamente è possibile.Per come la vedo io, creare il mondo è molto simile a "infinito 3d-coat", quindi guardate su 3d coat e il level design sarà molto simile al modo in cui funziona questo programma. Gli svuotamenti principali implicano che la velocità dello streaming non sia abbastanza veloce, il raytracing o il rastering non è in grado di realizzare 60 fps e tracciare gli oggetti voxel effettivi è molto costoso dal punto di vista computazionale, al momento posso tracciare una sfera 1024x1024x1024 in circa 12 secondi, ma tutti questi problemi potrebbe essere rimediato, è un futuro eccitante. La mia dimensione massima mondiale al momento è una meg da un meg da un meg, ma in realtà potrei renderla 8 volte più grande di questa. Ovviamente l'altro problema che è in realtà abbastanza serio è che richiede circa 100 mega per memorizzare un carattere 8192x8192x8192 anche dopo la compressione, quindi un ambiente sarà ancora più di questo. Anche se, dicendo la vostra intenzione di avere personaggi 8192x8192x8192 è completamente assurdo rispetto a quello che vediamo nei giochi di oggi ... un intero mondo usato per essere 8192x8192x8192 :)

Come si fa memorizzando solo bit per puntatore è i puntatori sono costruiti in runtime nella memoria video ... prendi la tua mente intorno a questo e potresti avere il tuo motore. :)

17

un octree ha 8 vicini di casa, perché se si immagina una piazza, che è stato tagliato in 4 trimestri uguali in questo modo

______________ 
|  |  | 
|  |  | 
|_____|______| 
|  |  | 
|  |  | 
|_____|______| 

allora sarebbe un "quad" (quattro) -tree.

ma in 3 dimensioni, avete voi stessi, un cubo, piuttosto che una piazza, in modo da tagliare in orizzontale, in verticale, e lungo l'asse Z, troverete 8 pezzi piuttosto che 4 come in modo

_____________ 
/ / /| 
    /-----/-----/ | 
/_____/_____/ | | 
|  |  | |/| 
|-----|-----|/| | 
|  |  | |/ 
|_____|_____|/ 

speranza che fa da quando ..

ciò che rende unico SVO, è che memorizza le informazioni voxel, che è un punto nello spazio, che ha proprietà quali il colore, normale, ecc ..

l'idea dietro SVO è di ignorare i triangoli e la necessità di trame, mettendo t orlare insieme in un singolo SVO che contiene il Voxelized Triangle Hull (il Modello) e le sue trame di superficie tutto in un unico oggetto.

La ragione di un Octree è qui necessaria, è che altrimenti una struttura a griglia uniforme richiederebbe lontano per quantità di memoria per le schede grafiche per gestire esistente ..

in modo da utilizzare la SVO consente una sorta di 3D MIP-mappata Texture ..

MipMapping è fondamentalmente la stessa immagine, ma a differenza di scale, uno che ha più in dettaglio, e l'ultima che ha il minimo dettaglio (ma guarda abbastanza simile da lontano)

in quel modo in prossimità di oggetti può trasmettere dallo SVO con maggiori dettagli, mentre gli altri oggetti scorrono con meno dettagli ... cioè se stai usando Ray-Casting ... più lontano il raggio dalla fotocamera, meno scaviamo nel nostro Mega-Texture/SVO

Ma, se pensi fuori dagli schemi come "Euclideon" con il suo "illimitato" -detail ", dovresti usare solo l'intersezione del tronco e l'intersezione piano/aabb, con l'UV proiettato del nostro tabellone affettato per trovare ogni colore di texel sullo schermo, opposto a Larghezza * Altezza pixel, tiro fuori raggi, con ingenui ottimizzatori del fascio di nvidia ".

PS (sorta fuori tema): per tutti coloro che non capisce come Euclideon fa loro shi, credo che questo è la soluzione più pratica, e non ho motivo di copia di backup (che non usano ray casting)

Il più grande mistero che hanno, non è il rendering, ma la memorizzazione dei loro dati .. RLE semplicemente non lo taglia ..perché alcuni dati volume/voxel possono essere più casuali e meno "solidi" in cui RLE è inutile, anche la compressione di cui per me in genere richiede almeno 5 byte in qualcosa di meno. dicono di uscita circa la metà di quello che viene messo in) attraverso la loro compressione .. così che stanno usando 2,5 byte, che è circa la stessa di un triangolo ora a adays