OpenGL 延迟渲染静态?

OpenGL Deferred rendering static?

我正在尝试在我的引擎中实现延迟渲染,但我遇到了一些问题。 画的三角形好像有些静电。

下面是绘图代码:

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

(左上是漫反射,右上是法线,左下是位置,右下是纹理坐标)

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

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