2009-06-18 13 views
8

Qual è la premessa di base della tecnologia come si trova in Oblivion (e altri giochi, ne sono sicuro, non ho giocato abbastanza per sapere), in cui gli oggetti da lontano sono vagamente mostrati quando li vedi da lontano? Ad esempio, una grande torre è a un miglio di distanza e si vede il vago rettangolo di esso che spunta dall'orizzonte ... Ovviamente una scena 3D gigante non può essere interamente renderizzata, e so che nel caso di heightmaps ci sono solo algoritmi di approssimazione che vengono utilizzati per ridurre la qualità della mappa dell'altezza più lontano dalla fotocamera, ma per oggetti specifici, qual è il modo migliore per mostrarli?Rendering di oggetti 3D distanti [giochi]

Stavo pensando forse a una tecnica di pre-rendering, in cui scegli punti specifici attorno al paesaggio e poi fai un programma che disegna tutti i modelli heightmap e 3D attorno a quel punto e scatta una foto. Ci vorrebbero diverse foto, e poi quando il giocatore è vicino a quel punto, le immagini verrebbero usate come skybox.

Un'altra tecnica più ovvia è quella di archiviare modelli 3D veramente approssimativi, ma come fa il sistema di rendering 3D a scegliere specificamente di rendere il modello approssimativo dell'edificio e non i modelli approssimativi di altri meno significativi (e probabilmente non visibili) da quella distanza) oggetti? Come memorizzerai qualcosa del genere insieme al tuo heightmap? Forse in base alla progettazione, solo alcuni di questi punti di riferimento significativi e quindi è sufficiente archiviarli in un file di dimensioni ridotte, e su ciascun fotogramma vengono visualizzati quelli che sono a meno di x molto lontani?

Sono consapevole che la serie Halo sceglie di dividere il gioco in livelli e quindi ogni livello ha uno skybox diverso fatto a mano. Questo è un po 'quello che stavo cercando nel primo suggerimento, ma non ne sono sicuro. Immagino che sto solo cercando di raccogliere altre idee o affinamenti o problemi nelle mie idee, così da poter scegliere quali prototipi con il mio tempo e conoscenza limitati.

Un altro argomento correlato è come visualizzare le montagne a una certa distanza, dato che sarebbero parte della heightmap e non i modelli 3D su di essa, quindi non sarebbero in grado di avere una versione approssimativa e la heightmap l'algoritmo di approssimazione potrebbe rovinare la montagna da una distanza molto lontana come quella (supponendo che proverai anche ad approssimare e renderizzare una geometria così distante, che probabilmente non vorresti). Punti bonus se lo copri anche nella tua risposta. :)

Grazie!

P.S. Sto usando OpenGL. Sto solo cercando i concetti di base, ma se scegli di pubblicare un codice di esempio, usa le funzioni ei termini OpenGL! :)

EDIT: Grazie per le risposte! A scopo di documentazione ecco un'altra risorsa che ho trovato: Capitolo 4.9 in Game Programming Gems 2 riguarda il concetto di rendering di paesaggi lontani su skybox: http://books.google.com/books?id=1-NfBElV97IC&lpg=PA416&ots=SOpnfijZly&dq=render%20distant%20to%20skybox&pg=PA416 (sfortunatamente quell'anteprima è solo la prima pagina del capitolo ... I'll devo prendere quel libro dalla biblioteca della mia università non appena torno ad agosto)

Anche dopo aver letto queste cose, sono ancora dell'opinione che il LOD sia per oggetti che sono ad una distanza ancora ragionevolmente vicina. Se gli oggetti non hanno nemmeno un pixel grande, ma li stai ancora alimentando con la scheda grafica, stai semplicemente sprecando energia, sia usando il LOD che non. E questo sarebbe il caso di tutto tranne che degli oggetti distanti più grandi in assoluto; alcuni edifici alti e alcune montagne, nella maggior parte dei casi, ma i piccoli modelli di dettaglio (cespugli, persino alberi, rocce, qualunque altro scenario ...) non sarebbero visibili da una tale distanza. Quindi mi piace la tecnica render to skybox, e quando arrivo a questo bridge, è così che lo attraverserò; e mi assicurerò di usare il LOD per tutti i modelli, semplicemente non renderò tale distanza.

