Quel est le contenu du tampon * après * un appel à glSwapBuffers ()?

8

( SDL_GL_SwapBuffers()en particulier)

Lorsque vous avez dessiné une scène et que vous appelez des tampons de swap, il est courant de placer glClear()la scène avant de dessiner quoi que ce soit; si vous ne désactivez pas , quel est le contenu du tampon? Est-ce défini par une spécification ou varie-t-il selon le pilote?

Volonté
la source
C'est une question très intéressante.
Notabene

Réponses:

13

Les détails sur la façon d'échanger les tampons avant et arrière varient d'une plateforme à l'autre, et la réponse dépend donc de la plateforme.

Selon la documentation de référence GLX glXSwapBuffers :

Le contenu du tampon arrière devient indéfini après un échange. Notez que cela s'applique aux tampons de pixels ainsi qu'aux fenêtres.

Cependant, il existe l' extension GLX_EXT_buffer_age :

Le but de cette extension est d'exposer suffisamment d'informations aux applications sur la façon dont le pilote gère l'ensemble des tampons avant et arrière associés à une surface donnée pour permettre aux applications de réutiliser le contenu des anciens cadres et de minimiser la quantité à redessiner pour le image suivante.

Mais Win32 SwapBuffers dit seulement:

Si le format de pixel actuel pour la fenêtre référencée par ce contexte de périphérique comprend un tampon arrière, la fonction échange les tampons avant et arrière ... Si le format de pixel actuel pour la fenêtre référencée par le contexte de périphérique n'inclut pas de tampon arrière, cela l'appel n'a aucun effet et le contenu du tampon arrière n'est pas défini lorsque la fonction revient.

Et CGLFlushDrawable, pour OS X Core Graphics dit:

Si l'attribut de stockage de sauvegarde est défini sur false, les tampons peuvent être échangés plutôt que copiés. C'est souvent le cas en mode plein écran. Si le récepteur n'est pas un contexte à double tampon, cet appel ne fait rien.

Enfin, dans la fonction d'échange de tampons standard d'OpenGL ES, eglSwapBuffers :

Le tampon de couleur de la surface n'est pas défini après avoir appelé eglSwapBuffers.

Donc qu'est-ce que tout cela veut dire?

  • Pour être vraiment multi-plateforme, vous ne pouvez rien supposer du tampon arrière après un swap. Son contenu n'est pas défini, et vous devez probablement glClear ou le corriger avant de l'utiliser.
  • Si vous utilisez Linux, vous pouvez vérifier l'extension de l'âge du tampon. Étant donné qu'un système peut être à triple tampon, vous devrez peut-être garder une trace de plusieurs images de dommages et y faire face.
  • Si vous utilisez OS X, vous pourriez être copié et vous pourriez obtenir un échange. Vous pouvez donc supposer que le contenu du backbuffer n'est pas une ordure, mais vous ne contrôlez pas si c'est le cadre que vous venez d'envoyer ou celui avant cela.
  • Si vous ne ciblez que Win32 et êtes sûr d'avoir un tampon arrière, vous pouvez présumer que son contenu est maintenant ce qu'il était dans le tampon avant. (Bien qu'il s'agisse d'une hypothèse d'omission plutôt que explicitement indiquée; je ne serais pas surpris si cela ne fonctionne pas sur de nombreuses / toutes configurations.)

Étant donné les contraintes de GLX et CGL, et le désir de minimiser les changements entre OpenGL et OpenGL ES, vous pourriez tout aussi bien supposer que le contenu est des ordures.

Sunny Sachanandani
la source
1

D'après ce que j'ai lu, le seul comportement est UNDEFINED. Je suppose donc qu'il n'y a aucune garantie quant au contenu du tampon. Sans oublier que certaines bibliothèques encapsulent en fait un appel clair dans l'appel des tampons d'échange.

David Yenglin
la source
-1 pour manque de sourcing; La documentation OpenGL est abondante et facile à relier.
+1 parce que, eh bien, il a effectivement répondu et la réponse était correcte. Les sources aident certainement, mais ne sont en aucun cas nécessaires!
o0 '.
@ Lo'oris: Sauf, eh bien, il n'a pas raison. Il est correct pour certaines plateformes, mais pas pour toutes, comme l'explique ma réponse.
@Joe: La seule réponse correcte quel que soit "l'environnement" est celle-ci, comme l' explique votre réponse. Le codage sachant que cela cassera "quelque part" serait faux en premier lieu.
o0 '.
1
@ Lo'oris: Tout le code, en particulier le code de rendu, est susceptible de se casser quelque part . Une bonne réponse ne se contente pas de dire cela, mais explique où cela se trouve quelque part.
0

Le comportement est INDÉFINI, donc si vous voulez remplir tout l'écran de toute façon, vous pouvez envisager de supprimer le clear .. sauf, dans certains environnements (certaines architectures de tuile au moins), cela dégradera réellement les performances. Le plein écran clair au début du rendu est une opération si courante que je serais surpris s'il n'était pas bien optimisé sur toutes les plateformes cibles.

La raison pour laquelle elle n'est PAS DÉFINIE est que pour de nombreuses architectures, la définition de l'état du contenu constituerait une surcharge supplémentaire, quelle que soit la façon dont vous définiriez la norme.

Quant à ce que vous y trouverez, je peux faire une supposition basée sur l'expérience;

Sur les architectures à double (ou multi) tampons, comme la plupart des matériels vidéo pour PC de bureau, vous trouverez probablement les «autres» données de tampon. Ce n'est pas garanti cependant, car ce n'est pas dans la spécification, si une optimisation étrange en profite, ils brouilleront les données.

Sur les architectures en mosaïque, vous pouvez trouver les mêmes données que la dernière image, des données étrangement tronquées en fonction de la taille de la mosaïque, ou à peu près n'importe quoi d'autre.

Ensuite, vous avez des architectures bizarres (comme le NDS) qui pourraient vous donner à peu près n'importe quoi, car leur définition du tampon n'est pas exactement ce que vous attendez.

Jari Komppa
la source
Wow, votes négatifs. Cependant, je suis sérieux au sujet de ce que j'ai écrit - surtout si vous écrivez pour du matériel mobile, assurez-vous de l'inclure clairement.
Jari Komppa
J'ai voté contre parce que votre réponse est presque identique à celle de David, n'a toujours pas de références et, comme celle de David, n'est pas correcte ni toute l'histoire.
D'accord. La seule référence que je puisse donner, cependant, est ma propre expérience. Je serai plus prudent.
Jari Komppa
J'ai rétrogradé parce que cette réponse était strictement pire que les deux autres (que j'ai toutes deux surévalué): elle n'ajoutait rien et était beaucoup moins claire.
o0 '.