El objeto Framebuffer no es en realidad un búfer, sino un objeto agregador que contiene uno o más archivos adjuntos, que a su vez, son los búferes reales. Puede entender el Framebuffer como estructura C donde cada miembro es un puntero a un buffer. Sin ningún archivo adjunto, un objeto Framebuffer tiene una huella muy baja.
Ahora cada buffer conectado a un Framebuffer puede ser un Renderbuffer o una textura .
El Renderbuffer es un buffer real (una matriz de bytes, enteros o píxeles). El Renderbuffer almacena valores de píxeles en formato nativo, por lo que está optimizado para la representación fuera de pantalla. En otras palabras, dibujar en un Renderbuffer puede ser mucho más rápido que dibujar en una textura. El inconveniente es que los píxeles utilizan un formato nativo dependiente de la implementación, por lo que leer desde un Renderbuffer es mucho más difícil que leer desde una textura. Sin embargo, una vez que se ha pintado un Renderbuffer , uno puede copiar su contenido directamente a la pantalla (u otro Renderbuffer , supongo), muy rápidamente usando operaciones de transferencia de píxeles. Esto significa que un Renderbuffer puede usarse para implementar eficientemente el patrón de doble buffer que mencionaste.
Los Renderbuffers son un concepto relativamente nuevo. Antes de ellos, se usaba un Framebuffer para representar una textura , que puede ser más lenta porque una textura usa un formato estándar. ¡Todavía es posible renderizar a una textura, y eso es bastante útil cuando uno necesita realizar múltiples pases sobre cada píxel para construir una escena, o dibujar una escena en una superficie de otra escena!
El wiki de OpenGL tiene esta página que muestra más detalles y enlaces.