Объект Framebuffer на самом деле не буфер, а объект агрегатора, который содержит одно или несколько вложений, которые, в свою очередь, являются фактическими буферами. Вы можете понять Framebuffer как структуру C, где каждый член является указателем на буфер. Без какого-либо присоединения объект Framebuffer занимает очень мало места.
Теперь каждый буфер, прикрепленный к Framebuffer, может быть Renderbuffer или текстурой .
Renderbuffer является фактическим буфер (массив байтов, или целых, или пикселей). В Renderbuffer хранит значение пикселей в исходном формате, поэтому он оптимизирован для закадрового рендеринга. Другими словами, рисование в Renderbuffer может быть намного быстрее, чем рисование в текстуру. Недостатком является то, что пиксели используют собственный, зависящий от реализации формат, поэтому чтение из Renderbuffer намного сложнее, чем чтение из текстуры. Тем не менее, как только Renderbuffer был нарисован, его содержимое можно скопировать прямо на экран (или , как я полагаю, в другой Renderbuffer ), очень быстро, используя операции передачи пикселей. Это означает, что Renderbuffer может использоваться для эффективной реализации упомянутого вами шаблона двойного буфера.
Рендербуферы - относительно новая концепция. До них для рендеринга текстуры использовался Framebuffer , который мог быть медленнее, потому что текстура использует стандартный формат. По-прежнему можно выполнить рендеринг в текстуру, и это весьма полезно, когда нужно выполнить несколько проходов по каждому пикселю для построения сцены или нарисовать сцену на поверхности другой сцены!
В вики OpenGL есть эта страница, на которой показаны более подробные сведения и ссылки.