1

OpenGL で複数のレンダリング ターゲットを使用する場合、明示的なマルチサンプリングを使用すると問題が発生します。

最初のジオメトリ パス中にレンダリングされる 4 つのレンダー ターゲット (位置、拡散 + 不透明度、法線、鏡面反射 + 指数) があります。

これらはすべて、フレームバッファ オブジェクトにアタッチされた非マルチサンプリング テクスチャであり、glDrawBuffers() を使用してレンダー ターゲットとして設定されます。これは問題なく動作し、後でこれらのテクスチャをサンプリングして、ライティングの計算に必要な情報を取得できます。素晴らしい。

マルチサンプル テクスチャなし。 MRT は正常に動作します。

取得しているエイリアシングの一部を削除したいので、マルチサンプル テクスチャを使用して明示的な MSAA の実装を開始しました。ただし、代わりにマルチサンプル テクスチャをレンダー ターゲットとして使用すると、最初のレンダー ターゲットのみが描画され、残りは空白のままになります。

マルチサンプリングされたテクスチャを使用。 最初のドローバッファにのみレンダリングされます。

シェーダーでのテクスチャのセットアップ、バインド、読み取りの方法を変更する以外は、他のコードは変更していません。

マルチサンプリングされたテクスチャは、次のコードを使用してフレーム バッファ オブジェクトにアタッチされます。

for (unsigned int i = 0; i < textureCount; ++i)
{
    // Generate texture
    GLuint texture;
    glGenTextures(1, &texture);    

    // Bind multisample texture
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
    glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, msaaSamples, GL_RGBA, width, height, false);

    // Set params
    glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    // Attach to frame buffer
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D_MULTISAMPLE, texture, 0);

    // Unbind
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
}

マルチサンプリングされた深度/ステンシル テクスチャも添付されます。

glGenTextures(1, &depth);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depth);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, msaaSamples, GL_DEPTH24_STENCIL8, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depth, 0);

次に、フレームバッファがバインドされ、描画バッファが設定されます

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLuint attachments[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
glDrawBuffers(4,  attachments);

次に、通常どおりジオメトリを描画します。ただし、apitrace で検査すると、最初の色のアタッチメントだけが引き込まれていることが明らかです。これは、通常の (マルチサンプリングされていない) テクスチャを使用する場合には当てはまりません。

ただし、4 つの描画バッファはすべて、まだ確実に設定されています。

4 つの描画バッファ セット。

4

1 に答える 1

0

glTexParameterf は GL_TEXTURE_2D_MULTISAMPLE では使用できません。

これとは別に、ハードウェアの互換性に関して安全を確保するために、glTexImage2DMultisample の 'fixedsamplelocations'-param を true に設定します。

そして、GL_RGBA の代わりに GL_RGBA8 のようなサイズのフォーマットを使用することをお勧めします (サイズのない GL_RGBA 列挙型を使用して最初の画像にリストされているように、GL_RGBA32F を取得する方法がわかりません...)。

于 2015-10-11T16:07:43.210 に答える