ここでは、Qt4 について話していると仮定します。
QGLWidget で完全にオフスクリーンでレンダリングすることは可能ですか?
オフスクリーン レンダリングは、実際にはウィンドウ システムに依存するタスクではありません。ほとんどのツールキットで (少なくとも) WGL と GLX の唯一の問題は、サーフェスレス コンテキスト、つまり、ウィンドウ システムによって提供されるドローアブルにバインドされていないコンテキストを使用できないことです。つまり、現在のコンテキストが存在する限り、ウィンドウ システムが提供するデフォルトのフレームバッファが常に不変になります。
X11 を使用して手動でウィンドウを必要としないコンテキストを作成する手段はありますが、通常は手間をかける価値はありません。たとえば、EGL と OpenGL ES の場合、この問題は存在しません。これは、まさにこの問題に対応する拡張機能 (オフスクリーン レンダリング) があるためです。
ただし、有効なコンテキストが設定された後に QGLWidget を非表示にし、フレームバッファ オブジェクトを使用して、デフォルトのフレームバッファの介入なしですべてを行うことができます。
QGLWidget でモニターのリフレッシュ レートを回避できますか?
いいえ、私の知る限り、Qt4 の OpenGL モジュールにはプログラムで vsync を無効にする手段がありません。そのようなものについては、SDL または GLFW を使用できます (FreeGLUT についてはわかりません)。
ただし、ドライバーの設定でいつでもオフにすることができます。これは QGLWidget にも影響します (または、より適切に言えば、下層のウィンドウ システムのスワッピング動作です)。
フレームバッファでオフスクリーンのレンダリングを高速化できますか?
結局のところ、それは本当に問題ではないはずです。VRAM 以外の場所に画像データが必要になるため、現在のフレームを FBO にレンダリングした後、画像を取得する必要があります。結果をフロント バッファー (またはダブル バッファーとスワップが必要な場合はバック バッファー) にブリットするか、現在のフレームをさらに処理する前に読み返す必要があります。
ただし、OpenGL とパフォーマンスに関連するものと同様に、推測しないでください - profile !
遅い paintGL() 呼び出しなしでフレームバッファで完全にレンダリングするにはどうすればよいですか?
コンテキストが設定されると、ウィジェットはまったく必要ありません。Qt の介入なしに、すべての魔法を自分で行うことができます。存在する唯一の理由paintGL()
は、ウィジェットを更新する必要があるときに呼び出されることが保証されている、使いやすいインターフェイスをユーザーに提供することです。
編集:コメント内のクエリについては、この最小限のコード例を参照してください。これは、変更なしでクロスプラットフォームで動作するはずです。
#include <iostream>
#include <QtOpenGL/QGLWidget>
#include <QtGui/QApplication>
void renderOffScreen ()
{
std::cout << glGetString(GL_VENDOR) << std::endl;
std::cout << glGetString(GL_RENDERER) << std::endl;
std::cout << glGetString(GL_VERSION) << std::endl;
// do whatever you want here, e.g. setup a FBO,
// render stuff, read the results back until you're done
// pseudocode:
//
// setupFBO();
//
// while(!done)
// {
// renderFrame();
// readBackPixels();
// processImage();
// }
}
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QGLWidget gl;
// after construction, you should have a valid context
// however, it is NOT made current unless show() or
// similar functions are called
if(!gl.isValid ())
{
std::cout << "ERROR: No GL context!" << std::endl;
return -1;
}
// do some off-screen rendering, the widget has never been made visible
gl.makeCurrent (); // ABSOLUTELY CRUCIAL!
renderOffScreen ();
return 0;
}
私の現在のマシンでは、プログラムは次のように出力します。
ATIテクノロジーズ株式会社
AMD Radeon HD 7900 シリーズ
1.4 (2.1 (4.2.12337 互換性プロファイル コンテキスト 13.101))
QGLWidget
が実際に表示されることはなく、イベント処理も行われないことに注意してください。Qt OpenGL ライブラリは、コンテキストの作成にのみ使用されます。それ以外は、Qt の介入なしで行われます。必要に応じてビューポートなどを設定することを忘れないでください。
注意:コンテキストをセットアップする便利な方法だけが必要な場合は、FreeGLUT など、Qt4 よりも軽量なツールキットに切り替えることをお勧めします。個人的には、Sandy Bridge CPU などの一部のハードウェアで必要な方法で有効なコンテキストを設定する場合、FreeGLUT の方がはるかに信頼性が高いことがわかりました。