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