A resposta é que depende.
Basicamente, existem duas escolas de pensamento; shaders pequenos e ótimos para tudo e para o acampamento do uber-shader.
Os pequenos shaders são exatamente isso; faça uma coisa e faça bem. Os Uber-shaders controlam sua funcionalidade no tempo de execução por meio de uniformes ou compilam-se em vários shaders diferentes através de macros de pré-processador (e / ou fontes de shader geradas).
A solução ideal provavelmente não é nenhuma, mas algum tipo de híbrido. Talvez alguns super-shaders ou super-shaders combinados com shaders especializados em alguns casos.
Shader pequeno
Prós:
- É provável que seja mais rápido / ideal
- Faz exatamente o que você quer fazer
- Pode fazer coisas estranhas e personalizadas facilmente
Contras:
- Facilmente sai do controle, especialmente quando o número de recursos aumenta
- Provavelmente mais trabalho, a menos que você tenha um número muito pequeno de shaders
Uber-shader
Prós:
- Tudo em um só lugar
- Mais amigável ao artista (usar o recurso A com o recurso X pela primeira vez não requer necessariamente tempo do codificador)
Contras:
- Tempos de compilação mais longos do shader
- Resultados menos otimizados (especialmente se uniformes forem usados para ativar / desativar recursos)
- Pode ser mais difícil depurar / otimizar