ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Blit FBO
    카테고리 없음 2017. 8. 11. 23:41
    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

    댓글

Designed by Tistory.