2009-01-19 10 views
7

Soy prácticamente un novato con OpenGL. Me imagino que glReadPixels es horrible, ¿cuál es la mejor manera de hacer esto? Estaba pensando en tener una función que bloquee una textura rect, haga algo como glTexSubImage2D para copiar los píxeles a la RAM, modifíquela y luego use glTexSubImage2D para copiar la memoria RAM de nuevo en la textura. ¿Es esta una buena manera? Puedo pensar en optimizaciones como una bandera que dice no copiar la textura, ya que la sobreescribirá y almacenará en caché.¿La mejor manera de acceder a píxeles en OpenGL?

¿Qué otros métodos puedo usar? ¿Puede alguno de ustedes decirme los nombres de las funciones de gl que puedo desear (para que pueda leer el manual) o dirigirme a un tutorial? Intenté buscar en Google, pero la mayoría de los resultados parecen no estar haciendo lo que tenía en mente.

+1

¿Puede explicar lo que está tratando de hacer? Nils tiene razón, use glReadPixels si REALMENTE lo necesita, pero no espere que sea rápido. Si explica lo que está tratando de hacer, tal vez alguien aquí puede sugerir un método mejor y evitar la necesidad de leer píxeles por completo. –

+0

En segundo lugar a petición de OJ. Hay muy pocas cosas (de representación) que necesitan los píxeles reales recuperados. –

Respuesta

6

glReadPixels es el camino a seguir.

Sí, es lento - horrible lento. Pero esa es la forma en que es. Las contrapartes de DirectX (por ejemplo, bloquear y leer los píxeles) tampoco son mucho más rápidas.

En general, debe evitar leer los píxeles de atrás y hacer algo con la CPU en los datos. Puedes hacer bastante procesamiento usando pixel-shaders, pero eso no te ayudará si quieres hacer capturas de pantalla (donde los datos deben terminar en la CPU).

0

La mejor idea sería tratar la memoria de búfer de cuadros en la tarjeta de video como de solo escritura. Creo que la razón es que la memoria de video está optimizada para escribir desde el lado de la CPU, a expensas de la lectura. (Obviamente, la memoria de video puede leerse rápidamente desde el lado de la tarjeta de video; debe enviarla al monitor en tiempo real)

La solución más rápida dependerá de lo que esté intentando hacer (cuidado de elaborar ?).

No hay nada que le impida mantener su propio framebuffer en la memoria principal, y luego copiarlo en una textura de cada cuadro y renderizarlo en OpenGL. He hecho esto antes y es mucho más rápido que glReadPixels, sin embargo, pierdes la capacidad de leer los resultados de otras actividades de renderizado de OpenGL. Úselo si todo lo que necesita hacer es mantener el estado fotograma a fotograma de una parte de su escena. Ejemplo: generación de una textura dinámica que no se puede hacer a través de un sombreador de píxeles.

Es posible que también pueda salir con la lectura de un conjunto de datos mucho más pequeño. Lo hice cuando estaba jugando con renderizado no realista. Tomé mi escena, la rendericé a 160x120, la volví a leer en la memoria principal y luego la reinterpreté como una colección de sprites 2D.

6

Como se indicó anteriormente glReadPixels es el camino a seguir. Una forma de hacer que leer el framebuffer o acceder a píxeles sea más rápido es usar la extensión ARB_pixel_buffer_object. Esto le permitirá hacer glReadPixels de forma asincrónica y el rendimiento puede ser mucho más rápido cuando necesite leer una gran cantidad de píxeles. El rendimiento puede ser mucho más rápido porque si usa el formato "correcto" la transferencia se realiza mediante DMA y no consume preciosos ciclos de CPU.

+1

algún ejemplo sobre cómo usar la extensión 'ARB_pixel_buffer_object'? – Niklas

Cuestiones relacionadas