什么更快? glFramebufferTexture2D输出闪烁

时间:2013-03-05 15:20:20

标签: opengl blur gaussian post-processing

在我的程序中我正在使用glFramebufferTexture2D来设置目标。但如果我使用它,输出开始闪烁。如果我使用两个帧缓冲区,输出看起来很正常。

有没有人知道为什么会发生这种情况或者在以下源代码中哪些更好? - 这是一个例子,一些不相关的代码不在里面。

// 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);
编辑:我发现了问题!它在我的交换链中。我已经渲染了原始图片,之后是黑色图片。如果帧率下降,我会得到一个闪烁。

1 个答案:

答案 0 :(得分: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。