2012-01-28 12 views
0

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

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

このプロセスが正常に動作し、アンチエイリアシングが暗すぎる除いて、それはほとんど暗いアウトラインのようになります。私はこれがダウンして代わりにリニアカラースペースを使用することにした発見されたいくつかの研究を行った後

Bad blending

sRGB(hereおよびhere)。そこで私はFBOのblittingにGL_FRAMEBUFFER_SRGBを有効にし、すべてのFBOのテクスチャターゲット内部タイプをGL_SRGB8_ALPHA8に設定し、シェーダのブレンド計算の前にsRGB-> Linearを実行しました。

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

GL_FRAMEBUFFER_SRGB状態を有効にするための操作の順序を説明する人物、blittingが色空間に影響を与える場合、アンチ・エイリアシングが正しく見えるようにするためにはどのFBOがsRGBにある必要があるのですか?あるいは、私は完全に間違っていますか?それは、これらのマルチサンプリング・アーティファクトを引き起こしているものですか?

答えて

1

だから私は、私のFBOのブリッティングのためのGL_FRAMEBUFFER_SRGBを有効にGL_SRGB8_ALPHA8に私のすべてのFBOsに対するテクスチャ目標内部タイプを設定し、(そして再び、最終的な出力の前に)私のシェーダの配合計算する前にsRGB->リニアを行いました。

これは最終ステップまで直感しました。

image format that uses the sRGB colorspaceは、テクスチャは、線形色空間へのsRGB色空間から自動的に変換されますそのテクスチャからアクセスすることを意味します。これは、テクスチャからテクセルをフェッチするときに単独で発生します。それは無料です。ですから、 "sRGB-> Linear"計算を一切行う必要はありません。 sRGBの色空間を使用して画像をレンダリングするときにGL_FRAMEBUFFER_SRGBを有効にしている。同様に

は、あなたがそのイメージに書き込むリニアであると想定されている値。 GL_FRAMEBUFFER_SRGBを有効にすることで、OpenGLに何を指示するかは、書き込む線形値をsRGB色空間値に変換することです。これはやはり無料です。です。ブレンドとアンチエイリアスでうまく動作します。もう一度、手動で変換する必要はありません。

本当に、あなたがする必要があるのは、適切なリニアカラーパイプラインを確保することです。 sRGBカラースペースで作成されたテクスチャは、sRGBカラースペースのイメージフォーマットを使用する必要があります。これにより、シェーダ内の値が線形であることが保証され、照明演算が実際に機能します。カラー値を書き込むときは、GL_FRAMEBUFFER_SRGBを有効にしてsRGBカラースペースフレームバッファに書き込む必要があります。これにより、シェーダーから書き込む線形値が表示用に適切にsRGBに変換されます。

ディスプレイもsRGBイメージであることを確認する必要があります。私はQt OpenGLコンテキストの初期化については何も知らないが、ここ4年ほどOpenGLを無視していない限り、sRGB colorspaceバッファを持つコンテキストを作成するために使用できる設定がいくつかあるはずです。

+0

あなたは本当に正しいです、私はより密接に、あなたが言ったことを述べているはずです。しかし、それはQtがビューポートのためのバッファストレージタイプを述べる能力を与えないように思われます - それは印象的ではありません。それだけでなく、Qtはそれぞれ異なる状態のコンポーネントをレンダリングしていますが、これは異なるSOの質問です...最後に、シェーダの出力を 'GL_FRAMEBUFFER_SRGB'を持たないバッファにレンダリングしようとすると、明るすぎたり暗すぎたりしますか? – cmannett85

+0

@ cbamber85:シェーダーが線形値を書き込んでsRGBとして保存するとしたら、それは間違っています。シェーダが何を期待しているのか、それはすべてです。 –

関連する問題