2016-07-08 18 views
-1

OpenGLを使用して3Dシーンをウィンドウに直接レンダリングするプロジェクトを継承しました。コードは正常に機能しますが、3Dビューにアイコンを描画して「3Dビューモードを終了」します。これは正常に動作しますが、ビューが急激に回転すると、ちらつきが多く発生します。OpenGLをオフスクリーンビットマップに描画する

オフスクリーンのビットマップ(すなわち、HWNDなし)に描画してから、ビットマップにアイコンを描画し、最後にダブルバッファリングを使用してビットマップをStretchBltビットマップに描画したいと考えています。これは他のコンテキスト(OpenGLを必要としない画像のズームなど)で行います。うまく動作します。私の問題は、私がOpenGLの初心者であり、オフスクリーンのビットマップのDCで始まり、このDCからHWNDを作成しようとするすべての試みが失敗することです。通常、DCのピクセル形式を選択するためです。

StackOverflow(eg. this question without an accepted answer)に似たようなことを尋ねる質問がありますが、これは可能でしょうか?手順については比較的簡単なチュートリアルがありますか?プロセスが非常に複雑で詳細なOpenGLの知識が必要な場合は、それが私たちのソフトウェアでほとんど使われないモードであるので、それを残し、ちらつきと一緒に暮らす。

答えて

0

を単にテクスチャクワッドを使用してOpenGLを使用してアイコンを描きます。

をすべてこのドロービットマップのコピーにDC StretchBltには、いくつかの関係しますグラフィックスメモリ(帯域幅の無駄遣い)との往復、StretchBltはGPUアクセラレーションされない可能性があります。非効率であり、品質を低下させる可能性さえあります。

実行可能ファイルにリソースとしてアイコンが格納されているとします。最も簡単な方法は、DIBSECTION(CreateDIBSection)を使用してメモリDC(CreateCompatibleDC)を作成し、そのアイコンを描画し、DIBSECTIONデータをOpenGLテクスチャにロードすることです。次に、アイコンを使用してglViewportを使用して、ウィンドウ座標内のデスティネーション矩形を選択し、ビューポート全体(位置値(-1,1)→(1,1))、テクスチャ座標値(0、 0)→(1,1)はあなたに正しい結果を与えます)。

重要なサイドフィックス:ウィンドウサイズ変更ハンドラで、ビューポートと固定機能パイプラインGL_PROJECTIONマトリックスを設定するなど、プログラムが愚かな場合は、そのアンチパターンをクリーンアップし、それを所属する場所に移動する必要があります。

関連する問題