Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





FBO, ReadPixels y grabar los frames a disco

Iniciado por Prompt, 19 de Diciembre de 2008, 04:56:34 PM

« anterior - próximo »

Prompt

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.


Mars Attacks

Pero di cómo, que igual algún día alguien se cruza con el mismo problema :)

JL10

...incluso podrías poner algo de código...pues parece algo muy aprovechable lo que has conseguido! :)
Gracias

Pogacha


AK47

Desde luego que vaya gente dejan entrar en el foro...  >:D

Prompt

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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.