W mojej aplikacji wykonać kopie zawartości danego QGLWidget dla dwóch celów:Jak wziąć wiarygodne QGLWidget migawkę
- Nie przerysowanie scenę przez cały czas, gdy tylko an zmiany nakładki, przy użyciu pamięci podręcznej pixmapę zamiast
- Lat użytkownik robi zrzuty ekranu poszczególnych działek (scena 3D)
Pierwsza rzecz, którą wypróbowałem to grabFrameBuffer()
. Używanie tej funkcji jest naturalne, jak w przypadku pierwszej aplikacji, co jest aktualnie widoczne w widgecie, to dokładnie to, co chcę buforować. PROBLEM: W przypadku niektórych sprzętów (np. Grafiki zintegrowanej z procesorem Intel, Mac OS X z grafiką GeForce) uzyskany obraz nie zawiera aktualnej zawartości ekranu, ale zawartość wcześniej. Jeśli więc scena byłaby narysowana dwa razy, na ekranie zobaczysz drugi rysunek, na obrazie zobaczysz pierwszy rysunek (który powinien być treścią bufora wstecznego?).
Druga rzecz, którą wypróbowałem to renderToPixmap()
. To powoduje, że używasz paintGL()
, ale nie używasz paint()
. Mam wszystkie moje rzeczy w paint()
, ponieważ używam funkcji malowania Qt i tylko mały kawałek kodu używa natywnego GL (beginNativePainting()
, endNativePainting()
).
Próbowałem również standardowej migawki QWidget (QPixmap :: fromWidget() lub jak to się nazywa), ale tam framebuffer GL jest czarny.
Jakieś pomysły, jak rozwiązać problem i uzyskać wiarygodny obraz aktualnie narysowanej sceny?
Skończyło się na pracy z FBO. – ypnos