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.
Ya lo he solucionado.
:..
Pero di cómo, que igual algún día alguien se cruza con el mismo problema :)
...incluso podrías poner algo de código...pues parece algo muy aprovechable lo que has conseguido! :)
De no ser esta la solución igual la listo:
http://www.farbrausch.de/~fg/kkapture/
Desde luego que vaya gente dejan entrar en el foro... >:D
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.