Яка концепція та відмінності між Framebuffer та Renderbuffer у OpenGL?


137

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

Я знаю, що для зберігання тимчасового результату малювання потрібен буфер растрових зображень. Задній буфер. А інший буфер потрібно побачити на екрані, коли ці малюнки виконуються. Передній буфер. І переверніть їх, і намалюйте ще раз. Я знаю цю концепцію, але важко пов'язати ці об'єкти з цією концепцією.

Що таке поняття та чим вони відрізняються?


7
Renderbuffer - це каналоподібні компоненти (колір, трафарет, глибина та ін.) Framebuffer. Дивіться: developer.apple.com/iphone/library/documentation/3DDrawing/…
eonil

2
Посилання є специфічним для iPhone, але фреймбуфери добре пояснені.
j00hi

Відповіді:


62

На цій сторінці є деякі деталі, які, на мою думку, досить добре пояснюють різницю. По-перше:

Кінцеве призначення візуалізації трубопроводу OpenGL називається [the] framebuffer .

При цьому:


Окрім того, об'єкт рендербуферу Крім того, для візуалізації поза екраном нещодавно вводиться об’єкт відтворення. Це дозволяє візуалізувати сцену безпосередньо об’єкту відтворення, замість рендеринга на об'єкт текстури. Renderbuffer - це просто об'єкт зберігання даних, що містить єдине зображення внутрішнього формату, що передається. Він використовується для зберігання логічних буферів OpenGL, які не мають відповідного текстурного формату, наприклад, трафарету або глибини буфера.


196

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

Тепер кожен буфер, приєднаний до Framebuffer, може бути рендербуфером або текстурою .

Renderbuffer є фактичним буфер (масив байтів, або цілих, або пікселів). У Renderbuffer зберігає значення пікселів у вихідному форматі, тому він оптимізований для закадрового рендеринга. Іншими словами, малюнок до Renderbuffer може бути набагато швидшим, ніж малюнок до текстури. Недолік полягає в тому, що пікселі використовують власний формат, залежний від реалізації, так що читати з Renderbuffer набагато важче, ніж читати з текстури. Тим не менш, після того як Renderbuffer намальовано, ви можете скопіювати його вміст безпосередньо на екран (або, напевне , на інший Renderbuffer ), дуже швидко, використовуючи операції передачі пікселів. Це означає, що Renderbuffer можна використовувати для ефективної реалізації подвійного буфера, який ви згадали.

Рендербуфери - відносно нова концепція. Перед ними використовувався Framebuffer, щоб надати текстуру , яка може бути повільнішою, оскільки текстура використовує стандартний формат. Ще можна надати текстуру, і це досить корисно, коли потрібно створити кілька проходів над кожним пікселем, щоб створити сцену або намалювати сцену на поверхні іншої сцени!

У вікі OpenGL є ця сторінка, на якій показано більше деталей та посилань.


13
Дякую! Пояснення цього як подібних структур та покажчиків має для мене набагато більше сенсу.
DouglasHeriot

2
Це все ще трохи заплутано для мене. Якщо рендербуфер дозволяє лише швидко копіювати в інший візуалізаційний буфер, то для цього майже немає користі! Якщо мені доведеться виконати етап після обробки (наприклад, SSAO), чи не простіше віддати його до рамкового буфера за замовчуванням, використовуючи раніше надані Textures, ніж рендеринг на RenderBuffer і потім копіювання назад на екран?
CoffeDeveloper

4
Буфери візуалізації не розроблені для спеціальної післяобробки. Вони можуть бути використані для зберігання інформації про глибину та трафарет для процедури малювання. Це можливо, тому що лише для реалізації GPL потрібно зчитувати дані рендербуфера, і це, як правило, швидше текстур, оскільки використовує нативний формат. Якщо вам потрібна обробка після публікації, використовуйте текстури.
fernacolo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.