将readbuffer设置为FBO颜色附件失败,枚举错误无效

时间:2012-07-15 16:41:08

标签: linux opengl ati

根据OpenGL documentation,我应该可以将像素读取的来源设置为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实现更有可能被窃听?

1 个答案:

答案 0 :(得分:2)

  

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

如果您正在从后台缓冲区中读取,则表示default framebuffer 仍然绑定。并且glReadBuffer设置当前帧缓冲区的读取缓冲区。

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