Demistificazione del "livello di dettaglio ridotto"


17

Di recente ho cercato di dare un senso all'implementazione di un sistema di dettaglio dettagliato in Unity. Genererò quattro piani mesh, ognuno con una mappa di altezza, ma suppongo che al momento non sia troppo importante. Ho molte domande dopo aver letto su questa tecnica, spero che questo non sia troppo da chiedere tutto in una volta, ma sarei estremamente grato che qualcuno mi aiuti a dare un senso a questa tecnica.

1 : Non riesco a capire in quale punto della pipeline LOD Chunked la mesh viene suddivisa in blocchi. È questo durante la generazione della mesh iniziale o esiste un algoritmo separato che lo fa?

2 : Capisco che una struttura di dati Quadtree viene utilizzata per archiviare i dati LOD Chunked , penso che mi manca un po 'il punto, ma il quadtree memorizza i dati vertici e triangoli per ogni livello di suddivisione?

3a : come viene solitamente calcolata la distanza della telecamera. Quando si legge sui quadrifogli, i rettangoli allineati agli assi sono menzionati molto. In questo caso, ogni blocco avrebbe un riquadro di delimitazione delle collisioni per rilevare la telecamera o il giocatore nelle vicinanze? o c'è un modo migliore per farlo? (forse raycast?)

3b : i blocchi calcolano autonomamente la distanza della telecamera?

4 : Ogni blocco ha la stessa "risoluzione". ad esempio al livello più alto la mesh sarà 32x32, ogni nodo suddiviso sarà anche 32x32. Esempio sotto:

esempio di LOD grosso


Se qualcuno conoscesse un approccio LOD migliore per un pianeta procedurale sarebbe interessante.
Caio Eugenio,

Presumo che tu abbia già visto il documento SIGGRAPH originale di Thatcher Ulrich e il programma associato? tulrich.com/geekstuff/chunklod.html
drxzcl l'

Ho, è molto istruttivo fino a un certo punto, ma non entra nel tipo di dettaglio o nell'approccio all'implementazione. Grazie
Caius Eugene il

1
Ci sono un certo numero di opzioni per LOD planetario qui; vterrain.org/LOD/spherical.html
OriginalDaemon

Risposte:


12

1: Non riesco a capire in quale punto della pipeline LOD Chunked la mesh viene suddivisa in blocchi. È questo durante la generazione della mesh iniziale o esiste un algoritmo separato che lo fa?

Non importa. Ad esempio, è possibile integrare il chunking nell'algoritmo di generazione della mesh. Puoi persino farlo in modo dinamico, in modo tale da aggiungere dinamicamente livelli più bassi (ad es. Man mano che il giocatore si avvicina) usando un algoritmo di perfezionamento simile al plasma. È anche possibile generare una mesh ad alta risoluzione dai dati di input o di misurazione dell'altezza dell'artista e aggregarla in tutti i blocchi LOD al momento della finalizzazione dell'asset. Oppure puoi mescolare e abbinare. Dipende davvero dalla tua applicazione.

2: Capisco che una struttura di dati Quadtree viene utilizzata per memorizzare i dati LOD Chunked, penso che mi manca un po 'il punto, ma il quadtree memorizza i dati vertici e triangoli per ogni livello di suddivisione?

Non necessariamente. L'albero memorizza solo informazioni sulla geometria e su come renderla. Ciò potrebbe significare avere un elenco vertici / volti in ogni nodo dell'albero. Più realisticamente al giorno d'oggi, memorizzereste gli handle delle mesh / istanze nella memoria della GPU.

3a: come viene solitamente calcolata la distanza della telecamera. Quando si legge sui quadrifogli, i rettangoli allineati agli assi sono menzionati molto. In questo caso, ogni blocco avrebbe un riquadro di delimitazione delle collisioni per rilevare la telecamera o il giocatore nelle vicinanze? o c'è un modo migliore per farlo? (forse raycast?)

Un'opzione molto economica e semplice è quella di utilizzare la distanza dal punto centrale del blocco e quindi correggerlo. Sai che questa distanza è sempre una sottovalutazione: se il punto centrale è a distanza Z, significa che metà del pezzo è più vicino di così. Ciò che non sappiamo è tuttavia l'orientamento. Se stiamo visualizzando un pezzo di larghezza wedge-on, il pezzo più vicino del pezzo sarà a distanza Z-w. Tuttavia, se stiamo visualizzando l'angolo del primo pezzo, il bit più vicino sarà a distanza Z-sqrt(2)*w. Se riesci a vivere con questa incertezza (quasi sempre puoi), hai finito. Nota che puoi anche correggere l'angolo di visione usando la trigonometria di base.

Preferisco calcolare la distanza minima assoluta dalla fotocamera al blocco per ridurre al minimo gli artefatti. In pratica, questo significa fare un test della distanza punto-quadrato . È un po 'più di lavoro che calcolare le distanze dai punti centrali, ma non è che farai un milione di questi fotogrammi.

Se riesci a sfruttare il tuo motore fisico per farlo, allora fallo sicuramente, ma vuoi davvero pensarci più in termini di "query a distanza" che di "collisione".

3b: i blocchi calcolano autonomamente la distanza della telecamera?

Dipende molto dal design del tuo motore. Consiglierei comunque di mantenere le foglie relativamente leggere. A seconda della tua piattaforma, solo il sovraccarico di chiamata di avere alcune migliaia di blocchi di terreno eseguono il proprio aggiornamento ogni frame può influire seriamente sulle prestazioni.

4: Ogni blocco ha la stessa "risoluzione". ad esempio al livello più alto la mesh sarà 32x32, ogni nodo suddiviso sarà anche 32x32.

Non è necessario, ma è conveniente se tutti i blocchi occupano la stessa quantità di spazio. Quindi è possibile eseguire la gestione della memoria (GPU) in unità di "blocchi". È anche più facile rimuovere / nascondere le giunture tra due pezzi di dimensioni diverse se una risoluzione è un multiplo dell'altra perché condividono più vertici. (es. 32x32 e 64x64 è più facile da gestire rispetto a 32x32 e 57x57) (grazie Guiber!). Se hai una buona ragione per variare la dimensione della geometria del pezzo, provaci sicuramente.


2
È anche più facile rimuovere / nascondere le giunture tra due pezzi di dimensioni diverse se una risoluzione è un multiplo dell'altra perché condividono più vertici. (es. 32x32 e 64x64 è più facile da gestire rispetto a 32x32 e 57x57)
Alayric

Risposta brillante, ha chiarito molte cose. In particolare, gran parte dell'implementazione dipende dal considerare le capacità del motore. Con 3a non sono ancora sicuro di quando lanciare una query a distanza, le due implementazioni che ho considerato pesanti per la CPU, farò qualche ricerca in più su questo. Grazie
Caius Eugene il

1
@CaiusEugene: penso che tu stia pensando troppo alla tua determinazione della distanza. Ho aggiunto un algoritmo molto economico e di base alla risposta al punto 3a che dovrebbe iniziare.
drxzcl,
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.