0

しばらくの間、ディファード シェーディング/レンダリングをエンジンに実装しようとしてきましたが、実際にその最終成果物を見ることができませんでした。

問題がどこにあるのかをテストするために、glBlitFramebuffer() コマンドを使用して、ターゲット FBO が実際にデフォルト FBO との間で読み取られているかどうかを確認する実験を考案しました。

デフォルトの FBO 自体がクリアされる前に、クリア カラーがblackに設定され、ターゲット FBO がクリアされる前に、クリア カラーがredに設定されるようにしました。

その結果、シーンをレンダリングすると、黒しか見えなくなります。

私の質問はこれです:

1 つの fbo が read_framebuffer に設定され、デフォルトが draw_framebuffer に設定されている場合、「glBlitFramebuffer」操作中に「クリアカラー」ピクセルもコピーされますか?

いいえの場合、その色はとにかくコピーされないため、ターゲット FBO が実際にレンダリングされているかどうかはわかりません。

はいの場合、赤色が表示されているはずで、FBO の設定の何が問題なのかわかりません...


前に述べたように、私はディファード シェーディング システムに取り組もうとしています。そのシステムでは、すべての操作を FBO で実行し、その全体をデフォルトの FBO に戻す必要がありました。

うまくいかなかったので、基本的なシーンをデフォルトの FBO に直接レンダリングする (動作する) か、ターゲット FBO にレンダリングし、手順に従ってその FBO をデフォルトの FBO にコピーする手順を簡略化しました (これは機能しません)。

私が使用しようとしているフレーム バッファの設定は、私が従ってきたチュートリアルと同じです。

glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
glGenTextures(1, &m_finalTexture);
glBindTexture(GL_TEXTURE_2D, m_finalTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WindowWidth, WindowHeight, 0, GL_RGB, GL_FLOAT, NULL);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT4, GL_TEXTURE_2D, m_finalTexture, 0);

そして、私は自分のシーンを次のようにレンダリングします (簡略化):

//Flush content out of fbo at color attachment 4
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
glDrawBuffer(GL_COLOR_ATTACHMENT4);
glClear(GL_COLOR_BUFFER_BIT);

//Render scene to m_fbo 
RenderPass();

//Swap default FBO back ("0"), read from target fbo (m_fbo)
//Draw target fbo onto default fbo
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo);
glDrawBuffer(GL_COLOR_ATTACHMENT4);
glReadBuffer(GL_COLOR_ATTACHMENT4);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);

すべてのステップでフレーム バッファのステータスを確認しましたが、エラーは発生しませんでした。


私は実際の問題を発見しました。完全に理解できたら、この投稿を更新して詳細情報を追加します。

4

2 に答える 2