2012-06-22 15 views
5

De acuerdo con la especificación opengl 4.0, glDrawPixels está en desuso.Cómo renderizar/dibujar objeto de búfer en framebuffer sin glDrawPixels

Para la interoperabilidad de cuda, parece mejor usar "objetos de búfer abiertos". (Una alternativa podría ser texturas o superficies, pero estas tienen problemas de caché/concurrencia y, por lo tanto, no se pueden usar para mi kernel de cuda).

Simplemente quiero crear un kernel cuda que use este objeto buffer mapeado mapeado y lo use como una "matriz de píxeles" o una pieza de memoria que contenga píxeles, más tarde el buffer no se mapeará.

Entonces quiero que el programa opengl dibuje el objeto de memoria intermedia en el framebuffer. Me gustaría usar una API abierta que no está en desuso.

¿Qué otras formas/apis hay para dibujar un objeto de memoria intermedia en el búfer de cuadros? (Además, los búferes de representación no se pueden utilizar, ya que probablemente tengan el mismo problema que los arreglos de cuda/problemas de almacenamiento en caché, por lo que esto excluye el objeto/extensión framebuffer?!?).

¿Hay una falta/falta funcionalidad en OpenGL 4.0 ahora que glDrawPixels está en desuso? ¿O hay una alternativa?

+0

Yo no bajo estar. Su primer punto indica que los objetos de búfer de OpenGL se recomiendan para interoperabilidad CUDA/OpenCL-OpenGL (y lo son). ¿Estás buscando otras alternativas o hay algún problema con esa avenida? – Ani

+0

El manual de cuda menciona tres soluciones para la interoperabilidad de gráficos cuda con opengl: objetos de búfer, texturas y búferes de representación. El manual más adelante menciona texturas y los búferes de render tienen problemas de almacenamiento en caché con la lectura/escritura de varios hilos. Por lo tanto, llego a la conclusión de que la única opción que queda es "objetos de memoria intermedia". La pregunta ahora es cómo "mostrar un objeto de memoria intermedia con OpenGL"? –

Respuesta

3

glDrawPixels ha sido retira de GL 3.2 y superior (que no está en desuso. Deprecated significa "disponible, pero que se eliminó en el futuro"). Se eliminó porque generalmente no es una forma rápida de dibujar datos de píxeles en la pantalla.

Su mejor opción es usar glTexSubImage2D en upload it to a texture, luego dibuje eso en la pantalla. O blit de la textura con glBlitFramebuffer.

+0

1. glTexSubImage2D podría ser una solución. 2. glBlitFramebuffer es probablemente solo para copiar entre framebuffers de lectura y escritura, así que no es una solución. –

+0

@SkybuckFlying: la parte glBlitFramebuffer era una alternativa al dibujo en la pantalla. Es decir, adjuntas la textura que cargaste los datos de píxeles a un FBO, luego * blit * it a la pantalla. Vas a estar usando glTexSubImage2D independientemente; solo se trata de si está dibujando un cuadrito texturizado o borrando de la textura al framebuffer predeterminado. –

+0

Ok, ahora veo ... De hecho, experimenté con glBlitFramebufferEXT cuando todavía era una extensión. Creo que algo funcionó, no recuerdo exactamente. Puede haber problemas con el multihilo o quizás no ... es tarde y me tengo que acostar, así que no tengo tiempo para buscar un ejemplo en mi disco para ver cómo funciona. Por ahora, probablemente estoy evitando framebuffers y simplemente usando una textura para dibujar en el framebuffer predeterminado, hasta ahora parece funcionar bien. –

2

Parece que la única solución es la siguiente:

  1. crear un "objeto tampón de pixel (OpenGL)", que es de esperar que el mismo como un "(OpenGL) (general) objeto tampón".

  2. Utilice el objeto de memoria intermedia de píxeles para la interoperabilidad de cuda. (Si no es posible, intente con un objeto de búfer general "

  3. Luego dibuje el objeto del búfer de píxeles en una textura con llamadas tex * opengl api y luego dibuje la textura en el búfer de fotogramas predeterminado. (Esto es probablemente un doble copie, probablemente el método más lento)

  4. O intente y dibuje el objeto de memoria intermedia de píxeles directamente en el framebuffer. No estoy seguro si esto requiere un objeto/extensión framebuffer especial. (Esto podría ser más rápido si puede hacerse directamente, solo una copia).

Cuestiones relacionadas