É melhor manter as coisas o mais simples possível. Duplicar o mesmo sombreador para cada objeto é desnecessário e ficará inchado rapidamente. Você também não deseja um shader gigante que cubra todos os casos de uso possíveis, pois isso causa sobrecarga desnecessária.
Existem várias opiniões sobre gerenciamento de sombreadores e nenhuma maneira "ideal" de abordar isso. Eu já vi algumas implementações de shader em que cada shader é gerado com base em parâmetros off-the-fly (por exemplo, no mecanismo Unreal ).
Para alguém que está começando nessa área, talvez seja bom escrever primeiro os shaders básicos. Por exemplo, tenho um sombreador para objetos sem textura, um sombreador com textura básica e suporte para iluminação por pixel, etc ... Cada vez que eu quero um efeito diferente que não pode ser feito usando um sombreador anterior, então eu ' Criaremos um novo para o novo efeito.
O objetivo desse sistema é manter as coisas simples. Somente. Manter. Isto. Simples.