Какова концепция и различия между Framebuffer и Renderbuffer в OpenGL?

137

Меня смущает концепция Framebuffer и Renderbuffer. Я знаю, что они необходимы для рендеринга, но я хочу понять их перед использованием.

Я знаю, что для хранения временного результата рисования требуется некоторый буфер растрового изображения. Задний буфер. А другой буфер требуется, чтобы его можно было увидеть на экране, когда эти рисунки находятся в процессе выполнения. Передний буфер. И переверните их, и снова нарисуйте. Я знаю эту концепцию, но эти объекты сложно связать с этой концепцией.

В чем их смысл и отличия?

eonil
источник
7
Renderbuffer - это канальные компоненты (цвет, трафарет, глубина и т. Д.) Framebuffer. См .: developer.apple.com/iphone/library/documentation/3DDrawing/…
eonil
2
Ссылка предназначена для iPhone, но фреймбуферы хорошо объяснены.
j00hi

Ответы:

62

На этой странице есть некоторые детали, которые, я думаю, довольно хорошо объясняют разницу. Во-первых:

Конечное место назначения рендеринга конвейера OpenGL называется кадровым буфером .

В то время как:

Объект Renderbuffer
Кроме того, недавно добавлен объект Renderbuffer для визуализации вне экрана. Он позволяет рендерить сцену непосредственно в объект буфера рендеринга вместо рендеринга в объект текстуры. Renderbuffer - это просто объект хранения данных, содержащий одно изображение визуализируемого внутреннего формата. Он используется для хранения логических буферов OpenGL, не имеющих соответствующего формата текстуры, таких как трафарет или буфер глубины.

ChrisF
источник
196

Объект Framebuffer на самом деле не буфер, а объект агрегатора, который содержит одно или несколько вложений, которые, в свою очередь, являются фактическими буферами. Вы можете понять Framebuffer как структуру C, где каждый член является указателем на буфер. Без какого-либо присоединения объект Framebuffer занимает очень мало места.

Теперь каждый буфер, прикрепленный к Framebuffer, может быть Renderbuffer или текстурой .

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

Рендербуферы - относительно новая концепция. До них для рендеринга текстуры использовался Framebuffer , который мог быть медленнее, потому что текстура использует стандартный формат. По-прежнему можно выполнить рендеринг в текстуру, и это весьма полезно, когда нужно выполнить несколько проходов по каждому пикселю для построения сцены или нарисовать сцену на поверхности другой сцены!

В вики OpenGL есть эта страница, на которой показаны более подробные сведения и ссылки.

fernacolo
источник
13
Спасибо! Объяснение этого типа структур и указателей имеет для меня гораздо больше смысла.
DouglasHeriot
2
Меня это все еще немного сбивает с толку. Если буфер рендеринга позволяет только быстрое копирование в другой буфер рендеринга, тогда он почти бесполезен! Если мне нужно выполнить этап постобработки (например, SSAO), не легче ли отрисовать его в буфер кадра по умолчанию с использованием ранее визуализированных в текстуры, чем отрисовать его в RenderBuffer, а затем скопировать обратно на экран?
CoffeDeveloper
4
Буферы рендеринга не предназначены для пользовательской пост-обработки. Их можно использовать для хранения информации о глубине и трафарете для процедуры рисования. Это возможно, потому что только сама реализация GPL должна читать данные буфера рендеринга и имеет тенденцию быть быстрее, чем текстуры, потому что использует собственный формат. Если вам нужна постобработка, используйте текстуры.
fernacolo