如何从多重采样缓冲区绘制到默认帧缓冲区

时间:2020-09-04 04:38:27

标签: opengl glsl

我正在尝试从多重采样的帧缓冲区渲染为默认的帧缓冲区。

首先,我要使用这些命令启用多重采样。

glfwWindowHint(GLFW_SAMPLES, 4);
glEnable(GL_MULTISAMPLE);

比起创建多采样缓冲区

unsigned int fboMsaaId, rboDepthId;
    unsigned int MsaaTexture;
    // Generate texture
    glGenTextures(1, &MsaaTexture);
    glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, 800, 600, false);   
    // create a multisample buffer
    glGenFramebuffers(1, &fboMsaaId);
    glGenRenderbuffers(1, &rboDepthId);
    glBindFramebuffer(GL_FRAMEBUFFER, fboMsaaId);
    glBindRenderbuffer(GL_RENDERBUFFER, rboDepthId);
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, 800, 600);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, MsaaTexture, 0);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,rboDepthId); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

在渲染循环中。

while (!glfwWindowShouldClose(window))
    {
        // input
        // -----
        processInput(window);
        // render
        // ------
        glBindFramebuffer(GL_FRAMEBUFFER, fboMsaaId);
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        // draw our  triangle
        glUseProgram(shaderProgram);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        
        
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
        glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMsaaId);
        glDrawBuffer(GL_BACK);
        glBlitFramebuffer(0, 0, 800, 600, 0, 0, 800, 600, GL_COLOR_BUFFER_BIT, GL_LINEAR);
        
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

如果我渲染到默认帧缓冲区,则能够看到绘制的对象,但是当我从多采样帧缓冲区过渡到默认帧缓冲区时,在屏幕上什么也没画。

1 个答案:

答案 0 :(得分:3)

您想要做的就是使其默认帧缓冲区不被多重采样。也就是说,您想从多采样帧缓冲区过渡到非多采样帧缓冲区。

是的,在两个多采样的帧缓冲区之间进行分割是合法的,但这仅在它们具有相同采样计数的情况下才是合法的。虽然您确实请求了4个采样的默认帧缓冲区,但是默认帧缓冲区并不完全在您的控制之下。对于默认的帧缓冲区可以获取多少样本,实现可以轻松实现。

因此,最好完全避免这种可能性,并使用非多重采样的默认帧缓冲区。