3

「深度ピーリング」を実装するために、それぞれ rgba カラー テクスチャと深度テクスチャを備えた一連のフレームバッファに OpenGL シーンをレンダリングします。アンチエイリアシングを気にしない場合、これはうまく機能します。もしそうなら、正しいことはを有効にして、の代わりにGL_MULTISAMPLING使用することです。しかし、他のどの呼び出しを置き換える必要があるかについて混乱しています。GL_TEXTURE_2D_MULTISAMPLEGL_TEXTURE_2D

特に、フレームバッファの構造をどのように適応させて、glTexImage2DMultisample代わりに使用する必要がありglTexImage2Dますか?

の代わりにglFramebufferTexture2D使用を超えて呼び出しを変更する必要がありますか?GL_TEXTURE_2D_MULTISAMPLEGL_TEXTURE_2D

色と深度の両方をテクスチャにレンダリングする場合、 を呼び出す必要がありglRenderbufferStorageMultisampleますか?

最後に、glBlit*レンダリングするフレーム バッファのテクスチャを設定する以外に、何かする必要があることはありますか?

このトピックには多くの関連する質問がありますが、私が見つけた解決策のどれも、標準的なチュートリアルやこれらすべてをまとめた明確な例を示しているようには見えません。

4

1 に答える 1

1

テクスチャではなく、レンダ バッファを使用したマルチサンプリング FBO レンダリングのみを使用しましたが、以下は私の理解です。

の代わりにglFramebufferTexture2D使用を超えて呼び出しを変更する必要がありますか?GL_TEXTURE_2D_MULTISAMPLEGL_TEXTURE_2D

いいえ、それだけです。でテクスチャを作成し、 の 3 番目の引数としてglTexImage2DMultisample()を使用してアタッチします。唯一の制約は、レベル (5 番目の引数) が 0 でなければならないことです。GL_TEXTURE_2D_MULTISAMPLEglFramebufferTexture2D()

色と深度の両方をテクスチャにレンダリングする場合、 を呼び出す必要がありglRenderbufferStorageMultisampleますか?

はい。深度バッファを同じ FBO にアタッチする場合は、カラー バッファと同じサンプル数でマルチサンプリングされたレンダバッファを使用する必要があります。glRenderbufferStorageMultisample()したがって、カラー バッファに使用したのと同じサンプル カウントを渡して、深度レンダバッファを作成します。

最後に、glBlit*レンダリングするフレーム バッファのテクスチャを設定する以外に、何かする必要があることはありますか?

フレームバッファへのレンダリング用ではありません。レンダリングが完了したら、いくつかのオプションがあります。

  1. マルチサンプル テクスチャを通常のテクスチャにダウンサンプリング (解決) し、その後のレンダリングに通常のテクスチャを使用できます。マルチサンプル テクスチャを解決するglBlitFramebuffer()には、マルチサンプル テクスチャが にアタッチされているGL_READ_FRAMEBUFFERと、通常のテクスチャが にアタッチされている を使用できますGL_DRAW_FRAMEBUFFER

  2. 以降のレンダリングにマルチサンプル テクスチャを使用できます。sampler2DMS対応するサンプリング関数を使用して、シェーダー コードでサンプラーの型を使用する必要があります。

オプション 1 については、マルチサンプル テクスチャを使用する正当な理由がわかりません。マルチサンプル レンダー バッファーを使用することもできますが、これは少し使いやすく、少なくとも同じくらい効率的です。このために、カラー アタッチメント用のレンダ バッファを作成しglRenderbufferStorageMultisample()、デプス バッファに必要なものと非常によく似た で割り当てます。

于 2015-05-25T18:16:50.507 に答える