Montag, Januar 27, 2020

Ist es möglich, zu teilen, eine opengl-framebuffer-Objekt zwischen Kontexten/threads?

Möchte ich render meine Szene in einem thread, und dann blit das Ergebnis im Fenster besaß, durch einen anderen thread. Um zu vermeiden das Lesen der framebuffer des cpu-Speichers, ich möchte mit einem framebuffer-Objekt. So weit ich habe nicht in der Lage, diese zu arbeiten (weiß Struktur), das lässt mich glauben, dass dies nicht unterstützt opengl.

  1. Ist es möglich, zu teilen framebuffer-Objekte zwischen den verschiedenen Kontexten?
  2. Ist es möglich, zu teilen ein framebuffer-Objekt zwischen verschiedenen threads gegeben, dass das Objekt nur dann gebunden, ein thread zu einem Zeitpunkt?

Wenn jemand kann mir zeigen Sie mir, wo ist dies in der Dokumentation beschrieben, wäre das ein bonus.

  • Ein Kopfgeld zugesprochen wird jemand für einen funktionierenden Beispiel-code – tot oder lebendig 🙂 – oder zumindest eine Schritt-für-Schritt-Anleitung, wie Sie entweder setup ein FBO zu teilen, oder führen Sie mit teilen eine textur-und renderbuffer.
  • Austausch von Texturen ist Plattform-spezifisch. In Windows ist es getan mit wglShareLists(), die aufgerufen werden muss, bevor dem generieren der textur(en), die an Ihrem FBO mit glFramebufferTexture(). Mein Verständnis ist, dass Sie sollten in der Lage sein zu verwenden, diese textur aus Ihren anderen Kontext, auch wenn Ihre OpenGL-implementation/version erlaubt es Ihnen nicht, zu teilen FBO direkt.
  • Ja, ich verstehe das, aber ich war nicht in der Lage zu finden, ein komplettes und lauffähiges Beispiel wie genau würde man dies tun, und beim Experimentieren mit es basiert auf dem, was ich bereits weiß, ich war nicht in der Lage, es richtig zu machen, so weit. Beim Googlen habe ich gefunden das diese oder eine ähnliche Frage gestellt viele Male auf verschiedenen Foren, aber die Antwort war nie befriedigend. (Wie mit der OP, ich bin interessiert an der Windows-jetzt).
  • Ok, das ist entmutigend. Ich habe nicht in der Lage gewesen um dies zu testen mich, da ich keinen Zugriff auf den zweiten Kontext, bis die Texturen bereits Hinzugefügt worden, etwas, das wglShareLists() nicht unterstützt.
InformationsquelleAutor Plow | 2010-12-08

1 Kommentar

  1. 9

    Ist es nicht möglich, zu teilen Framebuffer zwischen den verschiedenen Kontexten. Siehe den ersten Absatz von Anhang D, OpenGL 3.3 spec. Sie können jedoch die Freigabe Texturen und renderbuffers, die Ihnen zu wollen, die Sie brauchen.

    Als für die threading: Es sollte möglich sein, aber es wird allgemein empfohlen, nicht zum ausstellen von GL-Befehlen aus mehreren threads (Weil es ist nur sehr schwer zu synchronisieren). Normalerweise würden Sie kopieren Sie den Inhalt in ein pixel-buffer-object und und Karte aus dem GL-thread, dann verwenden Sie das zugeordnete Zeiger aus dem anderen thread.

    • Ragarding multithreading: Während es stimmt, dass sollte man nicht mischen, Rendern, die Anrufe von mehreren threads darauf hingewiesen werden sollte, dass die render-Kontext möglicherweise migriert werden, zwischen threads sehr gut. Jede einzelne rendering-Kontext aktiv sein kann in nur einem thread zu einem Zeitpunkt, aber Sie können sehr gut trennen einen Kontext (MakeCurrent(NULL)) und bringen es in einem anderen thread danach.
    • Die specs nicht Liste die FBO als austauschbar, aber nicht ausdrücklich ausschließen. Ich habe eine Seite (pyglet.org/doc/programming_guide/…) was ist die Auflistung FBO als shareable, ist es dann falsch?
    • Es scheint FBO-sharing ist anders mit verschiedenen OGL-Versionen. Vgl. opengl.org/discussion_boards/… („Wenn Sie mit GL 2.1 und EXT_fbo, dann FBO-ID freigegeben ist. … Wenn Sie mit GL 3.0 (vorne), … FBO-ID ist nicht freigegeben.“)

Kostenlose Online-Tests