27

FBO のマルチサンプリングと alpha-to-coverage を有効にしようとしています。glEnable(GL_MULTISAMPLE)デフォルトのフレームバッファを使用して、必要なのはandを呼び出すことだけですglEnable(GL_SAMPLE_ALPHA_TO_COVERAGE)。しかし、私自身の FBO を使用して同じ効果を達成することはできません。

私の目標:上記のプロパティでデフォルトのフレームバッファに描画されるのと同じ方法で、シーンを FBO に描画します。そこから、シェーダーを通過する将来のパスのテクスチャとしてイメージを使用できるようにしたいと考えています。

これは機能します: マルチサンプリング/アルファからカバレッジ、1 つのカラー アタッチメント、1 つの深度アタッチメントなしで FBO を作成するためのコード:

// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,defaultColorAttachment0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,screenWidth,screenHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);

// Bind the texture to the FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, defaultColorAttachment0,0);

// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer);

これはうまくいきません。マルチサンプリング FBO を作成しようとするコード:

// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, defaultColorAttachment0);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, screenWidth, screenHeight, GL_FALSE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, defaultColorAttachment0,0);

// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer);

これについて OpenGL wiki を調べてみましたが、不完全ですが (さまざまな未完成の見出しがあり、専門的ではないように見えます)。glGetError決して文句を言いません。私はこれをいじってみましたが、黒い画面またはゴミのピクセルでいっぱいの画面が表示されます。

主な質問:マルチサンプリングとアルファ ツー カバレッジを FBO で動作させるには、どのようなことを考慮/変更する必要がありますか?また、FBO の作成、テクスチャ、シェーダー)

4

2 に答える 2

28

これを正しく機能させるには、マルチサンプリングされた深度バッファーを割り当て、カラー バッファーと同じ数のサンプルを与える必要があります。glRenderbufferStorageMultisample (...)つまり、 の代わりに呼び出す必要がありますglRenderbufferStorage (...)

あなたの FBO は、現在割り当てられている方法で完全性チェックに失敗しているはずです。深度バッファには正確に1 つのサンプルがあり、カラー バッファ アタッチメントには4があるため、呼び出しはglCheckFramebufferStatus (...)返されるべきです。GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE


この FBO ではマルチサンプル テクスチャ アタッチメントも使用しているため、単一サンプル テクスチャのサンプリングと GLSL シェーダーでのマルチサンプル テクスチャのサンプリングの違いに注意する必要があります。

マルチサンプリングテクスチャには特別なサンプラ ユニフォーム タイプ (など sampler2DMS) があり、 を使用して整数 (正規化されていない) テクセル座標とサンプル インデックスによって、テクスチャ内の各サンプルを明示的にフェッチする必要がありますtexelFetch (...)。これは、フィルター処理やミップ マップができないことも意味します。

この場合、おそらくマルチサンプル テクスチャは必要なくglBlitFramebuffer (...)、MSAA を単一サンプル FBO に解決するために使用したいと思うでしょう。代わりにこれを行うと、各サンプルをフェッチしてアンチエイリアスを自分で実装する必要なく、シェーダーでアンチエイリアスされた結果を読み取ることができます。

于 2013-12-10T08:12:32.810 に答える