Les appels de tirage sont-ils exécutés en parallèle ou séquentiellement ou les deux?

8

Ceci fait suite à une question à laquelle j'ai répondu sur GameDev SE. La question était simplement glDrawArraysInstanced en parallèle OpenGL lors du dessin de ces instances?

Ma réponse était dans les lignes de "le GPU pourrait exécuter plusieurs appels de dessin en parallèle en fonction de plusieurs choses, par exemple si deux appels de dessin utilisent les mêmes vertex shaders." Voici la réponse complète .

Dans les commentaires, le PO a mentionné: "Je pense que cela devrait être séquentiel. Après tout, une partie du mode de fusion dépend de la séquence"

Maintenant, je suis un peu confus. Ma réponse sera-t-elle encore parallélisée quand elle pourra être valide? Quelqu'un peut-il clarifier cela?

concept3d
la source

Réponses:

9

Le résultat devrait être comme s'il était exécuté séquentiellement un triangle à la fois. Ceci est important pour que chaque image soit déterministe. Si ce n'était pas le cas, dessiner le même cadre plusieurs fois pourrait créer des résultats différents et créer une image vacillante à l'écran.

Cependant, cela ne signifie pas que la parallélisation est impossible . Les sommets peuvent être calculés en parallèle. Leurs résultats seront commandés et envoyés au rasterizer qui alimentera la phase de shader de fragments.

La même chose se produit avec les pixels. En règle générale, un groupe de pixels d'un triangle peut être calculé en parallèle et fusionné. Un triangle sans chevauchement peut également être rempli en même temps, mais si le triangle chevauche celui actuellement occupé, le résultat du fragment shader doit être mis en mémoire tampon jusqu'à ce que les pixels correspondants du triangle précédent soient effectués afin que le mélange puisse se produire dans le bon ordre.

monstre à cliquet
la source
Il est tout à fait possible d'exécuter le pixel shader pour les triangles superposés en même temps. Tout ce qui compte, c'est que le mélange se fasse de manière séquentielle. Les pixel shaders peuvent lancer beaucoup de travail vers l'unité de mélange dans n'importe quel ordre, qui peut ensuite réorganiser toutes ces opérations de mélange en fonction du triangle dont il est issu.
John Calsbeek
J'ai vu des situations où le scintillement se produit en raison de plusieurs triangles situés dans le même plan, mais je ne me souviens pas si cela s'est produit pendant que l'appareil photo / le monde / etc. les transformations étaient statiques ou si elles nécessitaient un mouvement et un recalcul. C'est un cas de bord, cependant.
JAB
@JAB On dirait que vous faites référence aux combats z . Cela se produit généralement du fait que même si deux primitives sont coplanaires analytiquement, la quantification dans l'interpolateur produit un motif où certains pixels des deux primitives sont visibles. Le motif se déplacera, provoquant un scintillement, uniquement si les sommets (ou la caméra) sont déplacés, sinon le motif d'interférence doit être cohérent entre les images.
MooseBoys
@MooseBoys C'est exactement ça, oui. Cela fait quelques années que je n'ai pas beaucoup fait avec les graphismes 3D.
JAB
En plus d'exécuter plusieurs sommets et pixels en parallèle, il est également possible que plusieurs appels de tirage soient en cours en même temps, si suffisamment de ressources GPU sont disponibles et qu'il n'y a pas de dépendance entre les appels de tirage.
Nathan Reed