根据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实现更有可能被窃听?
答案 0 :(得分:2)
然而,当我尝试这个时,glGetError给了我一个GL_INVALID_ENUM错误。随后的glReadPixels只读取后缓冲区。
如果您正在从后台缓冲区中读取,则表示default framebuffer 仍然绑定。并且glReadBuffer
设置当前帧缓冲区的读取缓冲区。
默认帧缓冲区没有GL_COLOR_ATTACHMENT
个。因此,将这些图像之一设置为读取缓冲区是错误的。您必须首先绑定FBO ,然后设置读取缓冲区。请注意,glReadBuffer
设置绑定到GL_READ_FRAMEBUFFER
的帧缓冲区的绑定,而不是GL_DRAW_FRAMEBUFFER
。所以要确保它绑定到正确的位置。