0

プログラム内では、glFramebufferTexture2Dを使用してターゲットを設定しています。しかし、それを使用すると、出力がちらつき始めます。2つのフレームバッファを使用すると、出力は非常に正常に見えます。

なぜそれが起こるのか、または次のソースコード内で何がより良くなるのか誰かが考えていますか?-これは例であり、関連性のないコードが含まれていません。

// bind framebuffer for post process
::glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_SwapBuffer);

::glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_SwapBufferTargets[SwapBufferTarget1]->m_NativeTextureHandle, 0);

unsigned int DrawAttachments = { GL_COLOR_ATTACHMENT0 };

::glDrawBuffers(1, &DrawAttachments);

...

// render gaussian blur
m_Shader->Use();

::glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_BlurredImageFromPass1->m_NativeTextureHandle, 0);
_InputTexturePtr->ActivateTexture(GL_TEXTURE0);
RenderMesh();

::glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _TargetTexturePtr->m_NativeTextureHandle, 0);
m_BlurredImageFromPass1->ActivateTexture(GL_TEXTURE0);
RenderMesh();

...

// copy swap buffer to system buffer
::glBindFramebuffer(GL_READ_FRAMEBUFFER, m_SwapBuffer);

::glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

::glBlitFramebuffer(0, 0, m_pConfig->m_Width, m_pConfig->m_Height, 0, 0, m_pConfig->m_Width, m_pConfig->m_Height, GL_COLOR_BUFFER_BIT, GL_NEAREST);

編集:私は問題を見つけました!それは私のスワップチェーンの中にありました。元の画像をレンダリングし、その後、黒い画像をレンダリングしました。そのため、フレームレートが低下するとちらつきが発生します。

4

1 に答える 1

1

これはおそらくコメントに適していますが、大きすぎるので、ここに入れます。次のコード セグメントでは、OpenGL のセマンティクスが少しずれているようです。

::glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_BlurredImageFromPass1->m_NativeTextureHandle, 0);
_InputTexturePtr->ActivateTexture(GL_TEXTURE0);
RenderMesh();

::glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _TargetTexturePtr->m_NativeTextureHandle, 0);
m_BlurredImageFromPass1->ActivateTexture(GL_TEXTURE0);
RenderMesh();

glActiveTexture (したがって、ActivateTexture ラッパー) は純粋に、テクスチャ INPUT をシェーダー プログラムのサンプラーにバインドするときにアクティブ テクスチャ スロットを設定するためのものであり、glFramebufferTexture2D は glDrawBuffers と組み合わせて使用​​され、シェーダー プログラムのターゲット OUTPUTS を設定します。したがって、glActiveTexture と glFramebufferTexture2D は、同じ描画操作中に同じテクスチャで使用しないでください。(これがちらつきの原因だとは思いませんが)さらに、テクスチャハンドルをバインド/解放する場所がわかりません。一般に、必要なときにのみオブジェクトをバインドし、その直後にオブジェクトを解放することは、OpenGL の適切な実践方法です。OpenGL はステート マシンであるため、オブジェクトのリリースを忘れると、大規模なプロジェクトでは大変なことになります。

さらに、glActiveTexture (または任意の glActiveTexture ラッパー) を使用してテクスチャをテクスチャ スロットにバインドするときは、テクスチャ ハンドルをバインドする前に必ず glActiveTexture を呼び出します。

于 2013-03-05T16:26:05.867 に答える