1

根据OpenGL 文档,我应该能够将像素读取源设置为任何GL_COLOR_ATTACHMENTi. 但是,当我尝试这个时,glGetError给了我一个GL_INVALID_ENUM错误。随后glReadPixels的只是读取后台缓冲区。

报告的版本glGetString(GL_VERSION)4.2.11627 Core Profile Forward-Compatible Context。我在 linux 上运行并安装了 fglrx ati 驱动程序(版本 8.96.7-120312a-135598C-ATI)。

我检查了我的 FBO 是否已绑定且完整。我还验证了glGetError不是由先前的调用设置的。

它已经失败了(我希望这里有一个错误,而INVALID_OPERATION不是INVALID_ENUM):

#include <iostream>
#include "Window.h" // My own class based on sfml, but I am sure context creation works fine
#include <glload/gll.hpp>
#include <glload/gl_core.hpp>

int main()
{
    const unsigned int screenW = 1280, screenH = 720;
    Window w(screenW, screenH, 32, false);
    if (glload::LoadFunctions() == glload::LS_LOAD_FAILED)
    {
        std::cerr << "glload failed to load" << std::endl;
        return -1;
    }
    gl::ReadBuffer(gl::GL_COLOR_ATTACHMENT0);
    if( gl::GetError() == gl::GL_INVALID_ENUM)
    {
        std::cerr << "Invalid enum error" << std::endl;
        return -1;
    }
    return 0;
}

这个调用可能触发还有另一个原因,INVALID_ENUM还是我使用的 OpenGL 实现更有可能被窃听?

4

1 回答 1

2

但是,当我尝试这个时,glGetError 给了我一个 GL_INVALID_ENUM 错误。随后的 glReadPixels 只是读取后台缓冲区。

如果您正在从后台缓冲区读取,那么这意味着默认的帧缓冲区 仍然是 bound。并为当前glReadBuffer缓冲区设置读取缓冲区。

默认帧缓冲区没有GL_COLOR_ATTACHMENTs。因此,将这些图像之一设置为读取缓冲区是错误的。您必须先绑定 FBO ,然后设置读取缓冲区。请注意,glReadBuffer将绑定的帧缓冲区设置为GL_READ_FRAMEBUFFER,而不是GL_DRAW_FRAMEBUFFER。因此,请确保将其绑定到正确的位置。

于 2012-07-15T16:56:08.470 回答