2016-12-28 3 views
2

신선한 쌍안경이 필요합니다. 내 엔진을 다시 쓰는 동안 Deferred Rendering 경로를 쓰면서이 문제를 발견했습니다. 프레임 버퍼는 깊이 첨부를 사용하지 않는 경우에만 표시됩니다. 즉, 렌더링이 잘못되었음을 의미하지만, 그렇게하면 모든 출력이 비어 있습니다. 나는 수업을 처리하는 그래픽을 많이 쓴하지만 난 여기에 코드 고장 :OpenGL : 깊이 부착이 프레임 버퍼를 끊습니다

초기화 :

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 
glEnable(GL_CULL_FACE); 
glClearColor(0, 0, 0, 1); 
glViewport(0, 0, 1024, 768); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
ShaderPreparation(); 

numBuffer = 3; 
glGenFramebuffers(1, &fbo); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); 
numBuffers = numBuffer; 
targetBuffer = 0; 
textures = new unsigned int[numBuffers]; 
glGenTextures(numBuffers, textures); 

이 완료 세 번 : 다음

glBindTexture(GL_TEXTURE_2D, textures[targetBuffer]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, colorType, width, height, 0, colorFormat, colorDataType, NULL); 
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + targetBuffer, GL_TEXTURE_2D, textures[targetBuffer], 0); 
targetBuffer++; 

내가 깊이 첨부 파일을 만듭니다

glGenTextures(1, &renderBuffer); 
glBindTexture(GL_TEXTURE_2D, renderBuffer); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); 
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, renderBuffer, 0); 

편집 2 : FBO의 마지막 비트 분실 :

내 코드는이보다 지향 더 많은 개체가

geometryShader->Use(); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); 
graphicsWrapper->render(Geometry); 

int val[3] = { 0,1,2 }; 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
deferredShader->Use(); 

glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, textures[0]); 
glActiveTexture(GL_TEXTURE0 + 1); 
glBindTexture(GL_TEXTURE_2D, textures[1]); 
glActiveTexture(GL_TEXTURE0 + 2); 
glBindTexture(GL_TEXTURE_2D, textures[2]); 

// I use this system so it's compatible with Uniform Buffer 
//  Objects and the rendering code of other graphics languages 
deferredShader->PassData(&val); 
deferredShader->SetInteger(); 
deferredShader->SetInteger(); 
deferredShader->SetInteger(); 

glClear(GL_COLOR_BUFFER_BIT); 

vaoQuad->Bind(); 
graphicsWrapper->DrawVertexArray(4); 
vaoQuad->Unbind(); 

주, 나는이 코드를 많이 걸릴했다 : 617,451,515,

GLenum *DrawBuffers = new GLenum[numBuffers]; 
for (size_t i = 0; i < numBuffers; i++) 
    DrawBuffers[i] = GL_COLOR_ATTACHMENT0 + i; 

glDrawBuffers(numBuffers, DrawBuffers); 

// Report errors 
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
if (status != GL_FRAMEBUFFER_COMPLETE) { 
    fprintf(stderr, "Framebuffer Error. Status 0x%x\n", status); 
} 

// Unbind 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 

마지막으로, 내 그림은 (지오메트리 쉐이더에 대한 모든 계산이되기 전에 발생) 문맥에서. 내 질문은 프레임 버퍼에 깊이 첨부 파일을 첨부하면 프레임 버퍼가 공백이되는 반면 작동하지 않는 이유는 무엇이며 어떻게 수정합니까?

편집 : 렌더 버퍼가 아니라는 것을 알고 있습니다. 렌더 버퍼로 사용 되었기 때문에 깊이 텍스처를 호출 했으므로 이름을 변경하는 것을 잊었습니다.

답변

2

깊이 버퍼가없는 경우 모든 조각이 자동으로 깊이 테스트를 통과합니다. 이제 깊이 버퍼를 추가 한 후 깊이 테스트가 효과적입니다 (사용하도록 설정했다고 가정). 의

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); 

당신은 분명 기본 프레임 버퍼의 색상과 깊이 버퍼 (또는 그 시간에 바인딩 다른 FBO, 그것은),하지만 깊이 버퍼 그러나, 요는 깊이 버퍼를 취소하는 것을 잊었다 fbo 여기 ...

처음에는 깊이 텍스처가 모두 0 일 가능성이 높습니다. 기본 깊이 규칙을 사용하면이 값이 이미 가장 가까운 값이므로 깊이 테스트는 사용자가 그릴 때마다 실패 할 가능성이 높습니다.

관련 문제