仅出于学习目的,我测试当
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
。它应该像我预期的那样工作吗?
来自 OpenGL 4.6 核心配置文件规范 - 18.3.1 位图像素矩形
如果源缓冲区和目标缓冲区相同,并且源矩形和目标矩形重叠,则位块传输操作的结果未定义,如第 18.3 节介绍中所述。