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?
Réponses:
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 unglDepthFunc
deGL_LESS
(ouGL_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
(ouGL_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.
la source
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.
la source