Quanti shader attivi su un fotogramma nel gioco dovrei in genere usare? 5 o più come 100?


20

Quanti shader sono solitamente attivi, contemporaneamente in una scena, nei giochi moderni? So che vengono utilizzati più shader, con i giochi che cambiano tra loro in ogni frame, ed è comune disegnare oggetti tramite lo shader:

  1. Disegna tutti gli oggetti con uno shader
  2. Passa dallo shader uno allo shader due
  3. Disegna tutti gli oggetti con lo shader due

Tuttavia, so che non è così semplice, specialmente con effetti come l'effetto bagliore per l'intera scena, il rendering alla trama, ecc., Ma immagino che possiamo supporre che funzioni in questo modo la maggior parte delle volte, giusto? L'approccio "raggruppa per shader" è buono, perché cambiare shader è un'operazione costosa.

Da un lato, non puoi avere troppi shader, perché vuoi rendere velocemente la scena. D'altra parte, hai bisogno di molti shader diversi (o uber-shader con rami - abbastanza simili) per pelle, metallo, acqua ecc.

Quanti (e quali) diversi shader userebbero il gioco teorico, moderno, di terza persona, 3D detective per PC (DirectX 11, se importante)? Sarebbe 5, 20 o più come 100 shader attivi, contando solo attivo, in qualche "frame X"? So che non è un numero, ma mi chiedo quale scala e fattori siano importanti, in considerazione di un gioco per PC.


Nel mio gioco di esempio, userei circa 9-11 per fotogramma (contandolo come diverso, piccoli shader o uno uber-shader - non importa ora):

  1. Pelle shader
  2. Eye shader (non troppo? Ma sono diversi)
  3. Shader di metallo
  4. Shader a terra
  5. Snow / rain shader (se richiesto)
  6. Water shader (se l'acqua esiste in scena)
  7. Glow shader (solo quando sono coinvolti alcuni effetti speciali)
  8. Shader emettitore di luce (lampioni ecc.)
  9. Shader standard (per tutti gli altri, solo ombreggiatura standard)
  10. Shader standard con mappe normali
  11. Shader 2D (per GUI ecc.)

È "molto" o "non molti"? Ho dimenticato alcuni shader importanti di cui avrei bisogno?

Risposte:


28

Dipende molto dalla tecnica. In un rendering in avanti hai spesso uno shader per ogni diverso tipo di materiale. Nei giochi AAA che usano questa tecnica gli shader sono spesso generati da una serie di opzioni sul materiale che un artista può impostare. Questo può portare a centinaia di shader (1). Ma diciamo che generalmente il numero di shader è nell'ordine di 40

In un'ombreggiatura / rendering differito spesso si codifica il tipo di materiale nel buffer G e successivamente si utilizza un grande shader per eseguire correttamente il rendering di diversi tipi di materiale in modo diverso. Questo porta a molti meno shader, ma più complicati. Diciamo che il numero di shader qui è nell'ordine di 5.

(1) Fonte: ho lavorato per un appaltatore di Crystal Dynamics in cui ho creato uno strumento per ridurre il numero di shader generati per Tomb Raider poiché la generazione automatica stava sfuggendo di mano;). L'obiettivo era ridurre il numero di shader all'ordine di 40 o qualcosa del genere.


2
Grazie per la tua risposta: era piuttosto complesso e ricco. Ho appena votato. Tuttavia, aspetterò alcuni giorni prima che la marcatura sia, perché è una domanda piuttosto "aperta" - forse qualcun altro avrà qualcosa in più da aggiungere anche dalla propria esperienza. Ancora una volta, grazie Roy :)
PolGraphic

s / less / lesser / ...
errore

3

So che volevi una risposta per PC. Ma risponderò per quello che faccio in iOS e non mi aspetto di ottenere il tuo segno di spunta.

Sembra che tu abbia l'idea giusta. Tuttavia, sarà diverso per ogni app. Alla fine si tratta di fare ciò che serve per ottenere il frame rate desiderato. Su iPhone il mio obiettivo è 60. Non mi piace che sia inferiore a 30. Quando ho un'esplosione con diverse centinaia di particelle animate basate su sprite, scende a 30 su iPhone5 e molto più in basso su 4. Quindi Devo prendere decisioni sulla riduzione della complessità su determinati dispositivi. E a volte quella decisione ha effetti sugli shader.

Ma generalmente non influisce su quanti shader, ma piuttosto su quali shader utilizzo per un'attività in base al mio obiettivo di frame rate.

A mio avviso, gli shader usati correttamente aumentano il frame rate. Ho un'app che ha 80 shader, ma non li usa tutti su un singolo fotogramma - probabilmente intorno ai 10. E li compila come necessario e li scarta tutti tra le scene. E sul mio hardware non ho visto il frame rate dell'effetto conteggio shader. Solo le tecniche utilizzate nello shader. Ma di sicuro penso che usare 2 shader simili sia meglio per il frame rate che avere uno più complesso che si ramifica.

Ho anche shader che riducono la qualità se il rendering è lento o su un dispositivo più lento. Uso la mappatura normale su iPhone 5 ma cambio lo shader con uno che non esegue la mappatura normale su iPhone 4.

Mi piace la risposta di Roy e cerco sempre di capire come sono fatti i giochi "reali". Dal momento che sono autodidatta, non so mai se la mia grande scoperta del giorno è proprio come è generalmente fatta o ancora pochi passi dietro i veri professionisti.


1
Nessun problema con il fatto che la tua risposta "è per iOS". Ho detto del PC principalmente perché voglio evitare "dipende dalla piattaforma" risposte brevi;) Forse la tua risposta non è al 100% per me. Tuttavia, ha alcune conclusioni indipendenti dalla piattaforma, quindi l'ho trovato buono. E altri membri della community (che usano iOS) potrebbero trovarlo ancora più utile, quindi grazie e voto da parte mia :)
PolGraphic

1

Non puoi davvero mettere un numero su quanti shader dovresti o non dovresti avere, in quanto dipende dai fattori limitanti del tuo gioco, così come dalla piattaforma di destinazione. In pratica, ridurre il numero di shader attivi per essere "solo quanti ne hai effettivamente bisogno" dovrebbe essere seguito. A volte questo significa che hai solo una manciata di shader (10 o giù di lì) alla volta, e a volte significa che ne hai una dozzina.

Un modo per aiutare a limitare la quantità di permutazioni che compaiono nel tuo gioco è implementare la tecnica "ubershader", in base alla quale quasi ogni shader è derivato da un singolo shader e le differenze e i comportamenti speciali vengono scambiati tramite un preprocessore. Esistono ovviamente eccezioni per effetti speciali come profondità di campo, occlusione ambientale e così via.

La mia esperienza con i giochi AAA fino ad ora ha dimostrato che una dozzina di shader attivi non è irragionevole.

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.