Rendering design. Come posso gestire efficacemente il rendering in avanti, differito e trasparente?

6

Ho molti oggetti nel mio mondo di gioco che derivano tutti da una classe base.

Ogni oggetto avrà materiali diversi e sarà quindi richiesto di essere disegnato usando varie tecniche di rendering.

Attualmente utilizzo il seguente ordine per il rendering dei miei oggetti.

  • differite
  • Avanti
  • Trasparente (indipendente dall'ordine)

Ogni oggetto ha un flag di rendering che denota quale dei seguenti metodi dovrebbe essere usato.

L'elenco degli oggetti di base nella scena viene quindi ripetuto e aggiunto a elenchi separati di oggetti differiti, avanzati o trasparenti in base al loro valore di flag di rendering.

I singoli elenchi vengono quindi ripetuti e disegnati utilizzando l'ordine di cui sopra. Ogni lista viene cancellata alla fine del frame.

Questo metodo funziona abbastanza bene, ma richiede diversi metodi di disegno per ogni tipo di materiale.

Ad esempio, ogni oggetto richiede i seguenti metodi per essere compatibile con le possibili impostazioni dei flag.

object.DrawDeferred()
object.DrawForward()
object.DrawTransparent()

È anche difficile vedere dove i metodi al di fuori dei materiali, come il rendering delle shadow map, si adatterebbero usando questo design "flag & method".

object.DrawShadow()

Speravo che qualcuno potesse avere qualche suggerimento per migliorare questo processo di rendering, forse rendendolo più generico e meno prolisso?

    
posta user1423893 08.10.2012 - 01:26
fonte

2 risposte

2

Puoi usare Strategia.

Hai una classe base IDrawer :: draw () con sottoclassi DefferedDrawer, ForwardDrawer, TransperantDrawer, ecc.

Hai quindi una classe base per i tuoi oggetti: IDrawable che usa un delegato del cassetto IDrawer per l'estrazione effettiva: IDrawable :: draw () {drawer- > draw (); }

Anche IDrawable ha un metodo per cambiare il cassetto: IDrawable :: setDrawer (IDrawer someDrawer) {this- > drawer = someDrawer;}

oppure il cassetto può essere automaticamente aggiornato da una sorta di macchina a stati (qui dipende dal tuo utilizzo), a seconda dei cambiamenti di contesto.

Quindi hai un singolo contenitore per i tuoi oggetti (che può essere ordinato secondo alcuni criteri) e chiama obj.draw ()

    
risposta data 20.12.2012 - 13:18
fonte
0

Non so cosa significano le parole "differita" e "avanti" nel tuo caso, ma secondo me, dovresti rendere il mondo nel seguente ordine:

  1. Disegna il mondo. Se possibile, disegna prima i poligoni più vicini, quindi il test di profondità può eliminare i poligoni che non saranno visibili al giocatore. È meglio suddividere il mondo in più segmenti, in modo da poter fare visibilità e abbattere il tronco per ridurre drasticamente la quantità di poligoni tracciati.
  2. Disegna i modelli. A causa del test di profondità, la tua scheda grafica non renderà i poligoni dietro i muri. Prima di eseguire il rendering di un modello, controlla se è visibile nel view frustum, questo è impotante perché i modelli di solito sono costituiti da molti poligoni.
  3. Disegna le cose più lontane come sky box.
  4. Abilita la fusione e disegna oggetti solidi traslucidi.
  5. Disabilita la scrittura sul buffer Z e disegna gli sprite in un ordine molto vicino.
  6. Riattiva la scrittura sul buffer Z e cancella il buffer Z per impedire che gli oggetti vicini passino attraverso i muri.
  7. Disegna oggetti vicini come il modello di arma, le gambe e l'HUD 3D.
risposta data 18.12.2012 - 17:48
fonte

Leggi altre domande sui tag