Sono, comunque, pensando più alle linee di un gioco di Oblivion, quindi la risposta potrebbe dipendere dal genere di gioco.

risposta

7

Alcune tecniche, tra cui quelli che hai citato:

  • livello di dettaglio. Descritto sopra.
  • Mipmapping. Per trame
  • Campo visivo. Limita il numero di cose che la tua videocamera può "vedere" selezionando un livello di zoom appropriato. Vedi anche vedere il frustrum culling.
  • Piano di ritaglio lontano. Occlusione di luoghi lontani: la maggior parte dei giochi usa la nebbia, le montagne o qualche altra scusa per avere un duro taglio su quanto lontano si possa vedere. Questo può essere implementato usando octrees, o qualche altra tecnica del genere.Questo può essere basato su oggetti interi, o poligoni, o qualsiasi altra cosa, ed è solitamente impostato per verificarsi proprio dietro quelle montagne sopra menzionate.
  • Arene/livelli/aree/qualunque cosa - di nuovo la maggior parte dei giochi ti limita artificialmente a giocare in un'arena alla volta; il vantaggio è ovvio (puoi ignorare gli oggetti in tutte le altre arene)
  • Pre-rendering - questo è quello che stai suggerendo sopra. Per le scene statiche che sono lontani, il rendering della scena in una vista 'tipico' e renderla una texture sullo sfondo, o utilizzarlo per la mappa skybox/riflessione/ecc

L'idea è quella di buttare via quanti più dettagli possibile prima che gli utenti inizino a notare.

Esistono numerosi toolkit preesistenti che eseguono queste operazioni automaticamente, ma tendono a costare denaro. Se stai guardando un'applicazione seria, consiglierei almeno la ricerca delle soluzioni che includono.

+1

Penso che il tuo punto di vista del campo visivo sia leggermente poco preciso. FOV di solito si riferisce all'angolo della "macchina fotografica" che stai guardando attraverso.Il punto in cui si tagliano oggetti lontani è noto come "Piano di ritaglio lontano" –

+0

@NeilN, hai ragione; Modificheremo la risposta –

0

Una tecnica è LOD (livello di dettaglio). Più l'oggetto è lontano dalla fotocamera, meno i triangoli vengono disegnati. Ecco un link: http://www.stefan-krause.com/

7

Penso che questo sia quello che cercate Level of Detail (LOD)

+0

Beh, penso che sia un po 'più piccolo ... Sto parlando di una scala molto grande, e LOD non funzionerebbe perché ciò implicherebbe che tutti i modelli a miglia di distanza siano ancora disegnati, il che non sarebbe il caso. – Ricket

+2

sì, a un certo punto si eliminano tutti gli oggetti che sono troppo lontani per avere importanza. Questo a volte si trova nelle impostazioni dei programmi 3d come la distanza di disegno. quando qualcosa supera, smetti di renderlo. – AvatarOfChronos

+0

Oblivion utilizza effettivamente LoD per il rendering di terreni lontani. Ci sono alcune informazioni su elderscrolls.com, ad es. http://cs.elderscrolls.com/constwiki/index.php/Landscape_LOD_Tutorial – Kylotan

4

per i modelli 3D, la tecnica è chiamata level of detail. Essenzialmente, i modelli di versioni multiple sono mantenuti disponibili e il giusto uso basato sul contesto. Non è sempre solo per la distanza, ma può anche essere usato per maintiain framerate in altre situazioni.

Attenzione però, dovresti attivare mipmapping o brillare sulle trame più grandi sui modelli in bassa risoluzione e fare attenzione all'animazione. Cambiare il modello sotto uno scheletro animato è complicato quindi una tecnica è mantenere lo stesso scheletro anche quando si esegue il LODing del modello.

