2013-03-05 223 views
0

我的程序中我正在使用glFramebufferTexture2D来设置目标。但是如果我使用它,输出开始闪烁。如果我使用两个帧缓冲区,输出看起来很正常。什么是更快? 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); 

编辑:我发现了问题!它在我的交换链中。我已经呈现了原始图片,然后是黑色的。所以如果帧频下降,我会闪烁。

+0

你问为什么双缓冲减少闪烁? – 2013-03-05 15:22:11

+0

我只有一个帧缓冲区和两个渲染目标(作为纹理)。现在我有一些闪烁。两个帧缓冲区(每个都有自己的渲染目标) - 用glBindFramebuffer切换帧缓冲区 - 我没有闪烁。但是在我读过的几个网站上,写道,切换帧缓存比设置新的rendertarget要慢。 – 2013-03-05 15:29:46

+1

“我读过它比较慢”*叹*。不要过早地优化。先量一下。而且,几乎每个应用程序都使用双缓冲。 – 2013-03-05 15:34:13

回答

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包装器)仅仅是为了在着色器程序结合的纹理输入到采样器时设置活动纹理槽,并且glFramebufferTexture2D与glDrawBuffers结合使用来设置着色器程序的目标输出。因此,glActiveTexture和glFramebufferTexture2D可能不应该在相同的绘制操作中使用相同的纹理。 (虽然我不认为这是什么导致你的闪烁)另外,我没有看到你绑定/释放你的纹理句柄。一般来说,OpenGL的做法通常只在需要时绑定对象,并在之后立即释放它们。由于OpenGL是一个状态机,忘记释放对象可以真正来到你的大型项目中。

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

+0

thx 4你的答案。但是我已经在高端系统上测试过相同的代码,并且没有问题。所以在我看来,切换渲染目标不会更快,然后切换整个帧缓冲区。 – 2013-03-07 08:14:33