Quanti programmi OpenGL dovrei usare per eseguire il rendering di più oggetti?


10

La mia scena contiene più oggetti. (Diciamo 3 cubi, 1 cilindro, 8 sfere.) Presumo che dovrei creare uno shader di vertice per ciascuno. Quanti programmi dovrei avere?

alternative:

  • Un programma per oggetto
  • Un programma per tutti i cubi e un altro per tutte le sfere (supponendo che utilizzino gli stessi shader)
  • Un grande programma per tutto

Qual è l'approccio corretto?


1
"Presumo che dovrei creare uno shader di vertice per ciascuno di essi." Perché stai assumendo questo? Uno shader di vertice trasformerà i vertici in base al modello e visualizzerà le matrici e quasi sempre vuoi che sia lo stesso per tutto.
usm

Risposte:


8

Dovresti considerare i programmi shader come parte simile dello stato come trame. Cambiare lo stato è costoso, quindi potresti essere in grado di cavartela combinando più trame con una per evitare cambi di trama; lo stesso vale per gli shader: potresti essere in grado di combinare diversi shader per evitare cambiamenti di stato.

Analogamente alla combinazione di trame, la combinazione di shader comporta un sovraccarico: se si esegue il rendering di un'area di 16x16 pixel da una trama di 4096x4096, non si utilizza l'hardware in modo efficiente. Allo stesso modo, se l'oggetto che visualizzi utilizza solo il 10% del codice nel tuo shader, è possibile (e persino probabile) che la scheda grafica stia calcolando molte cose inutilmente.

In breve, "dipende".


4
Inoltre, in molti casi puoi cavartela con un solo shader. Le differenze sono solo nelle uniformi che passi allo shader, come colore, trama, mappe normali, ecc.
rioki

Sì, ad esempio potresti avere uno shader "Scaly" che produce frammenti che sembrano squamosi e che funzionano in modo tale (la maggior parte degli shader lo fanno ...) che puoi renderizzare tutti i 3 cubi, 1 cilindro e 8 sfere usando quello uno shader (con le corrispondenti primitive geometriche, ovviamente). Una serie ragionevole di uniformi qui potrebbe essere un valore vettoriale che definisce il colore, e forse alcuni scalari o qualcosa che influenza quanto "squamoso" o "lucido" sarà l'effetto visivo. Quindi hai uno shader e cambi il modo in cui lo shader colora i frammenti cambiando le uniformi tra i disegni delle singole geometrie.
Steven Lu,

5

È meglio mantenere le cose il più semplice possibile. La duplicazione dello stesso shader per ogni oggetto non è necessaria e si gonfia rapidamente. Inoltre, non si desidera uno shader gigante che copra ogni possibile caso d'uso, poiché ciò provoca spese generali non necessarie.

Esistono diversi pareri sulla gestione dello shader e nessun modo "ottimale" per affrontarlo. Ho anche visto alcune implementazioni di shader in cui ogni shader viene generato al volo sulla base di parametri (ad esempio nel motore Unreal ).

Per qualcuno che sta appena iniziando in quest'area, potrebbe essere utile prima disegnare gli shader di base. Ad esempio, ho uno shader per oggetti senza testo, uno shader con texture di base e supporto per l'illuminazione per pixel, ecc ... Quindi ogni volta che voglio un effetto diverso che non può essere fatto usando uno shader precedente, allora io ' Ne creerò uno nuovo per il nuovo effetto.

Lo scopo di un tale sistema è quello di mantenere le cose semplici. Appena. Mantenere. Si. Semplice.


+1 perché hai menzionato ciò che sta facendo l'industria attuale.
Krythic,
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.