4

28byteslater.com から、遅延シェーディングの MSAA に関するこのチュートリアルを読んでいました。

明示的なマルチサンプリングでは、特定のサンプルにアクセスできると言っています。

GL_TEXTURE_2D_MULTISAMPLEたとえば、バインドされた通常のテクスチャから同じことを行うことはできませんか?

これは、(明示的なマルチサンプリングを使用せずに) 個々のサンプルにアクセスするために以前に使用したシェーダー コードです。

uniform sampler2DMS Diffuse;

ivec2 Texcoord          = ivec2(textureSize(Diffuse) * In.Texcoord);
vec4  colorFirstSample  = texelFetch(Diffuse, Texcoord, 0);
vec4  colorSecondSample = texelFetch(Diffuse, Texcoord, 1);
vec4  colorThirdSample  = texelFetch(Diffuse, Texcoord, 2);

明示的なマルチサンプリングで異なると思われる唯一のことは、それらがtexelFetchRenderbuffer()シェーダーで使用されており、テクスチャが にバインドされていることGL_TEXTURE_RENDERBUFFER_NVです。さらに、正しく覚えていれば、シェーダーで RenderBuffer を使用することはできませんが、今では使用できますか?

4

1 に答える 1

7

あなたは少し混乱していると思います。OpenGL 3.2 / DirectX 10 が登場する前は、マルチサンプル アンチエイリアシング (MSAA) を実行する唯一の方法は、マルチサンプル バッファーをブリットし、「解決」 (複数のサンプルを文字通り単一のサンプルに解決するプロセス) を実行させることでした。通常の出力)。これは、ほぼすべてのマルチサンプリングも有効でした。シェーダーで明示的に使用することはできませんでした。

GL3.2 / DX10 では、マルチサンプル テクスチャの形式で、「明示的な」(プログラム可能な) マルチサンプル解決が導入されました。シェーダ内の個々のサンプルにアクセスするには、 を使用しtexelFetch (...)ます。この新しい機能により、MSAA をディファード シェーディング エンジンに実装できるようになりました。これは、ライティング シェーダーがフェッチ時に G バッファーをマルチサンプル解決できるようになったためです。この新機能は、ステンシル ルーティング A-バッファリングと呼ばれる手法によるアンチエイリアシングや順序に依存しない透過性に関係のないものにマルチサンプル バッファーを使用する可能性も開きました。

つまり、DX10 クラスのハードウェアでは、マルチサンプル バッファーをテクスチャとして機能させることができます。これは、マルチサンプル フェッチを公開するために、HLSL や GLSL などの既存のシェーディング言語をほとんど変更する必要がないことを意味します。ミップマップやフィルタリングなどの特定のものを犠牲にしますが、そうしたい場合は実際にそれらを自分で実装できます。ただし、DX10 に欠けていたものの 1 つは、マルチサンプル深度テクスチャのサポートでした。DX10.1 でこれが追加されました。

OpenGL 3.2 より前は、マルチサンプル テクスチャリングを可能にするベンダー固有の拡張機能 (例: NV_explicit_multisample) がありました。これは、ハードウェアが 2007 年 (DX10 のリリース) からサポートしていたためです。OpenGL 3.2 の実装では、ベンダー固有のものを無視して、単にARB_texture_multisample.

于 2013-10-19T05:16:40.587 に答える