Какова концепция и различия между Framebuffer и Renderbuffer в OpenGL? - PullRequest
122 голосов
/ 06 февраля 2010

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

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

В чем их концепция и различия?

Ответы [ 2 ]

172 голосов
/ 18 ноября 2012

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

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

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

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

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

58 голосов
/ 06 февраля 2010

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

Конечный пункт назначения рендеринга конвейера OpenGL называется [*] 1006 * framebuffer .

Принимая во внимание:

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

...