Quantos shaders ativos em um quadro no jogo devo usar normalmente? 5 ou mais como 100?

20

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:

  1. Desenhar todos os objetos com um sombreador
  2. Mude de shader one para shader two
  3. 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):

  1. Tonalizador de pele
  2. Shader dos olhos (não muito? Mas eles são diferentes)
  3. Shader metálico
  4. Shader de solo
  5. Shader neve / chuva (se necessário)
  6. Shader de água (se a água existir em cena)
  7. Glow shader (somente quando alguns efeitos especiais estão envolvidos)
  8. Sombra do emitador de luz (lâmpadas de rua etc.)
  9. Shader padrão (para todos os outros, apenas sombreamento padrão)
  10. Shader padrão com mapas normais
  11. Sombreador 2D (para GUI etc.)

É "muito" ou "não muitos"? Esqueci alguns shaders importantes que eu precisaria?

PolGraphic
fonte

Respostas:

28

Realmente depende da técnica. Em uma renderização para a frente, geralmente você tem um sombreador para cada tipo de material diferente. Nos jogos AAA que usam essa técnica, os sombreadores geralmente são gerados a partir de um conjunto de opções no material que um artista pode definir. Isso pode levar a centenas de shaders (1). Mas vamos dizer que geralmente o número de shaders é da ordem de 40

Em um sombreamento / renderização diferida, você costuma codificar o tipo de material no buffer G e, mais tarde, usa um grande sombreador para renderizar corretamente diferentes tipos de materiais. Isso leva a muito menos, mas mais complicados, shaders. Digamos que o número de shaders aqui esteja na ordem de 5.

(1) Fonte: trabalhei para um empreiteiro da Crystal Dynamics, onde construí uma ferramenta para reduzir o número de shaders gerados para o Tomb Raider, pois a geração automática estava ficando fora de controle;). O objetivo era reduzir o número de shaders para a ordem de 40 ou algo assim.

Roy T.
fonte
2
Obrigado pela sua resposta - era bastante complexo e rico. Acabei de votar. Ainda assim, esperarei alguns dias antes de marcar, porque é uma pergunta bastante "aberta" - talvez alguém tenha mais algo a acrescentar da sua própria experiência. Mais uma vez, graças Roy :)
PolGraphic
s / less / less / ...
erro
3

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.

badweasel
fonte
11
Não há problema com o fato de que sua resposta "é para iOS". Eu disse sobre o PC principalmente porque quero evitar "depende da plataforma", respostas curtas;) Talvez sua resposta não seja 100% para mim. Mas, ainda assim, ele tem algumas conclusões independentes de plataforma, por isso achei bom. E outros membros da comunidade (que usam iOS) podem encontrá-lo ainda mais útil, por isso obrigado e voto-up de me :)
PolGraphic
1

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.

Evan
fonte