Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: senior wapo en 13 de Febrero de 2007, 12:22:30 AM

Título: Dirty Rectangles on OpenGL
Publicado por: senior wapo en 13 de Febrero de 2007, 12:22:30 AM
Quiero que el render (acelerado por hardware) vaya a un buffer que no limpio entre frames y me limito a dibujar geometria pesada en las pocas areas que cambian entre fotogramas.

Luego volcar las areas que han cambiado a la ventana de la aplicación, al buffer principal, el visible. Ni que decir tiene que leer el contenido a la memoria principal y lueco volcar los pixeles no me sirve. Antes que eso redibujo todo y hago (wgl)SwapBuffers.

En Direct3D el método Present() me permite indicar los rectangulos a copiar (o NULL para volcar todo, que es lo que usamos todos normalmente).

No encuentro nada , pero tiene que haber algo, chanchullos con glscissor y no usar contextos con double buffer, algun truco con pbuffers o FBOs, algo.

¿ Alguien me puede orientar un poco ?
Título: Dirty Rectangles on OpenGL
Publicado por: Pogacha en 13 de Febrero de 2007, 11:29:10 AM
Con glSissor puedes delimitar un rectangulo a donde dibujar en el framebuffer (lo he usado y es así de sencillo).
Una vez leí una discución similar donde concluian que no se podía, pero en D3D no sabía que se podia, así que puede que si.
Seguiré atento el hilo y si encuentro algo te comento que a mi tambíen me interesa.

EDIT: Al parecer Microsoft intento agregar una extension para esto en 1.2 pero no le dieron bola:
http://www.opengl.org/about/arb/meeting_notes/notes/arb-feb.html
No se en que habrá quedado.

EDIT2: http://msdn2.microsoft.com/en-us/library/ms537013.aspx
Pero windows unicamente y no se cuanta compatibilidad tenga :/
Título: Dirty Rectangles on OpenGL
Publicado por: marcode en 13 de Febrero de 2007, 02:55:20 PM
Esto sirve para copiar entre buffers directamente, no sé si te valdrá

glReadBuffer(GL_BACK);
glDrawBuffer(GL_FRONT);

glRasterPos2i( destinoX, destinoY );
glCopyPixels( OrigenX,OrigenY, OrigenWidht, OrigenHeight, GL_COLOR);

glReadBuffer(GL_FRONT);
glDrawBuffer(GL_BACK);


En este caso se copia del Back al Front (luego se reestablece)
Título: Dirty Rectangles on OpenGL
Publicado por: Pogacha en 13 de Febrero de 2007, 03:06:22 PM
Interesting point, my friend.

Ahora quedaria probar ...
Título: Dirty Rectangles on OpenGL
Publicado por: senior wapo en 13 de Febrero de 2007, 06:07:27 PM
Gracias por las respuestas.

He probado en WinXP con glCopyPixels de la ventana entera y parece que seleccionar los buffers origen y destino impone una penalización de tiempo significativa. Si los ejecuto también con la versión que usa swapbuffers (en vez de copypixels) se me igualan los tiempos así que no es la operación de copia la que frena.


glReadBuffer(GL_BACK);
glDrawBuffer(GL_FRONT);
...
glReadBuffer(GL_FRONT);
glDrawBuffer(GL_BACK);


Es de suponer que causan una pausa hasta que todas las primitivas se han dibujado mientras que swapbuffers será asíncrono y vuelve inmediatamente.
No creo que lo amortice a menos que los rectangulos ocupen media pantalla y me compense el parón reducir a la mitad el gasto en fillrate.

@Pogacha: Gracias por los links, yo no los vi al buscar en google. La extensión que encontraste al final (GL_WIN_swap_hint) es lo que buscaba, pero no parece que vaya a tener mucho soporte :(
Cuando pueda miro si me aparece en el Ibook y en Linux.
Título: Dirty Rectangles on OpenGL
Publicado por: Pogacha en 13 de Febrero de 2007, 07:55:07 PM
Cita de: "senior wapo"Cuando pueda miro si me aparece en el Ibook y en Linux.
y me cuentas como van ...
Ahora que pienso si lo implementa la plataforma y no el driver estamos fritos!
Habria que probar.