Budget des modèles 3D. Ce qui compte le plus de triangles ou de sommets

12

Lorsque je crée un modèle pour un jeu 3D, que dois-je prendre comme mesure dans mon budget Polygones (triangles) ou sommets? J'ai fait une expérience avec deux ensembles 40000 cubes l'un avec 8 sommets et 12 triangles, l'autre avec 24 sommets et 12 triangles. Tout a été fait dans Unity et les deux ont été générés de manière procédurale. À ma grande surprise, les deux sets ont joué presque la même chose, il y avait une très petite différence entre eux.

Cela signifie-t-il que je ne devrais pas me soucier du nombre de sommets et ne regarder que le nombre de triangles?

EDIT: J'ai fait une autre expérience, j'ai créé un plan avec 19602 triangles et 10000 sommets et un autre avec la même quantité de tirangles mais 39204 sommets. J'ai généré 4000 des deux. Désormais, moins de sommets gagnaient de 14 à 19 ips. Donc je suppose que généralement moins c'est mieux, mais seulement dans de grandes différences.

Michał Leszczyński
la source
9
Écrivez votre jeu et corrigez les problèmes à mesure qu'ils surviennent. Ce genre de problème peut ne jamais survenir et vous perdez votre temps: P
Vaillancourt

Réponses:

16

Imaginons un grand maillage de grille, comme celui que nous pourrions utiliser pour le terrain. Nous en rendrons des ntriangles, couvrant par exemple la moitié de notre écran 1080p, en un seul appel.

Si nous soudons tous nos sommets et n'avons pas de coutures de lissage / texturation, alors chaque triangle a 3 sommets et chaque sommet est partagé par 6 triangles, nous avons donc des n/2sommets.

Pour rendre cela, nous devons:

  • Exécutez le vertex shader au moins une n/2fois

    ("au moins" parce que notre cache pour les résultats des sommets est seulement si grand. Parfois, nous finirons par expulser un sommet que nous avons déjà transformé, puis nous en aurons besoin à nouveau pour un triangle ultérieur qui le partage et donc réexécuter le vertex shader sur celui-ci Nous n'obtenons donc pas autant d'économies que sur le papier)

  • nTriangles à clipser et à éliminer .

  • Pixellisez et interpolez sur au moins 1 920 x 1 080/2 ou environ 1 million de pixels du tampon d'image (car nous avons dit que notre terrain couvre environ la moitié de l'écran).

    ("au moins" en raison de la façon dont les GPU fonctionnent sur des quadrilatères de pixels , certains fragments juste à l'extérieur des bords des polygones sont encore tramés mais masqués, ce qui signifie que nous traitons les fragments deux fois. Pour un maillage cahoteux, nous aurons également un surplomb n'importe où le maillage s'obstrue, si nous n'avons pas la chance de dessiner le polygone le plus en avant dans le tampon de profondeur en premier)

  • Exécutez le shader de fragments pour tous ces fragments> = 1 million.

  • Mélangez ~ 1 million de résultats dans les tampons de cadre et de profondeur.

Bon, maintenant, déroulons tous nos sommets alors maintenant nous avons des 3nsommets à rendre, six fois plus qu'auparavant! Nos étapes sont ...

  • Exécutez les temps de vertex shader 3n.

    (Pas d'astérisques en raison de la mise en cache car chaque sommet n'est utilisé qu'une seule fois, bien que cela signifie que le cache ne peut pas nous sauver à tout moment)

  • nTriangles à clipser et à éliminer .

  • Pixellisez et interpolez sur au moins 1 920 x 1 080/2 ou environ 1 million de pixels du tampon d'image.

  • Exécutez le shader de fragments pour tous ces fragments> = 1 million.

  • Mélangez ~ 1 million de résultats dans les tampons de cadre et de profondeur.

... attendez, chaque étape sauf la première est la même! Ainsi, la plupart du travail effectué par le GPU dans un appel de dessin typique n'est pas directement lié au nombre de sommets utilisés. Le montant de la couverture d'écran, le dépassement et le nombre total de triangles représentent beaucoup plus le coût.

Cela ne signifie pas que les sommets sont totalement libres. Si vous partagez des sommets lorsque vous le pouvez, vous pouvez réaliser de modestes économies grâce à la mise en cache, surtout si vos vertex shaders sont compliqués ou que le pipeline de vertex de votre matériel est faible (comme c'était le cas sur certaines consoles plus anciennes). Mais étant donné que le nombre de sommets suit proportionnellement au nombre de triangles plus ou moins un facteur constant, ce n'est généralement pas aussi intéressant une mesure du coût global du maillage.

DMGregory
la source
Qu'en est-il du coût d'envoi de ces sommets en mémoire?
Michał Leszczyński, le
7
À moins que vous ne changiez votre tampon de vertex à chaque image, vous payez ce coût de téléchargement une fois. Vos textures et votre tampon d'image sont probablement les plus gros porcs de mémoire vidéo et de bande passante dans une image donnée. Cela signifie toujours que les sommets ne sont certainement pas gratuits, et il est préférable de les partager lorsque cela est pratique, mais les sommets non partagés seront rarement, sinon jamais, la raison pour laquelle un jeu fonctionne mal.
DMGregory
J'ajouterai à cela, car je fais des forêts, etc. dans mon jeu. Lorsque j'ai commencé, j'utilisais initialement des appels de dessin (j'utilise mon propre moteur, cela ne correspond peut-être pas complètement à votre question) pour dessiner des modèles avec des verts uniquement, cela en soi était correct, les performances étaient bonnes. Mais, lorsque j'ai commencé à utiliser l'indexation, j'ai obtenu une amélioration des performances car certains verts étaient partagés et donc mis en cache, donc certains calculs n'ont pas été effectués deux fois. En fin de compte, ce test brut des verts à lui seul n'est pas le meilleur indicateur des verts par rapport au nombre de tri. Votre pipeline peut être affecté par un trop grand nombre des deux. Comme d'autres réponses le mentionnent.
ErnieDingo
2

Ni.

À moins que vous ne parliez d'un nombre vraiment énorme de tris (millions), ce qui vous importe, c'est:

  • Nombre de pixels rendus
  • Coût du fragment shader
  • Nombre d'appels de tirage (la limite dépendant fortement de l'appareil).

24 sommets fois 4000 cubes donne 96'000 sommets.

640x380 pixels donne 243'200 fragments, et la plupart des appareils prennent en charge des résolutions considérablement plus grandes.

Vous pouvez relancer votre expérience avec 1'000'000 cubes, groupés pour éviter le goulot d'étranglement d'appel de tirage (1 modèle unique pour 1'000 cubes).

Peter
la source
2
Cela dépend beaucoup de la scène et de la façon dont vous effectuez le rendu. Si vous avez une scène qui a naturellement relativement peu de surcharge, le traitement des vertex peut certainement dominer vos performances. De plus, le nombre d'appels de tirage n'est pas le problème (pour certaines API) autant que les changements d'état entre les appels de tirage.
Nicol Bolas
1

Il convient de noter que si vous faites une application WebGL, le nombre de vertex devient rapidement un goulot d'étranglement en termes de taille de fichier pour les utilisateurs à télécharger. Même nombre de triangles mais souvent 2 à 3 fois plus de sommets que celui indiqué dans le logiciel DCC. Un meilleur déballage peut être très utile dans ce cas en ayant moins de coutures.

Francisco Toledo
la source