2010-12-08 14 views
14

Quiero representar mi escena en un hilo y luego ajustar el resultado en una ventana propiedad de otro hilo. Para evitar leer el framebuffer de vuelta a la memoria de la CPU, me gustaría utilizar un objeto framebuffer. Hasta ahora no he podido hacer que esto funcione (textura blanca), lo que me hace creer que esto no es compatible con opengl.¿Es posible compartir un objeto opengl framebuffer entre contextos/hilos?

  1. ¿Es posible compartir objetos framebuffer entre diferentes contextos?
  2. ¿Es posible compartir un objeto framebuffer entre diferentes hilos, dado que el objeto solo está vinculado por un hilo a la vez?

Si alguien me puede indicar dónde se describe esto en la documentación, sería una ventaja.

+0

Se otorgará una recompensa a cualquiera por un código de muestra que funcione, vivo o muerto :) o, al menos, una guía paso a paso cómo configurar un intercambio de FBO o implementarlo utilizando una textura y un buffer de representación. – Suma

+0

@Suma Compartir texturas es específico de la plataforma. En Windows, se hace con wglShareLists(), que debe invocarse antes de generar la (s) textura (s) que se adjuntan a su FBO con glFramebufferTexture(). Según tengo entendido, debería poder usar esta textura de su otro contexto, incluso si su implementación/versión de OpenGL no le permite compartir el FBO directamente. – Plow

+0

Sí, entiendo esto, sin embargo, no pude encontrar un ejemplo completo y funcional de cómo exactamente uno haría esto, y al experimentar con él en base a lo que ya sé, hasta ahora no pude hacerlo bien. Cuando busqué en Google encontré esta o varias preguntas similares en varios foros, pero la respuesta nunca fue satisfactoria. (Al igual que con el OP, ahora estoy interesado en Windows). – Suma

Respuesta

9

No es posible compartir framebuffers entre diferentes contextos. Ver el primer párrafo del Apéndice D, especificación OpenGL 3.3. Sin embargo, puedes compartir texturas y renderbuffers, lo que debería darte lo que necesitas.

En cuanto a la rosca: debería ser posible, pero en general se recomienda no emitir comandos GL desde múltiples hilos (porque es muy difícil de sincronizar). Por lo general, debe copiar el contenido en un objeto-buffer-píxel y asignarlo desde el hilo GL, luego usar el puntero mapeado del otro hilo.

+5

Ragarding multithreading: si bien es cierto que no se deben combinar las llamadas de representación de varios hilos, se debe tener en cuenta que el contexto de representación se puede migrar perfectamente entre hilos. Cualquier contexto de representación individual puede estar activo en un solo subproceso a la vez, pero es muy posible que separe un contexto (MakeCurrent (NULL)) y luego vuelva a conectarlo en otro subproceso. – datenwolf

+1

Las especificaciones no enumeran el FBO como compartible, pero no excluyen específicamente la posibilidad. He encontrado una página (http://www.pyglet.org/doc/programming_guide/sharing_objects_between_contexts.html) que lista FBO como compartible, ¿está mal entonces? – Suma

+4

Parece que compartir FBO es diferente con diferentes versiones de OGL. Cf. http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270430&page=2 ("Si está utilizando GL 2.1 y EXT_fbo, entonces la ID de FBO se comparte ... Si está utilizando GL 3.0 (hacia adelante), ... FBO ID no se comparte. ") – Suma

Cuestiones relacionadas