1

opengl es3 でガンマ補正を管理する方法を示すことになっている小さなサンプルes-300-fbo-srgbがあります。

基本的に私は持っています:

  • GL_SRGB8_ALPHA8テクスチャ_TEXTURE_DIFFUSE
  • 別のGL_SRGB8_ALPHA8テクスチャがオンGL_COLOR_ATTACHMENT0GL_DEPTH_COMPONENT24テクスチャがオンのフレームバッファGL_DEPTH_ATTACHMENT
  • 私のデフォルトのfboのバックバッファはGL_LINEAR
  • GL_FRAMEBUFFER_SRGB最初は無効。

私は得るこれ

それ以外のこれ

さて、方法を要約するdisplayと、これが私がしていることです:

  • TEXTURE_DIFFUSEsRGB fbo でテクスチャをレンダリングします。ソース テクスチャは sRGB 空間にあるため、フラグメント シェーダは自動的に線形値を読み取り、fbo に書き込みます。Fbo には sRGB ですが、線形値が含まれている必要がありますGL_FRAMEBUFFER_SRGB

  • fbo の内容を (プログラムを介して) デフォルトの fbo バック バッファにブリットします。しかし、この fbo のテクスチャには sRGB コンポーネントがあるため、読み取られた値に対して間違ったガンマ演算が実行されます。これは、そうでない場合に sRGB 空間で想定されるためです。

  • デフォルトの fbo のコンテンツをレンダリングするときに、モニターによって 2 番目のガンマ操作が実行されます。

だから私のイメージは、もし私が正しければ、2倍間違っている..

今、もし私glEnable(GL_FRAMEBUFFER_SRGB);が代わりに手に入れたらこれ

この画像は、sRGB を何度も修正したように見えます。

代わりに、無効のままにして fboGL_FRAMEBUFFER_SRGBのテクスチャの形式を変更すると、最終的に正しい画像が得られます..GL_COLOR_ATTACHMENT0

で正しい画像が得られないのはなぜglEnable(GL_FRAMEBUFFER_SRGB);ですか?

4

1 に答える 1

0

私はあなたが基本的に正しいと思います.1つ(モニターの1つ)で十分な2つのデコード変換の正味の効果が得られます. ドライバーまたはコードのいずれかが何かを壊しているため、OpenGL が適切に「ドットを接続」していないと思います。おそらく、この答えはあなたを助けます:

glEnable(GL_FRAMEBUFFER_SRGB) をいつ呼び出すか?

于 2016-02-09T12:43:03.037 に答える