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についての話を聞いたことがありますが、これらのいずれかを使用するとパイプラインのストールを防ぐことができますか?
このアプローチは、独自のフレームバッファをレンダリングする*アプリケーションでは機能しません。それらはフレームごとにバインドしなければならず、したがってビューポートとそれ以外のものは適切に設定しなければなりません。 –
私の元のアプローチでは、代わりにglBindFramebuffer(GL_FRAMEBUFFER、0)の呼び出しを代わりにフレームバッファをバインドするようにglBindFramebufferをフックしました。他のglBindFramebuffer呼び出しは影響を受けません。また、異なるFBOがバインドされていないと仮定して、レンダリングの解像度が常に私が望むものであることを確認するためにglViewportをフックします。 – AnimatedRNG
それも壊れています。デフォルトのフレームバッファは通常のFBOのように動作しません。例えば、 'glDrawBuffers'列挙子は全く異なっています。 –