opengl es3 でガンマ補正を管理する方法を示すことになっている小さなサンプルes-300-fbo-srgbがあります。
基本的に私は持っています:
GL_SRGB8_ALPHA8
テクスチャ_TEXTURE_DIFFUSE
- 別の
GL_SRGB8_ALPHA8
テクスチャがオンGL_COLOR_ATTACHMENT0
でGL_DEPTH_COMPONENT24
テクスチャがオンのフレームバッファGL_DEPTH_ATTACHMENT
- 私のデフォルトのfboのバックバッファは
GL_LINEAR
GL_FRAMEBUFFER_SRGB
最初は無効。
さて、方法を要約するdisplay
と、これが私がしていることです:
TEXTURE_DIFFUSE
sRGB 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);
ですか?