2017-12-23 55 views
1

OpenGLアプリケーションを通常よりも高い解像度でレンダリングさせようとしています。私はすでに、関連するGLX/OpenGL関数のほとんどをフックする共有ライブラリを作成しました。ここに私の現在のアプローチがあります(上位レベル)。OpenGLのフック - 任意のサイズのFBOへのレンダリング

When my hooked SwapBuffers() is called 
    Unbind my FBO 
    Call the (original/unhooked) SwapBuffers() 
    Bind my FBO 
    Set the viewport to (0, 0, HIGH_RES_X, HIGH_RES_Y) 
    Set the scissor region to (0, 0, HIGH_RES_X, HIGH_RES_Y) 
    return 

このアプローチは(ほとんどの)アプリケーションでは機能していないようです。いくつかのアプリケーションでは、glFragCoord.xyを画面解像度を表す統一(スクリーン空間からテクスチャ座標に変換する)で除算することによって、(スクリーン空間演算の)テクスチャルックアップを実行するためだと思われます。 を使用せずに、デフォルトのフレームバッファ(つまり、カラーバッファとデプスバッファの両方)に描画された内容を取得できるかどうかは疑問です。理想的には、このデータにテクスチャの形でアクセスする方法があります(既にGPUに入っています)。 Pixel Buffer Objectsについての話を聞いたことがありますが、これらのいずれかを使用するとパイプラインのストールを防ぐことができますか?

+2

このアプローチは、独自のフレームバッファをレンダリングする*アプリケーションでは機能しません。それらはフレームごとにバインドしなければならず、したがってビューポートとそれ以外のものは適切に設定しなければなりません。 –

+0

私の元のアプローチでは、代わりにglBindFramebuffer(GL_FRAMEBUFFER、0)の呼び出しを代わりにフレームバッファをバインドするようにglBindFramebufferをフックしました。他のglBindFramebuffer呼び出しは影響を受けません。また、異なるFBOがバインドされていないと仮定して、レンダリングの解像度が常に私が望むものであることを確認するためにglViewportをフックします。 – AnimatedRNG

+1

それも壊れています。デフォルトのフレームバッファは通常のFBOのように動作しません。例えば、 'glDrawBuffers'列挙子は全く異なっています。 –

答えて

1

私が提案したテクニックは、実際には少数のアプリケーションで動作しますが、ほとんどの場合は動作しません。

カラー/デプスバッファを抽出したい場合は、glReadPixelsでPBOのプールを使用するか、glBlitFramebufferを使用します。前者は、待ち時間が懸念される場合には選択肢ではない。後者はかなりうまくいきます(reshadeプロジェクトのexampleを参照してください)

関連する問題