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.