2009-08-27 6 views
5

Qtで書かれたMDIアプリがあります。サブウィンドウの一部は、QGLWidget、すなわちOpenGLコンテキストを含む。これらの中で最も顕著なのは、OpenGLの頂点シェーダーとフラグメントシェーダーを使用してデータを視覚化することです。OpenGLを使用したQt MDIアプリケーション:有効なスクリーンショットを取得する方法は?

私はプログラム的に見えるように起こるのコースの全てのサブウィンドウを含むアプリケーションのメインウィンドウのスクリーンショットをキャプチャする必要があります。最初は簡単に聞こえます(「間違いなく何度も尋ねられましたので、ちょうどGoogleにしましょう!」)。しかし、近く見るとちょっと変わったようです...

これまで私が試したことはここにあります:リダイレクトコンテキストが必要なOpenGL拡張をサポートしていないようだどうやらので

  1. QPixmap::grabWidget

    は、シェーダプログラムを使用しサブウィンドウには機能しません。 (レンダリングコードは、関連するコンテキストが必要な拡張をサポートし、ない場合は継続を拒否したことを確認します。)
  2. QPixmap::grabWindowは静かに空のすべてのOpenGLコンテキストを残して - 基本的なプリミティブを使用するものも含めています。
  3. QGLWidget::grabFrameBufferが動作しますが、特定のサブウィンドウのOpenGLコンテキストだけをキャプチャしますが、アプリケーション全体(基本的にはWindowsの場合はAlt+PrtScr)を取得したいと考えています。

#2の画像の正しい場所に#3の結果をコピーするだけで、すべてのサブウィンドウに対して#1と#2を繰り返して試してみました。 #3の画像がサブウィンドウのフレームなどを上書きするので、このアプローチはおそらくすべての厄介なコーナーケースを処理するためにはるかに多くのコードを必要とするでしょう...

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

私はもちろん素敵な、Qtのっぽいクロスプラットフォームソリューションを好むだろうが、私はあまりにも、Windows固有のハックに頼ることを検討して喜びました。 (どちらが私は非常に正しいことをやってAlt+PrtScrを見ることができるよう、可能であるべき。)

ので、任意の提案ですか?

答えて

2

非常にハックが、this tutorialのように(自分のウィンドウを隠すことなく)デスクトップをキャプチャし、すべてのものが、あなたの窓の作品をトリミングしますか?

もっと一般的には、OpenGL仕様で出力がフロントバッファに配置されている必要があるとは確信していません。実装では、出力にビデオオーバーレイ(またはVoodoo2-esque VGAパススルーセナニガン)を使用できます。

+0

それは* *動作しません!なぜ私はこれについて自分自身を考えることができなかったのですか? ...私が見る唯一の欠点は、興味のあるウィンドウをつかむことと比べて、これは基本的にやや遅いということです。私は実際にビデオを手に入れようとしているので、これは関連性があるかもしれません。しかし、とにかく私は答えを受け入れています。なぜなら、私が求めたことを正確に実行するからです。ありがとう! – Reunanen

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. 
+0

私はこれがうまくいくはずだということに同意します。しかし、少なくとも今のところ、私は怠惰な道を取るつもりです:) – Reunanen

関連する問題