Dois-je perdre / gagner en performances pour éliminer les pixels même si je n'utilise pas de test de profondeur?

22

Lorsque j'ai recherché pour la première fois les instructions de suppression, j'ai trouvé des experts disant que l'utilisation de la suppression entraînerait une baisse des performances. Ils ont déclaré que la suppression des pixels briserait la capacité du GPU à utiliser correctement zBuffer car le GPU doit d'abord exécuter le fragment shader pour que les deux objets vérifient si celui le plus proche de la caméra est rejeté ou non. Pour un jeu 2D sur lequel je travaille actuellement, j'ai désactivé le test de profondeur et l'écriture en profondeur. Je dessine tous les objets triés par leur profondeur et c'est tout, pas besoin de GPU pour faire des choses fantaisistes. maintenant je me demande si c'est encore mauvais si je jette les pixels dans mon fragment shader?

Ali1S232
la source

Réponses:

20

Le matériel graphique peut effectuer une élimination précoce des fragments en fonction de la profondeur avant de calculer leur valeur de couleur (en d'autres termes, avant d'exécuter votre fragment shader). Par conséquent, si vous utilisez des fonctionnalités qui pourraient affecter cela, telles que discardles tests alpha ou la manipulation de gl_FragDepthla capacité du matériel à faire cette optimisation, cela sera compromis car la profondeur réelle du fragment ne peut pas être supposée et le shader complet doit être exécuté.

Cependant, le fait que l'utilisation de l'une quelconque de ces fonctionnalités compromettantes ait un impact net sur les performances observables dépend de la situation. L'optimisation early-z peut améliorer les performances si vous avez des shaders de fragments très chers, par exemple, mais si le coût de votre pipeline est dans le vertex shader (ou ailleurs), cela ne vous sera pas aussi bénéfique, et par conséquent vous ne verrez peut-être pas grand-chose. ou aucune dégradation des performances en utilisant discard.

La désactivation complète du test de profondeur via l'API devrait également empêcher l'optimisation de s'exécuter, car cela pourrait entraîner des scènes mal rendues. Dans votre cas, alors, peu importe que vous utilisiez discard.

Le matériel récent peut forcer les tests (y compris les premiers tests au pochoir) en utilisant layout(early_fragment_tests)- il y a plus d'informations (et mises en garde) à ce sujet sur la page que j'ai liée au début de la réponse.


la source
3

Comme toujours pour les questions de performances, la réponse la plus précise consiste à l'essayer sur votre matériel cible et à mesurer ce qui se passe.

Dans votre cas, ce n'est probablement pas une mauvaise chose à faire. En fait, il est possible que cela améliore les performances en économisant sur la bande passante mémoire. Il ajoutera également des instructions de shader, donc ce n'est pas toujours un avantage en termes de performances.

Même lorsque vous utilisez le tampon de profondeur, les performances ne sont pas toujours très importantes, si vous faites attention à l'ordre dans lequel vous dessinez les choses.

Il y a un article de blog à https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/ qui décrit en détail comment le test de profondeur précoce pourrait fonctionner dans le matériel et quelles limitations il pourrait y avoir.

Adam
la source
1
En fait, après les tests, je pense qu'il est prudent de supposer que je ne perds ni n'augmente les performances, mais je cherchais une réponse donnant une explication approfondie de ce qui va se passer et pourquoi.
Ali1S232