5

私のアプリケーションでは、次の 2 つの目的で QGLWidget のコンテンツのスナップショットを作成します。

  • 代わりにキャッシュされたピックスマップを使用して、オーバーレイのみが変更されたときに常にシーンを再描画するのではなく
  • Lat ユーザーが特定のプロット (3D シーン) のスクリーンショットを撮る

最初に試したのはgrabFrameBuffer(). この関数を最初のアプリケーションとして使用するのは当然です。現在ウィジェットに表示されているものは、まさに私がキャッシュしたいものです。 問題:一部のハードウェア (Intel integrade グラフィックス、GeForce グラフィックスを搭載した Mac OS X など) では、取得した画像に現在の画面コンテンツが含まれず、その前のコンテンツが含まれます。したがって、シーンが 2 回描画される場合、画面には 2 番目の描画が表示され、画像には最初の描画が表示されます (これはバックバッファーのコンテンツである必要があります)。

2番目に試したのはrenderToPixmap(). これは を使用してレンダリングしますpaintGL()が、 を使用しませんpaint()。Qt の描画機能を使用し、ネイティブ GL ( 、 )paint()を使用するのはコードのごく一部のみであるため、すべてのものは にあります。beginNativePainting()endNativePainting()

通常の QWidget のスナップショット機能 (QPixmap::fromWidget()、またはそれと呼ばれるもの) も試しましたが、GL フレームバッファは黒です。

問題を解決し、現在描かれているシーンの信頼できる描写を得る方法についてのアイデアはありますか?

4

4 に答える 4

2

QGLWidget::grabFrameBuffer() が内部的に OpenGL から glReadPixels() を呼び出しているようです。ダブルバッファ構成では、初期モードはバック バッファ (GL_BACK) を読み取り、QGLWidget::grabFrameBuffer() を使用して画面に画像を表示する前に、OpenGL 呼び出し glReadBuffer(GL_FRONT) でフロント バッファに切り替えます。

于 2014-08-16T18:56:25.373 に答える
2

信頼できる QGLWidget スナップショットを取得する方法

現在のシーンをフレーム バッファにレンダリングし、フレーム バッファからファイルにデータを保存します。または、glFlush の後に現在のバックバッファーを取得します。それ以外には、アーティファクトや不完全なシーンが含まれる可能性があります。

于 2012-05-04T23:20:37.513 に答える
1

の結果はQGLWidget::grabFrameBuffer()、他のすべての OpenGL 呼び出しと同様に、ビデオ ドライバーに依存します。Qt は単に呼び出しをドライバーに転送し、返された画像を取得しますが、画像の内容は Qt の制御下にはありません。ビデオ カードの最新のドライバがインストールされていることを確認する以外にできることは、ビデオ カードの製造元にバグを報告して祈る以外にありません。

于 2012-05-04T00:05:06.717 に答える
0

私はとを使用paintGL();glFlush()ます。ご使用前にgrabFrameBuffer()。paintGL は、現在表示されているものの正確なコピーを作成するフレーム バッファーを取得する前に、現在のフレームを再度描画するのに役立ちます。

于 2013-01-06T22:03:38.057 に答える