¿Cuál es el concepto y las diferencias entre Framebuffer y Renderbuffer en OpenGL?

136

Estoy confundido sobre el concepto de Framebuffer y Renderbuffer. Sé que deben renderizar, pero quiero comprenderlos antes de usarlos.

Sé que se requiere un poco de búfer de mapa de bits para almacenar el resultado del dibujo temporal. El búfer trasero. Y se requiere ver el otro búfer en la pantalla cuando esos dibujos están en progreso. El amortiguador delantero. Y voltéalos, y dibuja de nuevo. Conozco este concepto, pero es difícil conectar esos objetos a este concepto.

¿Cuál es el concepto y las diferencias de ellos?

eonil
fuente
77
Renderbuffer es un componente tipo canal (color, plantilla, profundidad, etc.) de Framebuffer. Ver: developer.apple.com/iphone/library/documentation/3DDrawing/…
eonil
2
El enlace es específico de iPhone, pero los framebuffers están bien explicados.
j00hi

Respuestas:

62

Esta página tiene algunos detalles que creo que explican la diferencia bastante bien. En primer lugar:

El destino final de representación de la canalización de OpenGL se llama [el] framebuffer .

Mientras:

Renderbuffer Object
Además, el renderbuffer object se ha introducido recientemente para renderizar fuera de pantalla. Permite renderizar una escena directamente a un objeto de buffer de renderizado, en lugar de renderizar a un objeto de textura. Renderbuffer es simplemente un objeto de almacenamiento de datos que contiene una sola imagen de un formato interno renderizable. Se utiliza para almacenar buffers lógicos OpenGL que no tienen el formato de textura correspondiente, como stencil o buffer de profundidad.

ChrisF
fuente
196

El objeto Framebuffer no es en realidad un búfer, sino un objeto agregador que contiene uno o más archivos adjuntos, que a su vez, son los búferes reales. Puede entender el Framebuffer como estructura C donde cada miembro es un puntero a un buffer. Sin ningún archivo adjunto, un objeto Framebuffer tiene una huella muy baja.

Ahora cada buffer conectado a un Framebuffer puede ser un Renderbuffer o una textura .

El Renderbuffer es un buffer real (una matriz de bytes, enteros o píxeles). El Renderbuffer almacena valores de píxeles en formato nativo, por lo que está optimizado para la representación fuera de pantalla. En otras palabras, dibujar en un Renderbuffer puede ser mucho más rápido que dibujar en una textura. El inconveniente es que los píxeles utilizan un formato nativo dependiente de la implementación, por lo que leer desde un Renderbuffer es mucho más difícil que leer desde una textura. Sin embargo, una vez que se ha pintado un Renderbuffer , uno puede copiar su contenido directamente a la pantalla (u otro Renderbuffer , supongo), muy rápidamente usando operaciones de transferencia de píxeles. Esto significa que un Renderbuffer puede usarse para implementar eficientemente el patrón de doble buffer que mencionaste.

Los Renderbuffers son un concepto relativamente nuevo. Antes de ellos, se usaba un Framebuffer para representar una textura , que puede ser más lenta porque una textura usa un formato estándar. ¡Todavía es posible renderizar a una textura, y eso es bastante útil cuando uno necesita realizar múltiples pases sobre cada píxel para construir una escena, o dibujar una escena en una superficie de otra escena!

El wiki de OpenGL tiene esta página que muestra más detalles y enlaces.

fernacolo
fuente
13
¡Gracias! Explicarlo como estructuras y punteros similares tiene mucho más sentido para mí.
DouglasHeriot
2
Esto sigue siendo un poco confuso para mí. Si renderbuffer solo permite una copia rápida a otro buffer de renderizado, ¡entonces casi no sirve de nada! Si tengo que hacer una etapa de posprocesamiento (como SSAO), ¿no es más fácil convertirlo en un framebuffer predeterminado usando previamente renderizado en Textures que hacerlo en un RenderBuffer y luego volver a copiarlo en la pantalla?
CoffeDeveloper
44
Los buffers de renderizado no están diseñados para el procesamiento posterior personalizado. Se pueden usar para almacenar información de profundidad y plantilla para un procedimiento de dibujo. Esto es posible porque solo la implementación de GPL en sí misma necesita leer los datos del buffer de renderizado, y tiende a ser más rápido que las texturas, porque usa un formato nativo. Si necesita procesamiento posterior, use texturas.
fernacolo