2010-02-06 13 views
101

Estoy confundido sobre el concepto de Framebuffer y Renderbuffer. Sé que están obligados a procesar, pero quiero entenderlos antes de su uso.¿Cuál es el concepto y las diferencias entre Framebuffer y Renderbuffer en OpenGL?

Sé que se requiere un búfer de mapa de bits para almacenar el resultado del dibujo temporal. El buffer posterior Y el otro buffer debe ser visto en la pantalla cuando esos dibujos están en progreso. El buffer frontal. Y darles la vuelta, y dibujar de nuevo. Conozco este concepto, pero es difícil conectar esos objetos a este concepto.

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

+5

Renderbuffer es un canal de componentes (color, galería de símbolos, profundidad y etc.) de Framebuffer. Consulte: http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESontheiPhone/OpenGLESontheiPhone.html – Eonil

+0

El enlace es específico de iPhone, pero los framebuffers están bien explicados. – j00hi

Respuesta

51

This page tiene algunos detalles que creo que explican la diferencia bastante bien. En primer lugar:

El destino renderizado final de la tubería de OpenGL se llama [la] uso de este dispositivo.

Considerando lo siguiente:

Renderbuffer Objeto
Además, objeto renderbuffer está recién introducido para la representación fuera de la pantalla. Permite renderizar una escena directamente a un objeto renderbuffer, 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 que puede renderizarse. Se usa para almacenar almacenamientos intermedios lógicos de OpenGL que no tienen el formato de textura correspondiente, como el stencil o el buffer de profundidad.

+0

Perfecto. ¡Gracias! – Eonil

144

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

Ahora cada tampón unido a una Framebuffer puede ser un Renderbuffer o una textura .

Renderbuffer es un búfer 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 el procesamiento fuera de pantalla. En otras palabras, dibujar a Renderbuffer puede ser mucho más rápido que dibujar en una textura. El inconveniente es que los píxeles usan 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 en la pantalla (o en otro Renderbuffer, supongo), muy rápidamente usando operaciones de transferencia de píxeles. Esto significa que puede usar Renderbuffer para implementar de manera eficiente el patrón de doble buffer que mencionó.

Renderbuffers son un concepto relativamente nuevo.Antes de ellos, se usó 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 pasadas sobre cada píxel para construir una escena, o dibujar una escena en una superficie de otra escena.

La wiki de OpenGL tiene this page que muestra más detalles y enlaces.

+9

Gracias! Explicarlo como una especie de estructuras y punteros tiene mucho más sentido para mí. – DouglasHeriot

+2

Esto todavía es un poco confuso para mí. Si renderbuffer solo permite una copia rápida a otro buffer de renderizado, ¡casi no hay uso para eso! Si tengo que hacer una etapa de post-procesamiento (como SSAO), ¿no es más fácil renderizarla en el framebuffer predeterminado usando las Texturas previamente renderizadas que renderizarlas en un RenderBuffer y luego copiarlas a la pantalla? – GameDeveloper

+3

Los búfers de renderización no están diseñados para el postprocesamiento 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 necesita leer datos de renderbuffer, y tiende a ser más rápida que texturas, porque usa un formato nativo. Si necesita procesamiento posterior, use texturas. – fernacolo

Cuestiones relacionadas