Logo

¡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.
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.