app Qt MDI avec OpenGL: comment saisir une capture d'écran valide?
-
20-09-2019 - |
Question
Je MDI application écrit en Qt. Certains des sous-fenêtres comprennent QGLWidget
s, à savoir, des contextes OpenGL. Le plus marquant de ces utilisation vertex shaders OpenGL et le fragment de visualiser leurs données.
Je dois capturer une capture d'écran de programmation fenêtre principale de l'application, y compris bien sûr tous les sous-fenêtres qui se trouvent être visibles. Cela semble facile au premier abord ( « certainement été demandé à plusieurs reprises, alors allons google juste! »), Mais après un examen plus attentif, il semble avoir un peu délicat ...
Maintenant, voici ce que j'ai essayé jusqu'à présent:
-
QPixmap::grabWidget
ne fonctionne pas pour les sous-fenêtres qui utilisent les shaders, apparemment parce que le contexte de redirection ne semble pas supporter les extensions OpenGL nécessaires. (Le code de rendu vérifie que le contexte associé prend en charge les extensions nécessaires, et refuse de continuer sinon.) -
QPixmap::grabWindow
laisse en silence tous les contextes OpenGL vides - même ceux qui utilisent primitives de base seulement. -
QGLWidget::grabFrameBuffer
fonctionne, mais ne capture que le contexte OpenGL de la fenêtre secondaire spécifique , alors que je voudrais saisir toute l'application (essentiellement ceAlt+PrtScr
fait dans Windows).
J'ai aussi essayé de faire d'abord # 2 et # 3 itérer puis pour tous les sous-fenêtres, copier seulement le résultat de # 3 dans le bon endroit de l'image de # 2. Cela a fonctionné très bien, jusqu'à ce que je fait quelques sous-fenêtres se chevauchent - dans ce cas, les images de # 3 écrasent les cadres de fenêtre secondaire, etc. Donc, cette approche aurait probablement besoin d'un code beaucoup plus afin de traiter tous les cas de coin coquins ...
Un peu d'histoire supplémentaire: Une fois que je reçois la capture d'écran, je vais mettre plusieurs d'entre eux dans un seqence afin de créer une vidéo - probablement en utilisant ffmpeg . Cela fait de cette question une sorte de continuation à (la première partie) mes question précédente; il est juste que l'application a évolué à partir d'un programme OpenGL standalone unique contexte à quelque chose qui utilise Qt pour l'ensemble fenêtrage et d'autres choses widget UI, et intègre les graphiques dans les sous-fenêtres.
Alors que je préfère bien sûr une belle solution multi-plateforme Qt-ish, je suis prêt à envisager de recourir à un hack spécifique Windows aussi. (Ce qui devrait être possible, comme je peux voir Alt+PrtScr
faire très bien la bonne chose.)
Alors, des suggestions?
La solution
Très hackish, mais ne capture le bureau (sans cacher la fenêtre) comme dans cette tutoriel et tout la culture, mais votre travail de fenêtre?
De manière plus générale, je ne suis même pas sûr que les exigences spécification OpenGL que la sortie doit être placé dans la mémoire tampon avant:. Une implémentation pourrait simplement utiliser les superpositions vidéo (ou Voodoo2-esque VGA de manigances pass-through) pour la sortie
Autres conseils
La seule chose que je peux penser à la main est de faire la psuedocode suivante:
for each window
grab the window into its own pixmap
grab the GL portions and paste into the windows
order the window pixmaps by depth of the window (deepest first)
initialize a common pixmap
for each window pixmap
paint the window pixmap into the common pixmap at the appropriate location.
Est-ce toute utilisation ??
Les exemples Grabber montre comment récupérer le contenu d'un OpenGL framebuffer