OpenGL で複数のレンダリング ターゲットを使用する場合、明示的なマルチサンプリングを使用すると問題が発生します。
最初のジオメトリ パス中にレンダリングされる 4 つのレンダー ターゲット (位置、拡散 + 不透明度、法線、鏡面反射 + 指数) があります。
これらはすべて、フレームバッファ オブジェクトにアタッチされた非マルチサンプリング テクスチャであり、glDrawBuffers() を使用してレンダー ターゲットとして設定されます。これは問題なく動作し、後でこれらのテクスチャをサンプリングして、ライティングの計算に必要な情報を取得できます。素晴らしい。
取得しているエイリアシングの一部を削除したいので、マルチサンプル テクスチャを使用して明示的な 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 つの描画バッファはすべて、まだ確実に設定されています。