0

パフォーマンス上の理由から、2D レンダリングと 3D レンダリングを分離しました。QGLFramebuffer はターゲットとしてのマルチサンプリングをサポートしていないため、タイプごとに 2 つの QGLFramebufferObjects がありますGL_TEXTURE_2D。マルチサンプリング バッファへの描画が完了すると、ピクセル値が解決される「通常の」QGLFramebufferObject にブリットされます。これがレンダー タイプの 1 つまたは両方に対して行われると、バッファは 2D の「レイヤ」を 3D のレイヤにブレンドするシェーダへのテクスチャ入力として使用されます。

私はすべての 2D 作業に QPainter を使用し、QPainter は Qt 型にしかペイントできないため、純粋な OpenGL オブジェクトの代わりに QGLFramebufferObjects を使用することに固執していることに言及する必要があります。

このプロセスは正常に機能しますが、アンチエイリアシングが暗すぎて、ほとんど暗いアウトラインのように見えます。

悪いブレンド

いくつかの調査を行った後、これは sRGB の代わりに線形色空間を使用することにあることがわかりました (ここここ)。そこで、FBO ブリッティングを有効GL_FRAMEBUFFER_SRGBにし、すべての FBO のテクスチャ ターゲットの内部タイプを に設定GL_SRGB8_ALPHA8し、シェーダーでのブレンド計算の前に sRGB->Linear を実行しました (最終出力の前に再び戻ってきました)。

しかし、それは機能していません。明るすぎる、暗すぎる、またはまったく同じに見えます。フレーム全体が暗すぎる/明るすぎる場合はいつでも、色空間の変換に失敗したことが原因であることがわかります. しかし、それがまったく同じに見えるとき - 何が起こっているのですか!?

GL_FRAMEBUFFER_SRGB状態を有効にするための操作の順序、ブリッティングが色空間に影響を与えるかどうか、およびアンチエイリアシングが正しく見えるようにするためにどの FBO が sRGB にある必要があるかを誰かが説明することで、私は本当にやり遂げることができます。または、私は完全に間違っていますか?これらのマルチサンプリング アーティファクトを引き起こしているのは、まったく別のものですか?

4

1 に答える 1

1

そこで、FBO ブリッティング用に GL_FRAMEBUFFER_SRGB を有効にし、すべての FBO のテクスチャ ターゲットの内部タイプを GL_SRGB8_ALPHA8 に設定し、シェーダーでのブレンド計算の前に sRGB->Linear を実行しました (そして、最終出力の前に再び戻ってきました)。

それは最後のステップまで意味がありました。

sRGB カラースペースを使用するイメージ フォーマットは、そのテクスチャからのテクスチャ アクセスがsRGB カラースペースからリニア カラースペースに自動的に変換されることを意味します。これは、テクスチャからテクセルをフェッチするときに自然に発生します。無料です。したがって、「sRGB->Linear」計算をまったく行う必要はありません。

同様に、GL_FRAMEBUFFER_SRGBsRGB 色空間を使用する画像をレンダリングするときに有効にした場合、その画像に書き込む値はlinearであると見なされます。を有効GL_FRAMEBUFFER_SRGBにすることで、OpenGL に指示していることは、書き込んだ線形値を sRGB 色空間値に変換することです。これも無料で、ブレンディングとアンチエイリアシングで問題なく動作します。繰り返しますが、手動で変換する必要はありません。

したがって、実際に行う必要があるのは、適切に線形のカラー パイプラインを確保することです。sRGB 色空間で作成されたテクスチャは、sRGB 色空間の画像形式を使用する必要があります。これにより、シェーダーでそれらから取得する値が線形になるため、ライティングの計算が実際に機能します。GL_FRAMEBUFFER_SRGB色の値を書き込むときは、有効にして sRGB 色空間フレーム バッファに書き込む必要があります。これにより、シェーダーから書き込んだ線形値が表示用に sRGB に適切に変換されます。

最後の部分は、ディスプレイも sRGB イメージであることを確認する必要があるということです。Qt OpenGL コンテキストの初期化については何も知りませんが、過去 4 年間ほど OpenGL を無視していない限り、sRGB 色空間バッファーでコンテキストを強制的に作成するために使用できる設定があるはずです。

于 2012-01-29T00:14:27.010 に答える