Quel est le concept et les différences entre Framebuffer et Renderbuffer dans OpenGL?

137

Je suis confus quant au concept de Framebuffer et de Renderbuffer. Je sais qu'ils doivent être rendus, mais je veux les comprendre avant de les utiliser.

Je sais qu'un tampon bitmap est nécessaire pour stocker le résultat du dessin temporaire. Le tampon arrière. Et l'autre tampon doit être vu à l'écran lorsque ces dessins sont en cours. Le tampon avant. Et retournez-les et dessinez à nouveau. Je connais ce concept, mais il est difficile de relier ces objets à ce concept.

Quel est le concept et les différences entre eux?

éonil
la source
7
Renderbuffer est des composants de type canal (couleur, gabarit, profondeur et etc.) de Framebuffer. Voir: developer.apple.com/iphone/library/documentation/3DDrawing
...
2
Le lien est spécifique à l'iPhone, mais les framebuffers sont bien expliqués.
j00hi

Réponses:

62

Cette page contient quelques détails qui, je pense, expliquent assez bien la différence. D'abord:

La destination finale du rendu du pipeline OpenGL est appelée [le] framebuffer .

Tandis que:

Objet Renderbuffer
De plus, l'objet renderbuffer est nouvellement introduit pour le rendu hors écran. Il permet de rendre une scène directement à un objet de tampon de rendu, au lieu de rendre à un objet de texture. Renderbuffer est simplement un objet de stockage de données contenant une seule image d'un format interne pouvant être rendu. Il est utilisé pour stocker les tampons logiques OpenGL qui n'ont pas de format de texture correspondant, tel qu'un gabarit ou un tampon de profondeur.

ChrisF
la source
196

L' objet Framebuffer n'est pas en fait un tampon, mais un objet agrégateur qui contient une ou plusieurs pièces jointes, qui, à leur tour, sont les tampons réels. Vous pouvez comprendre le Framebuffer comme une structure C où chaque membre est un pointeur vers un tampon. Sans aucune pièce jointe, un objet Framebuffer a une très faible empreinte.

Désormais, chaque buffer attaché à un Framebuffer peut être un Renderbuffer ou une texture .

Le Renderbuffer est un tampon réel (un tableau d'octets, d'entiers ou de pixels). Le Renderbuffer stocke les valeurs de pixels au format natif, il est donc optimisé pour le rendu hors écran. En d'autres termes, dessiner sur un tampon de rendu peut être beaucoup plus rapide que dessiner sur une texture. L'inconvénient est que les pixels utilisent un format natif dépendant de l'implémentation, de sorte que la lecture à partir d'un Renderbuffer est beaucoup plus difficile que la lecture à partir d'une texture. Néanmoins, une fois qu'un Renderbuffer a été peint, on peut copier son contenu directement à l'écran (ou vers un autre Renderbuffer , je suppose), très rapidement en utilisant des opérations de transfert de pixels. Cela signifie qu'un Renderbuffer peut être utilisé pour implémenter efficacement le modèle de double tampon que vous avez mentionné.

Les tampons de rendu sont un concept relativement nouveau. Avant eux, un Framebuffer était utilisé pour rendre une texture , ce qui peut être plus lent car une texture utilise un format standard. Il est toujours possible de rendre une texture, et c'est assez utile quand on a besoin d'effectuer plusieurs passes sur chaque pixel pour construire une scène, ou pour dessiner une scène sur une surface d'une autre scène!

Le wiki OpenGL a cette page qui montre plus de détails et de liens.

Fernacolo
la source
13
Merci! L'expliquer comme un peu comme des structures et des pointeurs a beaucoup plus de sens pour moi.
DouglasHeriot
2
C'est encore un peu déroutant pour moi. Si le tampon de rendu ne permet qu'une copie rapide dans un autre tampon de rendu, alors il ne sert presque à rien! Si je dois faire une étape de post-traitement (comme SSAO), n'est-il pas plus facile de le rendre dans le framebuffer par défaut en utilisant précédemment rendu dans Textures que de le rendre dans un RenderBuffer puis de le recopier à l'écran?
CoffeDeveloper
4
Les tampons de rendu ne sont pas conçus pour un post-traitement personnalisé. Ils peuvent être utilisés pour stocker les informations de profondeur et de pochoir pour une procédure de dessin. Cela est possible car seule l'implémentation GPL elle-même a besoin de lire les données du tampon de rendu et a tendance à être plus rapide que les textures, car elle utilise un format natif. Si vous avez besoin d'un post-traitement, utilisez des textures.
fernacolo