glCopyPixels() 不返回选定的缓冲区像素

glCopyPixels() is not returning the selected buffer pixels

我正在尝试将前台缓冲区复制到后台缓冲区,我还需要将后台缓冲区复制到 aux0 或 aux1 缓冲区,但我无法让它工作。我得到的只是一份空白副本,而不是像素。我在交换缓冲区后立即执行此操作:SwapBuffers(glDeviceContext);

这是将像素放入另一个缓冲区的代码:

GLint m_viewport[4];
glGetIntegerv(GL_VIEWPORT, m_viewport);
glReadBuffer(GL_FRONT);
glDrawBuffer(GL_BACK);
glCopyPixels(0, 0, m_viewport[2], m_viewport[3], GL_COLOR);

而且我检查过:

glGetError()) != GL_NO_ERROR

到目前为止没有错误。但结果是空白。如果我在 SwapBuffers(glDeviceContext) 之后再次绘制到后台缓冲区,我会得到想要的结果,但这意味着我必须绘制两次。我也希望能够将整个缓冲区复制到系统菜单的AUX缓冲区中,这样我就有了整个事情的背景。

这是一个简短的测试代码:

    GLint m_viewport[4];
    glGetIntegerv(GL_VIEWPORT, m_viewport);
    glReadBuffer(GL_BACK);
    glDrawBuffer(GL_AUX2);
    glCopyPixels(0, 0, m_viewport[2], m_viewport[3], GL_COLOR);
    SwapBuffers(glDeviceContext);
    glReadBuffer(GL_AUX2);
    glDrawBuffer(GL_BACK);
    glCopyPixels(0, 0, m_viewport[2], m_viewport[3], GL_COLOR);
    SwapBuffers(glDeviceContext);

我建议不要使用 glCopyPixels,而是使用帧缓冲区对象并使用 glBlitFrameBuffer 或将带纹理的四边形绘制到后台缓冲区,而不是将前台缓冲区复制到后台缓冲区。通常,您应该将前缓冲区和后缓冲区都视为不可靠的,因为内容可能随时被破坏。本质上,如果 window 中的像素没有通过像素所有权测试,那么该位置的前缓冲区和后缓冲区都会被丢弃。