2009-04-19 14 views
7

Tengo un objeto FBO con un adjunto de color y profundidad al que renderizo y leo desde el uso de glReadPixels() y estoy tratando de agregarle soporte para multimuestreo.
En lugar de glRenderbufferStorage() llamo a glRenderbufferStorageMultisampleEXT() tanto para el adjunto de color como para el adjunto de profundidad. El objeto de búfer de cuadro parece haber sido creado con éxito y se informa como completo.
Después del procesamiento, intento leer de él con glReadPixels(). Cuando el número de muestras es 0, es decir, la multimuestreo desactiva, funciona perfectamente y obtengo la imagen que quiero. cuando me puse el número de muestras a otra cosa, por ejemplo 4, el registro de cuadro está siendo construido bien, pero falla con un glReadPixels() Cualquier persona INVALID_OPERATIONglReadPixels de FBO falla con multimuestreo

tener una idea de lo que podría estar mal aquí?

EDIT: El código de glReadPixels:

glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, ptr); 

donde los puntos ptr a una matriz de width * uints altura.

+0

Se puede publicar la línea completa para sus glReadPixels() llamada (formato, tipo, etc.)? –

Respuesta

23

No creo que se pueda leer desde un FBO multiempañado con glReadPixels(). Debes ajustar desde el FBO multiempañado a un FBO normal, unir el FBO normal y luego leer los píxeles del FBO normal.

Algo como esto:

// Bind the multisampled FBO for reading 
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, my_multisample_fbo); 
// Bind the normal FBO for drawing 
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, my_fbo); 
// Blit the multisampled FBO to the normal FBO 
glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
//Bind the normal FBO for reading 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, my_fbo); 
// Read the pixels! 
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 
+0

"No creo que pueda leer desde un multiempañamiento" - ¿Tiene alguna referencia para eso? – shoosh

+2

Aquí va (vaya al final): http://www.opengl.org/wiki/GL_EXT_framebuffer_multisample –

+0

¿Cómo inicializar 'my_fbo' para blit? –

1

Usted no puede leer el buffer de muestras múltiples directamente con glReadPixels ya que generará un error GL_INVALID_OPERATION. Debe ajustar a otra superficie para que la GPU pueda hacer una muestra descendente. Puede enviar un blit al backbuffer, pero existe el problema de la "prueba de nave de propietario de píxeles". Lo mejor es hacer otro FBO. Supongamos que hiciste otro FBO y ahora quieres blit. Esto requiere GL_EXT_framebuffer_blit. Normalmente, cuando su controlador es compatible con GL_EXT_framebuffer_multisample, también es compatible con GL_EXT_framebuffer_blit, por ejemplo, la serie nVidia Geforce 8.

//Bind the MS FBO 
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, multisample_fboID); 
//Bind the standard FBO 
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fboID); 
//Let's say I want to copy the entire surface 
//Let's say I only want to copy the color buffer only 
//Let's say I don't need the GPU to do filtering since both surfaces have the same dimension 
glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
//-------------------- 
//Bind the standard FBO for reading 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboID); 
glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, pixels); 

Fuente: GL EXT framebuffer multisample

Cuestiones relacionadas