Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dirty Rectangles on OpenGL

Iniciado por senior wapo, 13 de Febrero de 2007, 12:22:30 AM

« anterior - próximo »

senior wapo

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 ?

Pogacha

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 :/

marcode

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)
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Pogacha

Interesting point, my friend.

Ahora quedaria probar ...

senior wapo

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.

Pogacha

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.






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.