Domanda

Sto lavorando a un gioco 2d. Immagina un piano XY e sei un personaggio. Mentre il tuo personaggio cammina, viene visualizzato il resto della scena.

Immagina che il piano XY sia piuttosto grande e che ci siano altri personaggi al di fuori della tua vista corrente.

Ecco la mia domanda, con opengl, se quegli oggetti non sono resi al di fuori della vista corrente, consumano tempo di elaborazione?

Inoltre, quali sono alcuni approcci per evitare che parti della scena vengano rese non visibili. Se ho un cubo a 1000 unità dalla mia posizione attuale, non voglio che l'oggetto sia reso. Come potrei avere l'opengl non renderlo.

Immagino che l'approccio più semplice sia calcolare la posizione e quindi non disegnare quel cubo / oggetto se è troppo lontano.

È stato utile?

Soluzione

Se il grafico della scena è stato impostato correttamente, gli oggetti al di fuori del campo visivo devono essere eliminati all'inizio della pipeline di visualizzazione. Richiederà un check box nel tuo codice per verificare che l'oggetto sia invisibile, quindi ci sarà un certo overhead di elaborazione (ma non molto).

Se organizzi i tuoi oggetti in una gerarchia sensibile, puoi tagliare grandi sezioni della scena con un solo segno di spunta.

Altri suggerimenti

OpenGL faq su " Test di ritaglio, abbattimento e visibilità " ; dice questo:

  

OpenGL non fornisce supporto diretto per determinare se una data primitiva sarà visibile in una scena per un determinato punto di vista. Nel peggiore dei casi, un'applicazione dovrà eseguire questi test manualmente. La domanda precedente contiene informazioni su come eseguire questa operazione.

Vai avanti e leggi il resto di quel link, è tutto pertinente.

In genere l'applicazione deve eseguire queste ottimizzazioni: OpenGL è letteralmente solo la parte di rendering e non esegue la gestione degli oggetti o qualcosa del genere. Se passi i dati per qualcosa di invisibile, deve comunque trasformare le coordinate pertinenti in uno spazio di visualizzazione prima di poter determinare che è completamente fuori dallo schermo o al di là di uno dei tuoi piani di clip.

Esistono diversi modi per eliminare oggetti invisibili dalla pipeline. Controllare se un oggetto si trova dietro la telecamera è probabilmente il controllo più semplice ed economico da eseguire poiché puoi rifiutare in media metà del tuo set di dati con un semplice calcolo per oggetto. Non è molto più difficile eseguire lo stesso tipo di test contro il frustrazione della vista reale per rifiutare tutto ciò che non è affatto visibile.

Ovviamente in un gioco complesso non dovrai farlo per ogni piccolo oggetto, quindi è tipico raggrupparli in ordine gerarchico (ad es. non renderesti una pistola se hai già deciso che non stai interpretando il personaggio che lo detiene), spazialmente (es. dividendo il mondo in una griglia / quadrifoglio / octree e rifiutare qualsiasi oggetto che conosci sia all'interno di una zona che hai già determinato è attualmente invisibile), o più comunemente una combinazione di entrambi.

" l'unica mossa vincente non è giocare "

Ogni glVertex ecc. sarà un successo prestazionale indipendentemente dal fatto che alla fine venga visualizzato sullo schermo. L'unico modo per aggirare il problema è non disegnare (cioè eliminare) oggetti che non saranno mai resi comunque.

Il metodo più comune è quello di avere un la visualizzazione della frustum legata alla tua fotocamera. Abbinalo a un octtree o quadtree a seconda che il tuo gioco sia 3d / 2d, quindi non devi controllare ogni singolo oggetto del gioco contro il frustum.

Il driver sottostante può eseguire alcune operazioni di culling dietro le quinte, ma non si può dipendere da questo dato che non fa parte dello standard OpenGL. Forse lo fa il driver del tuo computer, ma forse quello di qualcun altro (che potrebbe eseguire il tuo gioco) no. È meglio che tu faccia il tuo abbattimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top