멀티 샘플링 된 씬을 텍스처로 렌더링하려고합니다. 사용중인 코드는 다음과 같습니다. 검은 색 화면이 나옵니다. 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를 설정하는 것 같습니다.