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.
la source
Réponses:
Imaginons un grand maillage de grille, comme celui que nous pourrions utiliser pour le terrain. Nous en rendrons des
n
triangles, 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/2
sommets.Pour rendre cela, nous devons:
Exécutez le vertex shader au moins une
n/2
fois("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)
n
Triangles à 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
3n
sommets à 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)
n
Triangles à 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.
la source
Ni.
À moins que vous ne parliez d'un nombre vraiment énorme de tris (millions), ce qui vous importe, c'est:
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).
la source
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.
la source