-
728x90
FBO(Framebuffer Object) 를 다른 FBO로 Blit 하는 방법입니다.
인터넷에서 FBO Blit 찾으면 그냥 glBlitFramebuffer 를 사용하라는 것을 처음에 접하게 됩니다.
근데 OpenGl 의 대부분 사용법이 그렇듯이 사용 차례를 잘 지키지 않으면 삽질 시작합니다.
glViewport 설정 : 이 부분에서 제일 삽질했습니다. 대부분 예제가 GL_READ_FRAMEBUFFER, GL_DRAW_FRAMEBUFFER 만 나와있고 Viewport 설정에 대해서는 별로 나와있질 않아서 2일 동안 삽질했네요 ㅠㅠ
dest framebuffer의 크기로 glViewport 설정
GL_READ_FRAMEBUFFER src FBO로 설정
GL_DRAW_FRAMEBUFFER dest FBO로 설정
glBlitFramebuffer 로 복사
GL_READ_FRAMEBUFFER 0으로 다시 해제
GL_DRAW_FRAMEBUFFER 0으로 다시 해제
원래 화면 크기로 glViewport 설정
위와 같은 차례로 해야합니다.
예제 소스
void OpenGlRenderTarget::blitColorTarget (RenderTarget* to_rt, int from_index, int to_index) { auto dst_rt = static_cast
(to_rt); glViewport(0, 0, dst_rt->width, dst_rt->height); glBindFramebuffer(GL_READ_FRAMEBUFFER, this->fbo); glReadBuffer(GL_COLOR_ATTACHMENT0 + from_index); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dst_rt->fbo); GLenum attachments[1] = { static_cast (GL_COLOR_ATTACHMENT0 + to_index) }; glDrawBuffers(1, attachments); glBlitFramebuffer( 0, 0, this->width, this->height, 0, 0, dst_rt->width, dst_rt->height, GL_COLOR_BUFFER_BIT, GL_LINEAR); glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); } 위 소스에서는 Viewport 를 원래대로 돌리는 코드가 없지만 엔진의 다른 부분에서
glBindFramebuffer(GL_FRAMEBUFFER, 0); 이후에 설정하는 코드가 있습니다~
끗
728x90