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

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

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

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


person eonil    schedule 06.02.2010    source источник
comment
Renderbuffer - это канальные компоненты (цвет, трафарет, глубина и т. Д.) Framebuffer. См .: developer.applerer.com библиотека / документация / 3DDrawing /   -  person eonil    schedule 05.09.2010
comment
Ссылка специфична для iPhone, но фреймбуферы хорошо объяснены.   -  person j00hi    schedule 17.03.2011


Ответы (2)


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

Конечное место назначения рендеринга конвейера OpenGL называется [the] framebuffer.

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

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

person ChrisF    schedule 06.02.2010

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

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

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

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

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

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