我正在尝试在引擎中实现延迟渲染,但是遇到了一些问题。
看起来在绘制的三角形中有些静态。

这是绘图代码:

    // GEOMETRY PASS

    gbuffer->BindForWriting(); // glBind(GL_DRAW_FRAMEBUFFER, fbo);
    window->Clear(); // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnable(GL_DEPTH_TEST); // Before it was glDisable(GL_DEPTH_TEST); (I was testing)

    ... // Render all objects (they are rendering well when not using deferred rendering)

    // LIGHTING PASS

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    window->Clear(); // Clear buffer again (same thing above)

    gbuffer->BindForReading(); // glBind(GL_READ_FRAMEBUFFER, fbo);

    GLsizei HalfWidth = (GLsizei)(window->GetSize().x / 2.0f);
    GLsizei HalfHeight = (GLsizei)(window->GetSize().y / 2.0f); // Get half the size of the window

    gbuffer->SetReadBuffer(GBUFFER_POSITION); // glReadBuffer(GL_COLOR_ATTACHMENT0);
    glBlitFramebuffer(0, 0, window->GetSize().x, window->GetSize().y, 0, 0, HalfWidth, HalfHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);

    gbuffer->SetReadBuffer(GBUFFER_DIFFUSE); // glReadBuffer(GL_COLOR_ATTACHMENT1);
    glBlitFramebuffer(0, 0, window->GetSize().x, window->GetSize().y, 0, HalfHeight, HalfWidth, window->GetSize().y, GL_COLOR_BUFFER_BIT, GL_LINEAR);

    gbuffer->SetReadBuffer(GBUFFER_NORMAL); // glReadBuffer(GL_COLOR_ATTACHMENT2);
    glBlitFramebuffer(0, 0, window->GetSize().x, window->GetSize().y, HalfWidth, HalfHeight, window->GetSize().x, window->GetSize().y, GL_COLOR_BUFFER_BIT, GL_LINEAR);

    gbuffer->SetReadBuffer(GBUFFER_TEXCOORD); // glReadBuffer(GL_COLOR_ATTACHMENT3);
    glBlitFramebuffer(0, 0, window->GetSize().x, window->GetSize().y, HalfWidth, 0, window->GetSize().x, HalfHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);

(左为弥散,右为法线,左为位置,右为纹理坐标)

c++ - OpenGL Deferred渲染静态吗?-LMLPHP

编辑:
我启用GL_DEPTH_TEST后的新屏幕截图:

c++ - OpenGL Deferred渲染静态吗?-LMLPHP

编辑2
这是GBuffer设置:
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);

glGenTextures(4, textures);
glGenTextures(1, &depthTexture);

for (int i = 0; i < 4; i++) {
    glBindTexture(GL_TEXTURE_2D, textures[i]);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, windowSize.x, windowSize.y, 0, GL_RGB, GL_FLOAT, NULL);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i], 0);
}

glBindTexture(GL_TEXTURE_2D, depthTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, windowSize.x, windowSize.y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);

GLenum drawBuffers[] = {
    GL_COLOR_ATTACHMENT0,
    GL_COLOR_ATTACHMENT1,
    GL_COLOR_ATTACHMENT2,
    GL_COLOR_ATTACHMENT3
};
glDrawBuffers(4, drawBuffers);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
    // PRINT ERROR TO LOG ( No errors here i've already checked)
    return;
}

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

编辑3 如果有帮助,我正在关注this tutorial

最佳答案

我忘记在缓冲区中绘制对象之前禁用GL_BLEND。

现在一切正常。

glDisable(GL_BLEND);
(Deferred rendering...)
glEnable(GL_BLEND);

10-07 19:21
查看更多