Quantos shaders geralmente estão ativos, ao mesmo tempo em uma cena, nos jogos modernos? Eu sei que vários shaders estão sendo usados, com os jogos alternando entre eles em cada quadro, e é comum desenhar objetos através do shader:
- Desenhar todos os objetos com um sombreador
- Mude de shader one para shader two
- Desenhe todos os objetos com shader two
Ainda assim, eu sei que não é tão simples, especialmente com efeitos como um efeito de brilho para toda a cena, renderização para textura, etc., mas acho que podemos assumir que funciona dessa maneira na maioria das vezes, certo? A abordagem "agrupar por sombreador" é boa, porque a troca de sombreadores é uma operação cara.
De um lado, você não pode ter muitos shaders, porque deseja renderizar a cena rapidamente. Por outro lado, você precisa de muitos shaders diferentes (ou super shader com galhos - bastante semelhantes) para pele, metal, água etc.
Quantos (e quais) shaders diferentes o jogo teórico, moderno e de terceira pessoa em 3D de detetive para PC (DirectX 11, se necessário) usa? Seria 5, 20 ou mais como 100 shaders ativos, contando apenas ativos, em algum "quadro X"? Sei que não é um número, mas me pergunto que escala e fatores são importantes, considerando um jogo para PC.
No meu exemplo de jogo, eu usaria de 9 a 11 por quadro (conte como diferente, pequenos shaders ou um uber-shader - não importa agora):
- Tonalizador de pele
- Shader dos olhos (não muito? Mas eles são diferentes)
- Shader metálico
- Shader de solo
- Shader neve / chuva (se necessário)
- Shader de água (se a água existir em cena)
- Glow shader (somente quando alguns efeitos especiais estão envolvidos)
- Sombra do emitador de luz (lâmpadas de rua etc.)
- Shader padrão (para todos os outros, apenas sombreamento padrão)
- Shader padrão com mapas normais
- Sombreador 2D (para GUI etc.)
É "muito" ou "não muitos"? Esqueci alguns shaders importantes que eu precisaria?
Eu sei que você queria uma resposta para PC. Mas vou responder pelo que faço no iOS e não espero ter sua marca de seleção.
Parece que você tem a ideia certa. Porém, será diferente para cada aplicativo. No final, trata-se de fazer o necessário para obter a taxa de quadros desejada. No iPhone, minha taxa de objetivo é 60. Não gosto que ele fique abaixo de 30. Quando tenho uma explosão com várias centenas de partículas animadas baseadas em sprites, ela cai para 30 no iphone5 e muito mais baixa no 4. Então Eu tenho que tomar decisões sobre como reduzir a complexidade em determinados dispositivos. E às vezes essa decisão afeta shaders.
Mas geralmente não afeta quantos shaders, mas sim quais shaders eu uso para uma tarefa com base na minha meta de taxa de quadros.
Na minha opinião, os shaders, quando usados corretamente, aumentam a taxa de quadros. Eu tenho um aplicativo que possui 80 shaders, mas ele não usa todos eles em um único quadro - provavelmente em torno de 10. E os compila conforme necessário e os descarta entre as cenas. E no meu hardware, não vi a taxa de quadros do efeito de contagem de sombreadores. Somente as técnicas usadas no shader. Mas com certeza eu acho que usar 2 shaders semelhantes é melhor para a taxa de quadros do que ter um mais complexo que se ramifique.
Também tenho shaders que reduzem a qualidade se a renderização for lenta ou em um dispositivo mais lento. Uso o mapeamento normal no iPhone 5, mas troco o shader por um que não faça o mapeamento normal no iPhone 4.
Gosto da resposta de Roy e estou sempre tentando entender como os jogos "reais" são feitos. Como sou autodidata, nunca sei se minha grande descoberta do dia é como é geralmente feita ou ainda a alguns passos dos profissionais reais.
fonte
Você realmente não pode colocar um número em quantos shaders você deve ou não deve ter, pois depende dos fatores limitantes do seu jogo, bem como da plataforma de destino. Na prática, a redução do número de shaders ativos para "apenas o número necessário" deve ser seguida. Às vezes, isso significa que você tem apenas um punhado de shaders (10 ou mais) de uma só vez, e às vezes significa que você tem algumas dezenas.
Uma maneira de ajudar a limitar a quantidade de permutações que aparece no seu jogo é implementar a técnica "ubershader", pela qual quase todo shader é derivado de um shader singular, e as diferenças e comportamentos especiais são trocados por um pré-processador. É claro que há exceções para efeitos especiais, como profundidade de campo, oclusão ambiental e assim por diante.
Minha experiência com jogos AAA até esse ponto mostrou que algumas dezenas de shaders ativos não são irracionais.
fonte