glBlitFramebuffer - glReadBuffer 和 glDrawBuffer 引用相同的缓冲区

问题描述 投票:0回答:1

仅出于学习目的,我测试当

glBlitFramebuffer
glReadBuffer
引用同一缓冲区时调用
glDrawBuffer
时会发生什么。自定义帧缓冲区是这样定义的:

bool initFBO()
{
    glGenFramebuffers(1, &fboId);
    glBindFramebuffer(GL_FRAMEBUFFER, fboId);

    glGenTextures(1, &fboTexId);
    glBindTexture(GL_TEXTURE_2D, fboTexId);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glBindTexture(GL_TEXTURE_2D, 0);

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTexId, 0);

    GLuint rboDepth;
    glGenRenderbuffers(1, &rboDepth);
    glBindRenderbuffer(GL_RENDERBUFFER, rboDepth);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth);

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    if (status != GL_FRAMEBUFFER_COMPLETE)
    {
        return false;
    }

    return true;
}

这是效果图:

glBindFramebuffer(GL_FRAMEBUFFER, fboId);

render();
//now fboTexId is filled

glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboId);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glBlitFramebuffer(0, 0, w, h, 0, 0, w / 2, h / 2, GL_COLOR_BUFFER_BIT, GL_LINEAR);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

//render to the screen
renderTex(fboTexId);

当我将 fbo 纹理渲染到屏幕上时,我得到渲染函数结果 -

glBlitFramebuffer
不执行任何操作。我期望得到渲染函数结果,第二层在顶部小两倍。我不知道是否允许使用相同的参数调用
glReadBuffer
glDrawBuffer
。它应该像我预期的那样工作吗?

c++ opengl framebuffer
1个回答
0
投票

来自 OpenGL 4.6 核心配置文件规范 - 18.3.1 位图像素矩形

如果源缓冲区和目标缓冲区相同,并且源矩形和目标矩形重叠,则位块传输操作的结果未定义,如第 18.3 节介绍中所述。

© www.soinside.com 2019 - 2024. All rights reserved.