Ci sono sistemi LOD dinamici sia per il terreno che per i modelli di oggetti, ma questi possono essere pesanti per la CPU.

0

È possibile eseguire il rendering su trame per oggetti distanti, tuttavia è necessario ri-renderizzare la trama ogni volta che la prospettiva cambia oltre una certa soglia. Funziona alla grande per oggetti distanti in cui la prospettiva non cambierà molto spesso come il tuo esempio di montagne in lontananza, ma se la sorgente della vista si muove troppo velocemente o sei troppo vicino allora otterrai un effetto occhio di pesce simile ad i primi giorni di rendering del cielo in terremoto. Questo tipo di sistema si presta a mondi come la vigilia online che contengono grandi distanze.

Questo ovviamente è solo un altro trucco nel tuo arsenale e avrai ancora bisogno di LOD in una certa misura.

0

Le versioni a basso dettaglio dei modelli funzionano particolarmente bene per veicoli e oggetti È davvero difficile con il terreno. Ho lavorato su giochi di tipo battlezone e simulatori di volo per PC. Un po 'di nebbia aiuta a coprire i "pop" tra i dettagli.

Nei dettagli inferiori, la mappatura della trama viene spesso sostituita con alcuni poligoni a singolo colore.


"Un'altra tecnica più evidente è quello di memorizzare i modelli 3D davvero grezzi, ma poi come si fa il sistema di rendering 3D specificamente scelgono di rendere il modello di massima dell'edificio e non i modelli grezzi di altri meno significativi (e probabilmente oggetti non visibili da quella distanza) Come conserveresti qualcosa del genere insieme al tuo heightmap? "

È possibile grigliare il terreno e mantenere un elenco di quali oggetti sono visibili in ogni cella della griglia.

0

Un modo per gestire il terreno è disporre di riquadri a risoluzione multipla. Proprio come fanno Virtual Earth e Google Maps, dividono il mondo in tessere in modo ricorsivo. Quindi, ci sono 4 tessere al livello 0, 16 al livello 1, ecc ... Quindi, utilizzando un algoritmo LoD per determinare lo zoom/scala, si caricheranno le tessere terreno appropriate per l'area specificata.

0

La tecnica di memorizzazione dinamica delle viste pre-rendering di oggetti distanti è solitamente denominata "impostori". Here's un articolo da un vecchio libro di gemme di programmazione di giochi sull'argomento.

Esistono molte tecniche per la gestione del livello di dettaglio per il terreno del piano di altezza. Dai un'occhiata a vterrain.org per una panoramica di alcune tecniche comuni. Il principio generale è lo stesso nella maggior parte delle varianti: suddivide il terreno in sezioni e usa la geometria e le trame a bassa risoluzione in lontananza, ma i dettagli variano.

Per ridurre il numero di oggetti che vengono inviati alla scheda grafica, in genere verrà implementata una sorta di abbattimento della visibilità. Per la più semplice, questo potrebbe essere semplicemente la caduta di modelli la cui sfera di delimitazione copre meno di una certa soglia di pixel dello schermo (lo si calcolerà comunque quando si sceglie quale LOD utilizzare se si dispone di un sistema LOD). Per una maggiore efficienza può essere utilizzata una sorta di struttura gerarchica dei dati spaziali per il culling: quadrifori o ottetti, alberi delle sfere, sistemi di portali (generalmente poco usati per ambienti esterni), schemi basati su griglia semplici, ecc. L'idea di base è di salvare il lavoro selezionando un nodo di livello superiore nella gerarchia e quindi evitando di guardare anche molti nodi foglia. Un semplice esempio consiste nel selezionare un edificio e abbattere efficacemente tutti i suoi nodi figlio (oggetti all'interno o sopra l'edificio) senza guardarli singolarmente.

Per un gioco come l'oblio probabilmente stanno anche facendo una specie di occultamento, selezionando gli oggetti prima di inviarli all'hardware grafico in base alla determinazione che sono nascosti dietro altri oggetti. Esistono varie tecniche per fare ciò, alcune possono essere piuttosto complesse.

Problemi correlati