GLSL, tutto in uno o molti programmi shader?


17

Sto facendo alcune demo 3D usando OpenGL e ho notato che GLSL è in qualche modo "limitato" (o sono solo io?). Comunque ho molti diversi tipi di materiali. Alcuni materiali hanno colori ambientali e diffusi, alcuni materiali hanno una mappa di occlusione ambientale, alcuni hanno una mappa speculare e una mappa di rilievo ecc.

È meglio supportare tutto in una coppia di shader vertice / frammento o è meglio creare molti shader di vertice / frammento e selezionarli in base al materiale attualmente selezionato? Qual è la solita strategia shader in OpenGL o D3D?



Questa è una falsa dicotomia, che devi scegliere l'uno o l'altro approccio alla gestione degli shader. In quindici anni nel settore, non ho mai lavorato a un progetto in cui abbiamo aderito a nessuno dei due estremi, ma ho sempre trovato un equilibrio tra i due approcci alla gestione degli shader, utilizzando ciascuno di essi dove aveva senso farlo.
Trevor Powell,

Risposte:


12

La risposta è che dipende in qualche modo.

Fondamentalmente ci sono due scuole di pensiero; shader piccoli e ottimali per tutto e il campo Uber-Shader.

I piccoli shader sono proprio questo; fai una cosa e fallo bene. Gli Uber-shader controllano la loro funzionalità in fase di esecuzione tramite uniformi o si compongono in un gruppo di shader diversi attraverso macro preprocessore (e / o fonti di shader generate).

La soluzione ottimale non è probabilmente nessuno dei due, ma una specie di ibrido. Forse alcuni uber-shader o uber-shader combinati con shader specializzati in alcuni casi.

Piccolo shader

Professionisti:

  • Probabile essere più veloce / più ottimale
  • Fa proprio quello che vuoi che faccia
  • Può fare facilmente cose strane e personalizzate

Contro:

  • Ti sfugge facilmente di mano, soprattutto quando aumenta il numero di funzioni
  • Probabilmente più lavoro, a meno che tu non abbia un numero molto piccolo di shader

Uber-Shader

Professionisti:

  • Tutto in un unico posto
  • Più adatto agli artisti (l'utilizzo della funzione A con la funzione X per la prima volta non richiede necessariamente tempo del programmatore)

Contro:

  • Tempi di compilazione dello shader più lunghi
  • Risultati meno ottimali (specialmente se le uniformi vengono utilizzate per attivare / disattivare le funzioni)
  • Potrebbe essere più difficile eseguire il debug / ottimizzare

Uber-shaderin questa rappresentazione non è una buona cosa :) Proporrei di scrivere un buon gestore di shader basato su predefiniti - quindi avremo un codice super-shader con molti messaggi #ifdefche verranno attivati ​​per vari materiali.
Brigadir,

2
Aggiungo che un altro pro di un uber-shader è che il cambio di shader ha un costo in termini di prestazioni, quindi se passi meno spesso, potresti essere in grado di migliorare le prestazioni.
Jherico,
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.