Combien de shaders actifs à une image du jeu dois-je généralement utiliser? 5 ou plus comme 100?

20

Combien de shaders sont généralement actifs, en même temps dans une scène, dans les jeux modernes? Je sais que plusieurs shaders sont utilisés, les jeux basculant entre eux dans chaque image, et il est courant de dessiner des objets via le shader:

  1. Dessinez tous les objets avec le shader one
  2. Passer du shader un au shader deux
  3. Dessinez tous les objets avec le shader deux

Pourtant, je sais que ce n'est pas aussi simple, en particulier avec des effets comme un effet de lueur pour toute la scène, le rendu à la texture, etc., mais je suppose que nous pouvons supposer que cela fonctionne de cette façon la plupart du temps, non? L'approche "grouper par shader" est bonne, car la commutation des shaders est une opération coûteuse.

D'un côté, vous ne pouvez pas avoir trop de shaders, car vous voulez rendre la scène rapidement. D'autre part, vous avez besoin de nombreux shaders différents (ou uber-shader avec des branches - assez similaires) pour la peau, le métal, l'eau, etc.

Combien (et quels) shaders différents le jeu de détective 3D théorique, moderne, à la troisième personne pour PC (DirectX 11, le cas échéant) utiliserait-il? Ce serait 5, 20 ou plus comme 100 shaders actifs, ne comptant que les actifs, à une certaine "trame X"? Je sais que ce n'est pas un chiffre, mais je me demande quelle échelle et quels facteurs sont importants, en considération pour un jeu PC.


Dans mon exemple de jeu, j'utiliserais environ 9-11 par image (comptez-le comme différent, de petits shaders ou un uber-shader - ça n'a plus d'importance maintenant):

  1. Shader de peau
  2. Shader des yeux (pas trop? Mais ils sont différents)
  3. Shader métal
  4. Shader au sol
  5. Shader neige / pluie (si nécessaire)
  6. Shader d'eau (si l'eau existe dans la scène)
  7. Glow shader (uniquement lorsque certains effets spéciaux sont impliqués)
  8. Shader émetteur de lumière (lampadaires, etc.)
  9. Ombrage standard (pour tous les autres, juste ombrage standard)
  10. Shader standard avec des cartes normales
  11. Shader 2D (pour GUI etc.)

Est-ce «beaucoup» ou «pas beaucoup»? Ai-je oublié certains shaders importants dont j'aurais besoin?

PolGraphic
la source

Réponses:

28

Cela dépend vraiment de la technique. Dans un rendu direct, vous avez souvent un shader pour chaque type de matériau. Dans les jeux AAA qui utilisent cette technique, les shaders sont souvent générés à partir d'un ensemble d'options sur le matériau qu'un artiste peut définir. Cela peut conduire à des centaines de shaders (1). Mais disons généralement que le nombre de shaders est de l'ordre de 40

Dans un ombrage / rendu différé, vous encodez souvent le type de matériau dans le G-buffer et utilisez ensuite un grand shader pour rendre correctement différents types de matériaux différemment. Cela conduit à des shaders beaucoup moins, mais plus compliqués. Disons que le nombre de shaders est de l'ordre de 5.

(1) Source: J'ai travaillé pour un entrepreneur de Crystal Dynamics où j'ai construit un outil pour réduire le nombre de shaders générés pour Tomb Raider depuis que la génération automatique devenait incontrôlable;). L'objectif était de réduire le nombre de shaders à l'ordre de 40 ou quelque chose comme ça.

Roy T.
la source
2
Merci pour votre réponse - c'était assez complexe et riche. Je viens de le voter. Pourtant, j'attendrai quelques jours avant de marquer, car c'est une question assez «ouverte» - peut-être que quelqu'un d'autre aura aussi quelque chose à ajouter de sa propre expérience. Encore une fois, merci Roy :)
PolGraphic
s / moins / moins / ...
erreur
3

Je sais que tu voulais une réponse pour PC. Mais je répondrai de ce que je fais dans iOS et je ne m'attends pas à recevoir votre coche.

Il semble que vous ayez la bonne idée. Cela va être différent pour chaque application. En fin de compte, il s'agit de faire ce qu'il faut pour obtenir la fréquence d'images souhaitée. Sur l'iPhone, mon objectif est de 60. Je n'aime pas qu'il descende en dessous de 30. Quand j'ai une explosion avec plusieurs centaines de particules animées à base de sprite, il descend à 30 sur l'iphone5 et beaucoup plus bas sur le 4. Donc Je dois prendre des décisions sur la réduction de la complexité de certains appareils. Et parfois, cette décision affecte les shaders.

Mais cela n'affecte généralement pas le nombre de shaders, mais plutôt les shaders que j'utilise pour une tâche en fonction de mon objectif de fréquence d'images.

À mon avis, les shaders, lorsqu'ils sont utilisés correctement, augmentent la fréquence d'images. J'ai une application qui a 80 shaders, mais elle ne les utilise pas tous sur une seule image - probablement environ 10. Et elle les compile au besoin et les supprime tous entre les scènes. Et sur mon matériel, je n'ai pas vu la fréquence d'images de l'effet de comptage des shaders. Seules les techniques utilisées dans le shader. Mais pour sûr, je pense que l'utilisation de 2 shaders similaires est meilleure pour la fréquence d'images que d'avoir un plus complexe qui se ramifie.

J'ai également des shaders qui réduisent la qualité si le rendu est lent ou sur un appareil plus lent. J'utilise le mappage normal sur l'iPhone 5, mais je remplace le shader par celui qui ne fait pas de mappage normal sur l'iPhone 4.

J'aime la réponse de Roy et j'essaie toujours de comprendre comment les "vrais" jeux sont créés. Depuis que je suis autodidacte, je ne sais jamais si ma grande découverte de la journée est simplement comment cela se fait généralement ou encore quelques pas derrière les vrais professionnels.

badweasel
la source
1
Aucun problème avec le fait que votre réponse "est pour iOS". J'ai dit à propos du PC principalement parce que je veux éviter "ça dépend de la plateforme" répond brièvement;) Peut-être que votre réponse n'est pas à 100% pour moi. Mais malgré tout, il a des conclusions indépendantes de la plate-forme, donc je l'ai trouvé bon. Et d'autres membres de la communauté (qui utilisent iOS) peuvent le trouver encore plus utile, alors merci et votez pour moi :)
PolGraphic
1

Vous ne pouvez pas vraiment chiffrer le nombre de shaders que vous devriez ou ne devriez pas avoir, car cela dépend des facteurs limitants de votre jeu, ainsi que de la plate-forme cible. Dans la pratique, il faut suivre la réduction du nombre de shaders actifs pour "seulement autant que vous en avez réellement besoin". Parfois, cela signifie que vous n'avez qu'une poignée de shaders (une dizaine) à la fois, et parfois cela signifie que vous en avez quelques dizaines.

Une façon d'aider à limiter la quantité de permutations qui apparaissent dans votre jeu est d'implémenter la technique "ubershader", par laquelle presque chaque shader est dérivé d'un shader singulier, et les différences et les comportements spéciaux sont échangés via un préprocesseur. Il existe bien sûr des exceptions pour les effets spéciaux tels que la profondeur de champ, l'occlusion ambiante, etc.

Mon expérience avec les jeux AAA jusqu'à présent a montré que quelques dizaines de shaders actifs n'étaient pas déraisonnables.

Evan
la source