5

Qtで書かれたMDIアプリがあります。一部のサブウィンドウにはQGLWidget、OpenGLコンテキストなどが含まれます。これらの中で最も顕著なものは、OpenGL頂点シェーダーとフラグメントシェーダーを使用してデータを視覚化します。

アプリケーションのメインウィンドウのスクリーンショットをプログラムでキャプチャする必要があります。もちろん、たまたま表示されているすべてのサブウィンドウも含まれます。最初は簡単に聞こえますが(「間違いなく何度も尋ねられるので、ググってみましょう!」)、よく見ると少し注意が必要です...

これが私がこれまでに試したことです:

  1. QPixmap::grabWidgetシェーダープログラムを使用するサブウィンドウでは機能しません。これは、リダイレクトコンテキストが必要なOpenGL拡張機能をサポートしていないように見えるためです。(レンダリングコードは、関連付けられたコンテキストが必要な拡張機能をサポートしていることを確認し、サポートしていない場合は続行を拒否します。)
  2. QPixmap::grabWindow基本的なプリミティブのみを使用するものも含め、すべてのOpenGLコンテキストをサイレントに空のままにします。
  3. QGLWidget::grabFrameBufferAlt+PrtScr動作しますが、特定のサブウィンドウのOpenGLコンテキストのみをキャプチャしますが、アプリケーション全体(基本的にはWindowsで何が行われるか)を取得したいと思います。

また、最初に#2を実行してから、すべてのサブウィンドウに対して#3を繰り返し、#3の結果を#2から画像の正しい場所にコピーしてみました。これは、いくつかのサブウィンドウをオーバーラップさせるまでは非常にうまく機能しました。その場合、#3の画像がサブウィンドウのフレームなどを上書きします。したがって、このアプローチでは、厄介なコーナーケースをすべて処理するために、おそらくはるかに多くのコードが必要になります...

いくつかの追加の背景:スクリーンショットを取得したら、ビデオを作成するためにそれらのいくつかをシーケンスに入れます-おそらくffmpegを使用します。そのため、この質問は私の前の質問(の最初の部分)の一種の続きになります。アプリがシングルコンテキストのスタンドアロンOpenGLプログラムから、ウィンドウやUIウィジェット全体にQtを使用し、サブウィンドウにグラフィックを埋め込むものに進化しただけです。

もちろん、Qt風のクロスプラットフォームソリューションを好む一方で、Windows固有のハックに頼ることも検討したいと思います。Alt+PrtScr(私は非常に正しいことをしていることがわかるので、これは可能であるはずです。)

それで、何か提案はありますか?

4

3 に答える 3

3

非常にハックですが、このチュートリアルのように(ウィンドウを非表示にせずに)デスクトップをキャプチャし、ウィンドウ以外のすべてをトリミングしても機能しますか?

より一般的には、OpenGL仕様で、出力をフロントバッファーに配置する必要があるかどうかさえわかりません。実装では、出力にビデオオーバーレイ(またはVoodoo2風のVGAパススルーシェナニガン)を使用するだけで済みます。

于 2009-08-27T20:05:49.320 に答える
1

私が手に負えないと考えることができる唯一のことは、次の擬似コードを実行することです。

 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.
于 2009-08-28T14:40:42.187 に答える
0

これは何か用途がありますか?
Grabberの例は、OpenGLフレームバッファのコンテンツを取得する方法を示しています

于 2009-08-27T20:11:07.157 に答える