2009-03-25 24 views
10

Estoy renderizando en un objeto OpenGL Offscreen Framebuffer y me gusta guardarlo como una imagen. Tenga en cuenta que el FBO es más grande que el tamaño de visualización. Puedo renderizar en el buffer fuera de pantalla y usarlo como textura, que funciona. Puedo "desplazar" esta textura más grande a través de la pantalla usando un desplazamiento, lo que me da confianza, que renderizo en un contexto más grande que la ventana.problema al guardar OpenGL FBO mayor que la ventana

Si guardo el búfer fuera de pantalla en un archivo de imagen siempre se recorta. El fragmento de código para el ahorro es:

void ofFBOTexture::saveImage(string fileName) { 
    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
    // get the raw buffer from ofImage 
    unsigned char* pixels = imageSaver.getPixels(); 
    glReadPixels(0, 0, 1024, 1024, GL_RGB, GL_UNSIGNED_BYTE, pixels); 

    imageSaver.saveImage(fileName); 
} 

Tenga en cuenta, que el contenido de la imagen se recorta, la parte visible se guarda correctamente (lo que significa que no hay error en formatos de píxeles, problemas GL_RGB etc.), pero el resto del espacio es lleno de un color

Entonces, mi pregunta es: ¿qué estoy haciendo mal?

Respuesta

11

Finalmente resolví el problema.

tengo para activar el FBO para guardar su contenido:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
// save code 
... 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

mientras que sólo la selección de la FBO para glReadPixels través

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 

no es suficiente.

(Todas las demás cosas donde correcta y probados, por ejemplo. Tamaños de ventana gráfica, anchura y altura de tampón, la imagen de textura etc.)

+0

Tengo el mismo problema que tú. ¿Podrías ampliar cómo obtienes la variable fbo? No puedo encontrar qué incluir para acceder a glGenFrameBuffers, que es lo que creo que se usa. –

+1

1. aquí hay una buena descripción: http://www.songho.ca/opengl/gl_fbo.html – razong

+1

2. GLuint fbo; glGenFramebuffersEXT (1, &fbo); // 1 == número de FBO para crear glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, OBF); – razong

0

Dos preguntas para comenzar: ¿Cómo está creando imageSaver y está seguro de que su ancho y alto son correctos (por ejemplo, está tratando de guardar una imagen de 1024 x 1024? ¿Qué tamaño está recibiendo)?

+0

1. El ImageSaver es un objeto de imagen openframeworks. Para evitar posibles errores, incluso lo creé cargando un archivo de mapa de bits vacío con el tamaño y la profundidad de la imagen de destino deseada. 2. Obtengo una imagen de 1024x1024, como desee, pero solo contenido igual a la ventana renderizada. todo lo demás está "vacío" – razong

0

No está haciendo nada mal, este ha sido un comportamiento bastante común con los controladores de gráficos OpenGL durante mucho tiempo - Recuerdo haber tenido exactamente el mismo problema en las tarjetas nVidia Geforce 3 hace al menos una década, y adopté una solución similar: renderización a una textura fuera de pantalla.

0

Parece que tiene un tamaño de ventana incorrecto o algo similar.

Cuestiones relacionadas