2013-03-05 84 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