2012-02-12 2 views
6

멀티 샘플링 된 씬을 텍스처로 렌더링하려고합니다. 사용중인 코드는 다음과 같습니다. 검은 색 화면이 나옵니다. init의 마지막 부분에서 fbo의 완성도를 확인하고 두 fbo가 모두 완료되었다고보고합니다.FBO 블릿 팅이 작동하지 않습니다.

void init_rendered_FBO() { 
    glGenFramebuffers(1,&fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER, fbo); 
    glGenTextures(1,&fbo_tex); 
    glBindTexture(GL_TEXTURE_2D, fbo_tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width_screen, height_screen, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width_screen, height_screen); 
    glBindTexture (GL_TEXTURE_2D, 0); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_tex, 0); 
    int objectType; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,&objectType); 
    ASSERT(objectType == GL_TEXTURE); 
    int objectName; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,&objectName); 
    ASSERT(glIsTexture(objectName) == GL_TRUE); 
    int wid, hei, fmt; 
    glBindTexture(GL_TEXTURE_2D, objectName); 
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &wid); 
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &hei); 
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, 
      &fmt); 
    glBindTexture(GL_TEXTURE_2D, 0); 
    std::string format = convertInternalFormatToString(fmt); 
    std::cout << "Color attachment 0: " << objectName << " " << wid << "x" << hei << ", " << format << std::endl; 
    ASSERT(checkFramebufferStatus()); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

// this is the init function that gets called. 
void init_rendered_multisample_FBO() { 
    init_rendered_FBO(); 
    // now I'm going to set up the additional component necessary to perform multisampling which is a new fbo 
    // that has a multisampled color buffer attached. I won't need a multisample depth buffer. 
    glGenFramebuffers(1,&multi_fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER,multi_fbo); 
    glGenRenderbuffers(1,&renderbuffer_multi); 
    glBindRenderbuffer(GL_RENDERBUFFER,renderbuffer_multi); 
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA, width_screen,height_screen); 
    glBindRenderbuffer(GL_RENDERBUFFER,0); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer_multi); 
    int objectType; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,&objectType); 
    ASSERT(objectType == GL_RENDERBUFFER); 
    int objectName; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,&objectName); 
    ASSERT(glIsRenderbuffer(objectName) == GL_TRUE); 
    glBindRenderbuffer(GL_RENDERBUFFER,objectName); 
    int wid,hei,fmt,sam; 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_WIDTH,&wid); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_HEIGHT,&hei); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_INTERNAL_FORMAT,&fmt); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_SAMPLES,&sam); 
    glBindRenderbuffer(GL_RENDERBUFFER,0); 
    printf("Renderbuffer: %dx%d, fmt=%d, samples=%d\n",wid,hei,fmt,sam); 
    ASSERT(checkFramebufferStatus()); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 
// this is called after rendering to multi_fbo 
void resolve_multisample_FBO() { 
    glBindFramebuffer(GL_READ_FRAMEBUFFER, multi_fbo); 
    glReadBuffer(GL_COLOR_ATTACHMENT0); 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); 
    GLenum drawbuf = GL_COLOR_ATTACHMENT0; 
    glDrawBuffers(1,&drawbuf); 
    glBlitFramebuffer(0,0,width_screen,height_screen,0,0,width_screen,height_screen,GL_COLOR_BUFFER_BIT,GL_NEAREST); 
} 

내가 버린 것을 발견 할 수 있습니까? 문제는 glFramebufferRenderbuffer 전화와 관련이 있다고 생각합니다. 나는 첫 번째 인수를 GL_READ_FRAMEBUFFER으로 바꾸려고 시도했지만 수정하지는 못했습니다.

나는 glGetError을 확인하고 오류가 없습니다. 설치를 잘못하면 확실하게 뭔가 실패하고 문제의 범위를 좁히는 데 또는 INVALID_OPERATION을 알려줍니다.

이 코드를 사용하는 방법은 멀티 샘플링을 사용하려면 그림을 그릴 때 multi_fbo를 바인딩 한 다음 바인딩하고 blit 할 resolve 함수를 호출하는 것입니다. 그 후, 내 fbo 텍스처 (직접 렌더링 할 때 잘 동작합니다)에는 이제 다중 샘플 렌더링이 포함되어 있어야합니다. 그러나 그것은 단지 검은 색입니다. 또한 glEnable(GL_MULTISAMPLE)을 초기화 코드의 다른 부분으로 호출했습니다.

멀티 샘플링되지 않은 텍스처를 다른 텍스처로 블리팅하여 작동하는지 확인하려고합니다. 바라기를하면 내가 망쳐 놓은 곳을 좁히는 데 도움이 될 것입니다.

업데이트 : 따라서 일반 FBO를 다른 동일한 FBO (둘 다 색 첨부 0에 첨부 된 텍스처가 있음)로 복사하면 동일한 검은 색 화면이 나타납니다. 블리트는 단순히 작동하지 않습니다.

이상한 점은 일단 blit하려고하면 소스 fbo의 텍스처를 그립니다. 여전히 검은 색입니다. 마치 모든 것을 폐허처럼 만드는 것과 같습니다.

FBO 블리 팅 코드를 아는 사람이 있습니까? 아무도 찾을 수 없지만 사람들이 다중 샘플 FBO를 사용하고 있다는 것을 알고 있습니다. 여기

당신이 도움이 될 수 있습니다 방법은 다음과 같습니다 당신이 어떤 시점에서 glBlitFramebuffer를 호출하는 코드가 있다면, 내가 그 동작까지 설정을위한 다른 호출을보고 싶습니다. 일단 내가 그것을 호출하면 검은 버퍼와 텍스처를 얻지 못합니다.

업데이트 : 멀티 샘플링을 사용하는 경우에도 블러가 백 버퍼로 작동합니다! 물론 이것은 프레임 버퍼 0을 바인딩하기 때문에 전혀 설정이 필요하지 않습니다. 그래서 문제는 blitted되어야하는 텍스처 첨부 파일이있는 FBO를 설정하는 것 같습니다.

답변

4

글쎄, 프레임 버퍼 바인딩을 재설정하지 못하는 것 외에는 아무 것도하지 않았다. void resolve_multisample_FBO()의 끝에서

가 단순히 3 시간 낭비하는 glBindFramebuffer(GL_FRAMEBUFFER, 0);

끔찍한 방법이 필요, 난 당신을 확신합니다. 그러나 멀티 샘플링은 멋지게 보입니다.

관련 문제