Hors limites dans les jeux AAA

21

Dans de nombreux titres AAA courants (jeux de moteur source en particulier), lorsque le joueur atteint une zone «non prise en charge», comme hors des limites, ou noclipping sous la carte; un effet étrange se produit à l'écran (déchirure du tampon?).

Il peut être décrit comme étant similaire à la traînée de fenêtres que Windows XP peut laisser derrière une fenêtre en train de glisser pendant qu'il y a un blocage du système.

Je peux seulement postuler que les développeurs n'effacent pas le tampon de couleur lors de l'actualisation de l'écran?

Est-ce exact? Si oui, pourquoi?

caviar décéléré
la source
8
BTW, cela est souvent appelé l'effet "Hall of Mirrors" ou HOM.
Nathan Reed du

Réponses:

35

Il était une fois, la suppression des tampons de couleur et de profondeur prenait du temps. Faire un clair signifiait que la carte graphique devait parcourir chaque pixel du framebuffer et y écrire une valeur.

Pour cette raison, les développeurs de jeux ont constaté qu'il serait plus efficace de simplement supposer que chaque pixel serait à nouveau rendu. Ils ont développé de nombreuses techniques pour ce faire.

Le tampon de couleur est le plus facile à ignorer. Le tampon de profondeur est moins facile, car il serait pollué par les anciennes données. Donc, ce qu'ils ont fait était simple.

À l'image 0, ils rendraient avec un glDepthRange(ou l'équivalent D3D) de (0, 0,5), et ils utiliseraient un glDepthFuncde GL_LESS(ou GL_LEQUAL). Cela signifie que la valeur de profondeur la plus éloignée que vous obtiendriez dans le tampon de profondeur est 0,5. Ainsi, la plus grande valeur dans le tampon de profondeur à la fin de l'image 0 est 0,5 (en supposant que vous avez écrit sur chaque pixel).

Sur l'image 1, ils changeraient la plage de profondeur en (1, 0,5). Notez que dans ce cas, la valeur de profondeur proche est supérieure à la profondeur lointaine. Mais ils changeraient également la fonction de profondeur en GL_GREATER(ou GL_GEQUAL), ce qui inverse le sens du test de profondeur. Étant donné que la plus grande valeur dans le tampon de profondeur est 0,5, tout ce que vous écrivez aura une valeur supérieure à celle-ci. Étant donné que le test de profondeur a été inversé, cela signifie en fait que tout ce qui a été écrit sur l'image 0 est maintenant plus éloigné que tout ce qui pourrait éventuellement être écrit sur l'image 1. À la fin de l'image 1, la plus petite valeur dans le tampon de profondeur est désormais de 0,5.

Et puis ils répètent.

Sur tout matériel fabriqué depuis 2003 environ, il ne s'agit plus d'une optimisation. En effet, c'est une optimisation négative . Effacement de la mémoire tampon de profondeur rend effectivement le matériel plus rapidement . Pas vraiment.

Fondamentalement, ce qui se passe, c'est que l'effacement des tampons n'écrit rien. Ils stockent quelques bits dans les caches du GPU qui permettent au système de savoir à quelle couleur / profondeur ils ont été effacés. Lorsque le système essaie d'écrire sur une ligne de cache du framebuffer, il ne prend pas la peine de lire ce qui s'y trouve, car il sait déjà qu'il s'agit d'un champ vide de la valeur claire de couleur / profondeur. Si vous essayez de vous fondre avec ce qui est là ou de faire un test de profondeur, encore une fois, pas besoin de lire: il sait quelle valeur mélanger / tester avec / contre.

Ainsi, chaque première lecture / modification / écriture que vous effectuez sur chaque ligne de cache après un effacement est fondamentalement une écriture. C'est gratuit .

De plus, le fait d'avoir un tampon de profondeur irrégulier peut fonctionner contre les optimisations Hyper-Z / Hierarchial-Z / toutes les éliminations Z dans le matériel. Oui, votre scène finira par fonctionner contre ceux-ci lorsque vous ajouterez des détails. Mais si votre tampon de profondeur est irrégulier par rapport aux rendus précédents, même si ces objets d'arrière-plan sont en arrière-plan, cela peut affecter l'efficacité des techniques d'élimination de Z. Et cela n'améliorera pas les performances.

Donc, vous ne devriez jamais faire cette technique d'inversion de profondeur dans les jeux modernes.

Remarque: Jari fait un bon point sur les architectures de rendu basées sur des tuiles (comme on le trouve dans la plupart des plates-formes mobiles). Ne pas effacer la profondeur peut aussi rendre les choses désagréables.

Nicol Bolas
la source
Votre dernière déclaration implique-t-elle de ne jamais faire alterner le tampon de profondeur ou? Très bonne réponse.
deceleratedcaviar
1
@Daniel Oui. J'ai clarifié mon message.
Nicol Bolas
3
De plus, le fait d'ignorer les architectures de binning (comme la plupart des puces OpenGL ES) entraîne une perte de performances massive , car la puce graphique ne peut pas faire d'hypothèses sur l'état du tampon de couleurs.
Jari Komppa
5

Oui, vous avez raison de dire que le tampon arrière n'est pas effacé.

Pourquoi est-ce parce que (surtout) il est plus rapide d'utiliser un shader personnalisé qui fait un ping-pong des valeurs de profondeur dans des directions opposées à chaque image et repose sur le fait que votre jeu rend toujours chaque pixel à l'écran.

Ainsi, pour un coût nul, vous économisez un tampon clair par trame.

Patrick Hughes
la source
1
Je ne connais pas le ping-pong en profondeur; chaque moteur que je connais efface le tampon de profondeur / gabarit de chaque image. Mais à part cela, oui, si le jeu affiche tous les pixels (comme il se doit), vous n'avez pas besoin d'effacer le tampon de couleur.
Nathan Reed,
Pourriez-vous donner un exemple pour le shader, bonne réponse sinon.
deceleratedcaviar
1
Je me rends compte que vous posez des questions sur les moteurs récents, en lisant le commentaire de @ NathanReed, c'est combien de moteurs uniquement pour PC fonctionnent maintenant. La torsion du tampon Z est une technique plus ancienne, je vais voir si je peux trouver une référence. Les moteurs de console effaceront également la plupart du tampon de couleurs, même un pixel montrant l'effet HOM nommé par Nathan échouera un titre et le forcera à parcourir à nouveau les soumissions.
Patrick Hughes