2011-10-19 14 views
0

CSplitterWnd内に4つのOpenGLビューポートを作成しようとしていますが、いくつか問題があります。OpenGL with MFC

最初に、ピクセル形式にフラグPFD_SUPPORT_GDIを追加するまで、私は点滅と描画の問題が発生しました。これにより、すべてがうまく機能しました。しかし、PFD_SUPPORT_GDIを使用すると、私は1.1 OpenGLコンテキストしか取得できません。

OpenGLのバージョンが1.1より高いPFD_SUPPORT_GDIを使用して、VBOを使用することはできますか? PFD_SUPPORT_GDIなしでOpenGLを正しく動作させる別の方法がありますか?

PFD_SUPPORT_GDIを持たない最大の問題は、PFD_SUPPORT_GDIフラグを使用している間にスプライトウィンドウの区切り線をドラッグするとビューポートの内容が消えてしまうことです。

答えて

0

これを行う最も良い方法は、フレームバッファを使用することでした。 OnEraseBackground()の処理はフリッカーを助けましたが、MFCはまだOpenGLでうまくやりたいとは思っていませんでしたので、私はGDIソリューションにいなければなりませんでした。

各ビューポートは、まずそれ自身のフレームバッファーに描画され、その後適切なウィンドウにブリットされます。

void FrameBuffer::Blit(HDC hDC, int width, int height) 
{ 
    glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, blitBuffer); 
    SetDIBitsToDevice(hDC, 0, 0, width, height, 0, 0, 0, height, blitBuffer, &blitInfo, DIB_RGB_COLORS);  
} 

このソリューションでは、パフォーマンスに目に見える影響はありません。

2

PFD_SUPPORT_GDIは、ウィンドウにGDI描画を実行できることを意味します。これはハードウェアベースのOpenGL図面でGDI図面(ソフトウェア)を使用することができないため、ソフトウェアOpenGL実装を強制します。

したがって、ハードウェアOpenGL(またはD3D)アクセラレーションとGDIサポートの両方を同じウィンドウに持つことはできません。そのようなウィンドウの内容に何が起こるかに問題がある場合は、それは他の方法で解決する必要があります。おそらく、サイズが変更されたときなど、単にビューを再描画することができます。

+0

実際にFBOに描画し、ウィンドウに手動で結果をblitするのは、毎回のMFCを傍受しようとするよりも苦痛が少ないと思います。私が4つのビューポートを画面の大半を占めていると仮定した場合、どのようにそのようなものが実行されるのでしょうか? – bitwise

3

PFD_SUPPORT_GDIは、GDI呼び出しを使用して描画できるようにすることを意味します。ソフトウェアレンダラーを使用する必要があります。

フリッカーの問題は、特にMFCでは、WNDCLASS(EX)パラメータが正しく設定されていないために発生します。最も重要なのは、CS_OWNDCフラグを設定し、バックグラウンドブラシをNULLにする必要があります。また、OnEraseBackgroundハンドラを上書きし、有効な矩形を報告するOnPaintハンドラを実装する必要があります。