2

OpenGL 描画コードを、ディスプレイへの直接描画から、レンダー バッファーがアタッチされたオフスクリーン FBO の使用に切り替えました。通常のレンダリング バッファ ストレージを割り当てると、オフスクリーン FBO が画面に正しくブリットされます。

ただし、レンダー バッファでマルチサンプリングを有効にすると ( 経由でglRenderbufferStorageMultisample)、シーン内のすべての色が明るくなったように見えます (したがって、マルチサンプリングされていない部分とは異なる色になります)。

同じ色を維持するために設定する必要があるglEnableオプションがあると思われますが、この問題についての言及は他に見当たりません。

何か案は?

4

2 に答える 2

3

サンプルの場所が一致しないために適切なダウンサンプリングが行われなかったため、同じ問題に遭遇しました。私にとってうまくいったのは:

  • ダウンサンプリングのためにブリットし、これをウィンドウ バッファに描画/ブリットするための、同一のアタッチメント、形式、および寸法 (テクスチャまたはレンダ バッファがアタッチされたもの) を持つ別の「単一サンプル」FBO
  • GLSL フラグメント シェーダーを使用してフラグメントごとに対応するすべてのサンプルを渡すことにより、入力と同じサンプル数を持つマルチサンプル テクスチャを使用して、マルチサンプル ウィンドウ バッファーにレンダリングします。これは、サンプル シェーディングを有効にして機能し、サンプルごとにライト、シャドウ、AO などを計算できるため、ディファード シェーディングの過剰なアプローチです。
  • また、GLSL を使用してシングル サンプル フレームバッファへのずさんなマニュアル ダウンサンプリングも行いましたtexelFetch()

マルチサンプリングで物事は本当に遅くなりました。CSAA は MSAA よりも優れたパフォーマンスを発揮しましたが、パフォーマンスが問題になる場合や、 ARB_texture_multisampleなどの新しい拡張機能が必要な場合は、代替手段として FXAA シェーダーを後処理に検討することをお勧めします。

GLSL でサンプルにアクセスする:

vec4 texelDownsampleAvg(sampler2DMS sampler,ivec2 texelCoord,const int sampleCount)
{
    vec4 accum = texelFetch(sampler,texelCoord,0);
    for(int sample = 1; sample < sampleCount; ++sample) {
        accum += texelFetch(sampler,texelCoord,sample);
    }
    return accum / sampleCount;
}

11) 異なるビット サイズのバッファ間でブリットを許可する必要がありますか?

Resolved: Yes, for color buffers only.  Attempting to blit
between depth or stencil buffers of different size generates
INVALID_OPERATION.

13) BlitFramebuffer の色空間変換はどのように指定する必要がありますか? コンテキスト クランプ状態がブリットに影響することを許可しますか?

Resolved: Blitting to a fixed point buffer always clamps,
blitting to a floating point buffer never clamps.  The context
state is ignored.
于 2012-02-02T20:31:43.397 に答える
1

私にとってうまくいった解決策は、レンダーバッファーの色形式を変更することでした。私はGL_RGBA32Fand GL_DEPTH_COMPONENT32F(最高の精度が必要だと考えた) を選択しましたが、NVIDIA ドライバーはそれを別の方法で解釈します (sRGB 補正を疑っていますが、間違っている可能性があります)。

私が動作することがわかったレンダーバッファの画像フォーマットGL_RGBA8GL_DEPTH_COMPONENT24.

于 2012-02-08T16:39:11.403 に答える