Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Prompt en 19 de Diciembre de 2008, 04:56:34 PM

Título: FBO, ReadPixels y grabar los frames a disco
Publicado por: Prompt en 19 de Diciembre de 2008, 04:56:34 PM
Hola a todos, a ver si podeis ayudarme.

Actualmente tengo una función que hace glReadPixels del Back Buffer de OGL para luego grabarlo a disco. Quiero grabar todos los frames para formar un video, pero claro, necesito algo rapido.

Supuestamente es mejor usar un FBO que un PBuffer (que es lo q suelo ver por ahi...). Alguien puede darme una solucion buena? es urgente.

Un saludo a todos y gracias de antemano.
Título: Re: FBO, ReadPixels y grabar los frames a disco
Publicado por: Prompt en 19 de Diciembre de 2008, 11:11:47 PM
Ya lo he solucionado.

:..
Título: Re: FBO, ReadPixels y grabar los frames a disco
Publicado por: Mars Attacks en 21 de Diciembre de 2008, 01:58:06 PM
Pero di cómo, que igual algún día alguien se cruza con el mismo problema :)
Título: Re: FBO, ReadPixels y grabar los frames a disco
Publicado por: JL10 en 21 de Diciembre de 2008, 02:03:37 PM
...incluso podrías poner algo de código...pues parece algo muy aprovechable lo que has conseguido! :)
Título: Re: FBO, ReadPixels y grabar los frames a disco
Publicado por: Pogacha en 21 de Diciembre de 2008, 11:33:16 PM
De no ser esta la solución igual la listo:
http://www.farbrausch.de/~fg/kkapture/
Título: Re: FBO, ReadPixels y grabar los frames a disco
Publicado por: AK47 en 22 de Diciembre de 2008, 08:42:38 AM
Desde luego que vaya gente dejan entrar en el foro...  >:D
Título: Re: FBO, ReadPixels y grabar los frames a disco
Publicado por: Prompt en 01 de Enero de 2009, 03:04:44 PM
hola foreros que no me ayudais y quereis encima que os ponga la solucion!!

Golfos!  >:D

Bueno, despues de leer mucho y practicar un poco ya tengo hecho mi sistema de video en tiempo real. Ciertamente con las caracteristicas de mi tarjeta de video y mi microprocesador solo puedo sacar video de 320 x 240 sin que los FPS se vayan a tomar por saco.

No estoy en mi PC pero, la idea general es:
// antes de swapBuffer
- Generar n Pixel Buffer (con 2 puede ser suficientes, yo uso 2)
- Se configura con la misma resolucion de pantalla o al menos el mismo aspect ratio

-> Modo save frame ON
- Se renderiza el frame
- "ReadBack" leemos del buffer "BACK" (en double buffering)
- Bind PBO 1 o 2
- glReadPixels
- Bind PBO NULL y swap del PBO que usemos, si es mas de uno pues seleccionamos el siguiente :)


// this is a very basic render loop
while (bQuit == false)
{
UpdateGame();
RenderGame();

// At end of frame before SwapBuffers call
// to use this... just set bDoScreenShot to true.
if (bCopyToSysMem)
{
bCopyToSysMem = false;
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
GLubyte* src = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
memcpy(sysmem, src, imgsize);
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);

saveToDiskAsTGA(name, system);
}

if (bDoScreenShot)
{
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
glReadPixels(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, PIXEL_FORMAT, GL_UNSIGNED_BYTE, 0);
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
bCopyToSysMem = true;
bDoScreenShot = false;
}

// insert my code here
SwapBuffers(); // present frame
}



Os recomiendo el siguiente artico, exactamente el de async readback: http://www.songho.ca/opengl/gl_pbo.html


Se puede optimizar algo haciendo más de 2 buffers y metiendo en un hilo a parte el que grabe las imagenes a disco. A grosso modo es así.

PD: parece ser que usar aqui FBO no es muy buena idea, se ve que es 7 veces más lento que usando PBO, y hay una perdida de rendimiento de 2/3 teniendo que grabar a disco.