Conosco alberi BSP, Octrees e Portal che sono stati utilizzati per molto tempo. Ma i giochi moderni usano ancora questo sistema o usano cose nuove?
Se è possibile con pro e contro, considerando il rendering e il rilevamento delle collisioni.
Conosco alberi BSP, Octrees e Portal che sono stati utilizzati per molto tempo. Ma i giochi moderni usano ancora questo sistema o usano cose nuove?
Se è possibile con pro e contro, considerando il rendering e il rilevamento delle collisioni.
Risposte:
Sì, Unreal engine 3 ad esempio utilizza ancora un BSP, principalmente perché viene utilizzato durante il processo CSG. Doom3 / id tech 4 utilizza i portali e penso di aver letto qualcosa che id Tech 5 è tornato agli alberi BSP. Ci sono alcuni giochi che usano anche ocre. Nel gioco, la mia comprensione è che UE3 è passata a un approccio più dinamico con query di occlusione, ma sarei sorpreso se non usassero il BSP per determinare almeno quali mesh statiche sono in vista. Altri giochi potrebbero usare semplicemente l'abbattimento di View-Frustum (ad esempio Civilization). Dipende davvero dal tipo di gioco che cerchi.
Il motivo per cui BSP e roba è ancora in circolazione è perché non puoi fare molto meglio. Se hai una geometria statica, un BSP è fantastico se lo costruisci nel modo giusto. Tuttavia, è necessario scrivere un builder BSP, il che è complicato (ma potrebbe accadere gratuitamente se la tua soluzione CSG ne usa una!) costo ma non richiede (costoso) pre-elaborazione dei livelli. Questo è un compromesso che alcuni giochi sono disposti a fare (Crytek ad esempio vuole che tutto funzioni in tempo reale, quindi non impiegano il tempo di elaborazione per costruire una struttura di accelerazione statica.) Altri approcci di runtime sono ad esempio la rasterizzazione del software su la CPU e l'esecuzione di query di occlusione sulla CPU (utilizzata dal motore Frostbite).
Per un approccio davvero moderno, guarda Umbra , che è un middleware per le query di visibilità. Se cerchi un po 'sul Web, dovresti trovare alcune delle tesi di laurea che descrivono i primi inizi di Umbra.
Bottom line: se si desidera utilizzare un BSP / Octree / no AS dipenderà fortemente dal tipo di gioco che si desidera creare. Se i tuoi livelli sono prevalentemente statici, dovresti trarne vantaggio e costruire una struttura di accelerazione statica. Se tutto è dinamico, devi ovviamente un altro approccio.
Per il rilevamento delle collisioni, darei un'occhiata a Bullet e PhysX e ai loro algoritmi di rilevamento delle collisioni. Ma la mia sensazione è che le soluzioni di fisica siano meno legate alla visibilità di una volta: una soluzione di fisica potrebbe voler usare un BVH basato su GPU, in quel caso, non ha molto senso provare a usarlo per le query di visibilità.
Onestamente non so quali motori di prossima generazione stiano utilizzando in questi giorni, ma ti dirò quello che so. È facile confondersi tra un'ottimizzazione e la struttura dei dati utilizzata per aiutarla. Tuttavia, tutte le cose menzionate di seguito sono per ottimizzazioni, ma sottolineerò quali sono specificamente le strutture di dati.
BSP : Struttura dei dati - Per rilevare l'intersezione tra oggetti in movimento dinamici e geometria statica del mondo. Utilizzato per essere utilizzato sia per il rilevamento delle collisioni che per il rendering della geometria correttamente senza zbuffer, ma non viene più utilizzato per il rendering poiché al giorno d'oggi abbiamo memoria sufficiente per il buffer az. Sono generati tecnicamente in modo leggermente diverso, ma comunque considerati lo stesso tipo di albero. Richiede la preelaborazione.
Octree o Kd-Tree : Struttura dei dati - usato per determinare quali oggetti si trovano nella stessa "cella" o area per evitare di fare un controllo n ^ 2 su tutti gli oggetti dinamici.
Questi non sono i soli, ma sono probabilmente i più comuni. Esistono anche molte ottimizzazioni che consentono al motore di evitare la geometria di rendering in generale. Ma quanto segue elimina la geometria, e di solito è tutto ciò per cui è usata:
Portali : non tecnicamente una struttura di dati, ma richiede uno speciale per eseguire l'abbattimento. Utilizzato per l'abbattimento della visibilità della geometria mondiale e della geometria dinamica degli oggetti dalla vista. Richiede la preelaborazione per dividere il mondo in aree che penso. Ma in realtà non l'ho implementato, quindi non lo so.
Abbattimento dell'occlusione : ottimizzazione: utilizzato per l'abbattimento della visibilità per qualsiasi cosa tu voglia, probabilmente oggetti dinamici.
Abbattimento regolare della vista : ottimizzazione: elimina gli oggetti che non sono nella vista della videocamera.
Più abbattimento delle finestre : ottimizzazione - L'abbattimento regolare delle finestre può essere ulteriormente ottimizzato utilizzando un octree. È possibile eliminare intere celle dell'ottico che si trovano dietro la telecamera o non nella sua vista. Questo include patch di terreno (se sei fuori). Qualunque cosa non sia abbattuta dall'octree, eseguiresti "abbattimento regolare delle finestre". Quindi, qualunque cosa rimanga, renderesti.
Abbattimento della faccia posteriore : ottimizzazione: elimina la geometria dalla parte opposta alla telecamera per impedire la rasterizzazione. Di solito viene eseguito in hardware se lo stato di rendering è impostato correttamente.
Strutture dati di casi speciali:
Alberi AABB o alberi Sfera : sono tipi di strutture di dati di casi speciali. Trasformano una forma concava in una forma convessa. Ad esempio un personaggio con le ossa è tecnicamente concavo. Lo spezza in pezzi convessi più piccoli. Può essere utilizzato come ottimizzazione per il rilevamento delle collisioni, l'abbattimento della visibilità degli oggetti dinamici (di solito) e semplifica i test di intersezione poiché è convesso. Questi sarebbero dentro di sé, un ottetto dal momento che di solito sono oggetti dinamici. Questi potrebbero anche essere usati per aiutare l'ottimizzazione dell'abbattimento dell'occlusione.
Non vi è alcun motivo per cui è necessario utilizzare una singola struttura per rappresentare tutto (come un grafico di scena). A mio avviso, sarebbe meglio utilizzare strutture di dati diverse per compiti diversi invece di tentare di utilizzare un albero per scopi generici di qualche tipo. Ad esempio, al momento il motore su cui sto lavorando, ho intenzione di implementare una combinazione BSP / Octree / AABB Tree con le seguenti ottimizzazioni: abbattimento dell'occlusione, viewport e, naturalmente, abbattimento del backface. Ciò significa che avrò un albero bsp, un ottetto e probabilmente più alberi di aabb all'interno di quell'ottetto.
La selezione delle migliori strutture dati e algoritmi / ottimizzazioni è probabilmente la cosa più grande e più vantaggiosa che puoi fare per il tuo motore.