2010-12-08 26 views
14

Je veux rendre ma scène dans un fil, puis écraser le résultat dans une fenêtre appartenant à un autre fil. Pour éviter de lire le framebuffer en mémoire cpu, je voudrais utiliser un objet framebuffer. Jusqu'à présent, je n'ai pas réussi à faire fonctionner cela (texture blanche), ce qui me fait croire que cela n'est pas supporté par opengl. Est-il possible de partager des objets framebuffer entre des contextes différents?Est-il possible de partager un objet framegl frame opengl entre contextes/threads?

  1. Est-il possible de partager des objets framebuffer entre différents contextes?
  2. Est-il possible de partager un objet framebuffer entre différents threads, étant donné que l'objet n'est lié que par un thread à la fois?

Si quelqu'un peut pointer vers où cela est décrit dans la documentation, ce serait un bonus.

+0

Une prime sera accordée à quiconque pour un exemple de code de travail - mort ou vivant :) - ou au moins un guide étape par étape comment configurer un partage FBO, ou l'implémenter en partageant une texture et renderbuffer. – Suma

+0

@Suma Partage de textures est spécifique à la plate-forme. Dans Windows, il est fait avec wglShareLists(), qui doit être appelé avant de générer la texture (s) qui sont attachés à votre FBO avec glFramebufferTexture(). Ma compréhension est que vous devriez être capable d'utiliser cette texture de votre autre contexte même si votre implémentation/version OpenGL ne vous permet pas de partager le FBO directement. – Plow

+0

Oui, je comprends cela, mais je n'ai pas réussi à trouver un exemple complet et concret de la façon de le faire, et en l'expérimentant sur la base de ce que je sais déjà, je n'ai pas réussi à le faire correctement. Lors de Google, j'ai trouvé cette question ou une question similaire à plusieurs reprises sur divers forums, mais la réponse n'a jamais été satisfaisante. (Comme avec le PO, je suis intéressé par Windows maintenant). – Suma

Répondre

9

Il n'est pas possible de partager des framebuffers entre différents contextes. Voir le premier paragraphe de l'annexe D, spécification OpenGL 3.3. Cependant, vous pouvez partager des textures et des rendus, ce qui devrait vous donner ce dont vous avez besoin. Comme pour le thread: Cela devrait être possible, mais il est généralement conseillé de ne pas lancer de commandes GL à partir de plusieurs threads (car il est juste très difficile à synchroniser). Habituellement, vous copiez le contenu dans un objet pixel-buffer et le mappez à partir du thread GL, puis utilisez le pointeur mappé de l'autre thread.

+5

Ragarding multithreading: Bien qu'il soit vrai que l'on ne devrait pas mélanger les appels de rendu à partir de plusieurs threads, il est à noter que ce contexte de rendu peut parfaitement être migré entre les threads. N'importe quel contexte de rendu peut être actif dans un seul thread à la fois, mais vous pouvez parfaitement détacher un contexte (MakeCurrent (NULL)) et le rattacher à un autre thread par la suite. – datenwolf

+1

Les spécifications ne listent pas les FBO comme partageables, mais elles n'excluent pas spécifiquement la possibilité. J'ai trouvé une page (http://www.pyglet.org/doc/programming_guide/sharing_objects_between_contexts.html) qui liste FBO comme partageable, est-ce faux alors? – Suma

+4

Il semble que le partage FBO soit différent avec différentes versions d'OGL. Cf. http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270430&page=2 ("Si vous utilisez GL 2.1 et EXT_fbo, l'ID FBO est partagé ... Si vous utilisez GL 3.0 (en avant), ... L'ID FBO n'est pas partagé. ") – Suma