0

GL_TEXTURE_2D_MULTISAMPLE を使用する場合、フレームバッファ オブジェクトに深度バッファをアタッチするにはどうすればよいですか。glCheckFramebufferStatus(msaa_fbo)以下のコードからは 0 を返します。ドキュメントから、これは msaa_fba がフレームバッファではなく、から作成されていることを意味しているようですglGenFramebuffers(1, &msaa_fbo);

また、エラーが発生した場合はゼロが返されます。GL_INVALID_ENUM は、ターゲットが GL_DRAW_FRAMEBUFFER、GL_READ_FRAMEBUFFER、または GL_FRAMEBUFFER でない場合に生成されます。

エラーは 1280 で、これは GL_INVALID_ENUM を意味すると思います。

深度バッファーの添付ファイルを削除すると、プログラムが実行されてレンダリングされます (ただし、深度テストはありません)。その後、実行してもエラーは引き続き発生します。深度アタッチメントが含まれていると、フレームごとにエラー (1286) が発生します。これは INVALID_FRAMEBUFFER です。ここから先の続きがわかりません。私が見たいくつかの例は、多少同じですが、うまくいくようです。

glGenTextures(1, &render_target_texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, render_target_texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, GL_RGBA8, width, height, false);

glGenFramebuffers(1, &msaa_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, msaa_fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, render_target_texture, 0);

glGenRenderbuffers(1, &depth_render_buffer);
glBindRenderbuffer(GL_RENDERBUFFER, depth_render_buffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, NUM_SAMPLES, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_render_buffer);

GLenum status = glCheckFramebufferStatus(msaa_fbo);

ほとんどのコードはthisからのものです。

編集

ステータスチェックが間違っていましたGLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);。深さを含めなくてもエラーは発生しません。深さを含めると、次のエラーが表示されます: GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE.

編集2

ドキュメントによると、これは GL_TEXTURE_SAMPLES と GL_RENDERBUFFER:SAMPLES が一致しない場合に発生します。

GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE は、GL_RENDERBUFFER_SAMPLES の値がアタッチされたすべてのレンダーバッファーで同じでない場合に返されます。GL_TEXTURE_SAMPLES の値がすべてのアタッチされたテクスチャで同じでない場合; または、添付された画像がレンダーバッファとテクスチャの混合である場合、GL_RENDERBUFFER_SAMPLES の値は GL_TEXTURE_SAMPLES の値と一致しません。

しかし、彼らはそうします!

私は次のようにそれらをテストしました:

std::cout << "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" << std::endl;
GLsizei gts, grs;
glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_SAMPLES, &gts);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &grs);
std::cout << "GL_TEXTURE_SAMPLES: " << gts << std::endl;
std::cout << "GL_RENDERBUFFER_SAMPLES: " << grs << std::endl;

出力は次のとおりです。

GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
GL_TEXTURE_SAMPLES: 8
GL_RENDERBUFFER_SAMPLES: 8

編集3

次のように、テクスチャとレンダバッファの代わりに 2 つのテクスチャを使用することで、この問題を回避しました。

glGenFramebuffers(1, &msaa_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, msaa_fbo);

glGenTextures(1, &render_texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, render_texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, GL_RGBA8, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, render_texture, 0);

glGenTextures(1, &depth_texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depth_texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, GL_DEPTH_COMPONENT, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depth_texture, 0);

私はまだ元の実装の何が問題だったのかに興味があるので、質問はまだ残っています.

4

1 に答える 1

2

テクスチャをレンダー バッファと混合する場合は、テクスチャの固定サンプル位置を使用する必要があります。仕様から、セクション「フレームバッファの完全性」で:

TEXTURE_FIXED_SAMPLE_LOCATIONS の値は、アタッチされたすべてのテクスチャで同じです。また、アタッチされたイメージがレンダー バッファーとテクスチャの混合である場合、TEXTURE_FIXED_SAMPLE_LOCATIONS の値は、アタッチされたすべてのテクスチャに対して TRUE でなければなりません。

{FRAMEBUFFER_INCOMPLETE_MULTISAMPLE}

このエラー状態を回避するには、テクスチャ ストレージをセットアップするための呼び出しを次のように変更する必要があります。

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,
    NUM_SAMPLES, GL_RGBA8, width, height, GL_TRUE);
于 2015-11-08T03:38:00.857 に答える