2012-02-01 22 views
2

私は、OpenGL描画コードを図面から表示に切り替えて、レンダリングバッファを付けたオフスクリーンFBOを使用するようにしました。オフスクリーンのFBOは、通常のレンダーバッファストレージを割り当てるときに正しくブリットされます。FBOでマルチサンプリングするとOpenGLが私のシーンを明るくするのはなぜですか?

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

私は同じ色を維持するために設定する必要があるいくつかのglEnableオプションがあると思われますが、私はこの問題を他の場所で見つけることはできません。

アイデア?

+0

問題のスナップショットと予想される正しい結果を提供できますか? – rotoglup

答えて

3

サンプルの位置が一致していないため、適切なダウンサンプリングが行われていないため、同じ問題が発生しました。どのような私のために働いていたことだった。

  • 同じ添付ファイル、フォーマットおよび寸法は別の「単一のサンプル」FBO(テクスチャ付きまたは添付をレンダ)ダウンサンプリングのためにブリットと、ウィンドウのバッファにこの
  • を/ブリットを描画します
  • GLSLフラグメントシェーダを使用して、フラグメントごとにすべての対応するサンプルを渡すことによって、入力と同じサンプル数を持つマルチサンプルテクスチャを持つマルチサンプルウィンドウバッファにレンダリングします。これは、サンプルシェーディングが有効になっていて、サンプルごとにライト、シャドー、AOなどを計算できるので、遅延シェーディングのオーバーキルアプローチです。
  • GLSLを使用して単一サンプルのフレームバッファに手動でダウンサンプリングするのではなく、別のサンプルをtexelFetch()で個別に取得する必要がありました。

マルチサンプリングでは状況が非常に遅くなりました。 CSAAはMSAAよりも優れていましたが、後処理のためにFXAAシェーダを使用することをお勧めします。パフォーマンスが問題である場合や、新しい拡張機能が必要な場合(ARB_texture_multisampleなど)は利用できません。 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色空間変換は を指定する必要がありますか?コンテキストクランプ状態が blitに影響するのを許可しますか?私のために働いた

Resolved: Blitting to a fixed point buffer always clamps, 
blitting to a floating point buffer never clamps. The context 
state is ignored. 
1

ソリューションは、レンダバッファのカラーフォーマットを変更しました。私はGL_RGBA32FGL_DEPTH_COMPONENT32Fを選びました(最高の精度が欲しいと思っていました)、そしてNVIDIAのドライバはそれを違って解釈します(私はsRGB補償を疑うが間違っている可能性がある)。

私が見つけたレンダバッファイメージフォーマットはGL_RGBA8GL_DEPTH_COMPONENT24です。

+0

サウンドは、このフォーマットがウィンドウのピクセルフォーマットと同じであるかのように、あなたが述べたようにカラーフォーマット変換が原因である可能性があります。私は変換を含めることができるそのGLSLスニペットを使用してRGB8にRGB16Fを持っています。それでも、sRGBは専用の拡張機能を持っているため、これはドライバの最適化のバグでなければならないので、sRGBの原因はまだわかりません。 – Sam

+0

それは私が理解していなかった部分でした。あなたのソリューションは、私が必要とするものよりも一般的に問題を解決しますが、より正確な答えです。 –

+0

自分の正直な理由がわからない限り、自分の答えは正しいと主張していません。 GLSLを使用したダウンサンプリングは、私が「最先端」と考えることができるものよりも非効率的な回避策です。 – Sam

関連する問題