0

在我的程序中,我使用 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);

编辑:我发现了问题!它在我的交换链中。我已经渲染了原始图片,然后是黑色的。因此,如果帧速率下降,我会闪烁。

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 结合使用以设置着色器程序的目标输出。因此,glActiveTexture 和 glFramebufferTexture2D 可能不应该在同一绘制操作期间用于同一纹理。(尽管我认为这不是导致闪烁的原因)此外,我看不到您绑定/释放纹理句柄的位置。OpenGL 的做法通常是只在需要时绑定对象并在之后立即释放它们。由于 OpenGL 是一个状态机,忘记释放对象真的会在大型项目中咬你一口。

此外,当您使用 glActiveTexture(或任何 glActiveTexture 包装器)将纹理绑定到纹理槽时,始终在绑定纹理句柄之前调用 glActiveTexture。

于 2013-03-05T16:26:05.867 回答