QGLWidget und schnell offscreen-rendering
Ist es möglich zu Rendern völlig offscreen in einer QGLWidget
mit Qt ohne die Notwendigkeit, Sie zu streichen, die Szene zu Bildschirm und vermeiden so völlig die Puffer flip auf dem monitor?
Muss ich speichern jeden frame erzeugt, auf den framebuffer, aber da die Sequenz besteht aus 4000 frames und das Zeitintervall der Bildschirm ist 15ms
verbringe ich 4000*15ms=60s
aber ich brauche viel viel schneller als die 60er Jahre (Berechnungen sind nicht ein Engpass ist hier nur das update das problem).
Kann offscreen-rendering auf einem framebuffer schneller sein? Kann ich vermeiden, dass der monitor-refresh-rate in meinem QGLWidget?
Wie kann ich das Rendern komplett auf framebuffer, ohne das langsame paintGL()
Anrufe?
- Würde QGLWidget::renderPixmap helfen?
- Wie wäre swapBuffers? qt-project.org/doc/qt-5.0/qtopengl/qglwidget.html#swapBuffers
swapBuffers()
wird nicht helfen, die OP zu heilen Ihr problem, da die swap-Intervall ist abhängig von VSync. Außerdem müssen Sie nicht wirklich brauchen, double-buffering, je nachdem, was Sie wollen zu machen. Der OP muss geklärt werden, was Sie sind-rendering.- Ich habe ein QGL format namens
QGL::IndirectRendering
was wird das benötigt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich jetzt mal davon aus wir reden hier von Qt4.
Off-screen-rendering " ist nicht wirklich ein Fenster-system-abhängige Aufgabe überhaupt. Das einzige problem mit WGL (mindestens) und GLX in den meisten toolkits ist, dass Sie nicht haben eine surfaceless Kontext, d.h. einen Zusammenhang, der nicht gebunden drawable zur Verfügung gestellt durch das Fenster-system. In anderen Worten, werden Sie immer Fenster-system zur Verfügung gestellt Standard-framebuffer, die unveränderlich sind, solange der aktuelle Kontext existiert.
Es gibt Mittel, um einen Kontext erstellen, der nicht erforderlich ist, eine Fenster manuell mit X11 aber es ist gewöhnlich nicht der Mühe Wert. Für EGL und OpenGL ES, zum Beispiel, dieses problem existiert nicht, weil es ist eine Erweiterung tendenziell genau dieses problem, d.h. off-screen-rendering.
Können Sie jedoch einfach ausblenden, das QGLWidget nach einem gültigen Kontext eingerichtet wurde, und verwenden Sie die framebuffer-Objekte, alles zu tun, ohne Standard-framebuffer-intervention.
Nein, meines Wissens nach, das OpenGL-Modul von Qt4 hat keine Möglichkeit, Sie zu aktivieren von vsync programmgesteuert. Sie können SDL oder GLFW für sowas (nicht sicher über FreeGLUT).
Jedoch, Sie können immer etwas aus in Ihren Treiber-Einstellungen. Dies wird auch Auswirkungen auf QGLWidget (oder besser gesagt, das swapping-Verhalten des zugrunde liegenden window-system.)
Es sollte wirklich keine Rolle in der Ende. Du wirst wollen, dass die Bilddaten einen anderen Platz als VRAM, so, nachdem gerendert, den aktuellen frame in ein FBO zu erhalten, müssen Sie das Bild sowieso. Sie entweder blit die Ergebnisse an den front-buffer (oder back-buffer, wenn Sie die Notwendigkeit, doppelte Pufferung und swap), oder Sie brauchen, um zu Lesen-zurück-Zeug vor der weiteren Bearbeitung Ihrer aktuellen frame.
Jedoch, wie bei allem OpenGL und Leistung im Zusammenhang, nicht erraten - Profil!
Nachdem ein Kontext eingerichtet ist, brauchen Sie nicht das widget an alle. Sie können alles tun, die Magie selbst ohne Qt-intervention. Der einzige Grund, warum
paintGL()
vorhanden ist, um dem Nutzer eine einfach zu bedienende Benutzeroberfläche, die garantiert werden aufgerufen, wenn das widget aktualisiert werden muss.BEARBEITEN: Als Ihre Anfrage in den Kommentaren, sehen diese minimale code-Beispiel, welches funktionieren sollte cross-Plattform ohne änderung.
Auf meinem aktuellen Rechner, die Programme gedruckt:
Bitte beachten Sie, wie die
QGLWidget
ist nie wirklich sichtbar gemacht und keine event-Verarbeitung stattfindet. Die Qt-OpenGL-Bibliothek wird lediglich verwendet, für den Kontext der Schöpfung. Alles andere geschieht ohne Qt-intervention. Nur vergessen Sie nicht, den viewport und die Sachen nach Ihren Bedürfnissen.Bitte beachten Sie: Wenn alles, was Sie brauchen, ist eine bequeme Möglichkeit, die Einrichtung zu einem Kontext, möchten Sie vielleicht zu wechseln, um einige toolkit, das ist leichter als Qt4, wie FreeGLUT. Persönlich fand ich FreeGLUT viel mehr zuverlässig, wenn es um die Einrichtung einer gültigen Kontext genau, wie ich es möchte auf einige hardware, wie z.B. Sandy-Bridge-CPUs.
QGLWidget
1) setup-widget-2) stellen Sie den aktuellen Kontext Aktueller 3) setup-FBO 4) ausblenden derQGLWidget
5) Schleife auf der rendering-Prozess, aber die Zeichnung auf den FBO-Recht?Ich eine Lösung gefunden habe, die mit der Nutzung
QGLFrameBuffer
Objekte undglReadPixels
.Zuerst Initialisiere ich meine
QGLFrameBuffer
Objekt in derQGLWidget::initializeGL
um eine gültige GL Kontext, in dem dieQGLFrameBuffer
können "Lügen".Dies ist eine erste Umsetzung. Die framerate ist
10
mal höher und aktualisiert Sie nicht alles, je nach VSync!!makeCurrent()
inneninitializeGL()
. In der Zeit der letzteren genannt wird, der Kontext wurde schon der aktuelle. Auch Sie scheinen nicht zu löschenQGLFramebufferObject
Sie erstellen, die auf dem heap, es sei denn, es geschieht in der sub-Klasse "dtor
was nicht sichtbar in deinem Beispiel. Auch ist es nicht überraschend, gewinnen Sie eine Größenordnung in den frametimes. Wenn Sie nichtswapBuffers()
, vsync ist völlig irrelevant.