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 glDepthFunc
de 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.