2016-12-28 12 views
2

Мне нужна свежая пара глаз. Работая над переписыванием моего движка, я наткнулся на эту проблему, написав путь отложенного рендеринга. Фреймбуфер отображается только в том случае, если я не использую вложение глубины, что означает, что рендеринг неисправен, но если я это сделаю, все выходы пустые. Я написал много графики обработки классов, но я сломалась код здесь:OpenGL: Глубина вложения Разрывы Framebuffer

Инициализационные:

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++; 

Затем я создаю глубины Attachment:

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); 

EDIT 2: Забыл последний бит FBO:

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); 

Наконец, мой рисунок (все расчеты геометрии шейдеров происходит до этого):

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(); 

Обратите внимание, что мой код намного более объектно-ориентированным, чем это, и я должен был взять много этого кода из контекста. Мой вопрос заключается в том, почему привязка приложения глубины к фреймбуферу приводит к тому, что фреймбуфер пуст, а его удаление работает, и как его исправить?

EDIT: Я знаю, что это не рендеринг, я только что назвал текстуру глубины, потому что она ИСПОЛЬЗУЛАСЬ быть рендерирующим буфером, и я забыл изменить имя.

ответ

2

Если у вас нет буфера глубины, каждый фрагмент автоматически пройдет тест глубины. Теперь, после добавления буфера глубины, проверка глубины будет эффективной (при условии, что вы включили ее). Тем не менее, лет забыл очистить буфер глубины:

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

вас ясный цвет и глубина буфера фреймбуффера по умолчанию (или другой FBO, то, что связано в то время), но не глубину буфера fbo здесь ...

Существует высокая вероятность того, что текстура глубины изначально всех нулей. С стандартными соглашениями по глубине это означает, что это уже ближайшее значение, поэтому тест глубины, скорее всего, не удастся для всего, что вы рисуете.