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

이중 버퍼링이 깜박임을 줄이는 이유는 무엇입니까? –

+0

프레임 버퍼가 하나 뿐이고 렌더 타겟이 두 개 있습니다 (텍스처로). 이제 약간의 깜박임이 있습니다. 두 개의 프레임 버퍼 (각자 자신의 렌더 타겟을 얻음) - glBindFramebuffer로 프레임 버퍼 전환 - 깜박임이 없습니다. 그러나 필자가 읽은 여러 웹 사이트에서는 새로운 렌더링 타겟을 설정할 때 framebuffer를 전환하는 속도가 느리다는 내용의 글이 있습니다. –

+1

"나는 그것을 느꼈다"* 한숨 *. 조기에 최적화하지 마십시오. 먼저 측정하십시오. 또한 거의 모든 응용 프로그램이 이중 버퍼링을 사용합니다. –

답변

1

댓글에 더 적합 할 수 있지만 너무 커서 여기에 입력하겠습니다.

::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을 바인딩 할 때 활성 텍스처 슬롯을 설정 순전히 : 귀하는 OpenGL 의미는 다음 코드 세그먼트에서 조금 떨어져 것 같다 glFramebufferTexture2D는 glDrawBuffers와 함께 사용되어 쉐이더 프로그램의 목표 출력을 설정합니다. 따라서 glActiveTexture와 glFramebufferTexture2D는 동일한 그리기 작업 중에 동일한 텍스처에 사용되지 않아야합니다. (나는 이것이 당신의 깜박임을 일으키는 원인이라고 생각하지 않지만) 또한, 당신이 텍스처 핸들을 묶거나 풀어 놓는 곳을 보지 못했습니다. 객체가 필요할 때만 바인드하고 객체를 즉시 해제하는 것은 일반적으로 좋은 OpenGL 실습입니다. OpenGL은 상태 머신이기 때문에 객체를 놓치는 것을 잊어 버리고 실제로 큰 프로젝트에서 엉망으로 물을 수 있습니다.

glActiveTexture (또는 glActiveTexture 래퍼)를 사용하여 텍스처를 텍스처 슬롯에 바인딩 할 때 텍스처 핸들을 바인딩하기 전에 항상 glActiveTexture를 호출하십시오.

+0

thx 4 ur 답변. 그러나 하이 엔드 시스템에서 동일한 코드를 테스트했지만 아무런 문제가 없습니다. 그래서 제 생각에는 렌더 타겟을 전환하는 것이 전체 프레임 버퍼를 전환하는 것이 더 빠르지 않습니다. –