根据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实现被bugged了?
发布于 2012-07-16 00:56:08
但是,当我尝试这样做时,glGetError给我一个GL_INVALID_ENUM错误。随后的glReadPixels只是读取后台缓冲区。
如果您正在从后台缓冲区读取,那么这意味着default framebuffer仍然是绑定的。glReadBuffer设置当前帧缓冲区的读取缓冲区。
默认帧缓冲区没有GL_COLOR_ATTACHMENT%s。因此,将其中一个图像设置为读取缓冲区是错误的。您必须首先绑定FBO,然后设置读取缓冲区。请注意,glReadBuffer为绑定到GL_READ_FRAMEBUFFER的帧缓冲区设置绑定,而不是GL_DRAW_FRAMEBUFFER。所以要确保它被绑定到正确的地方。
https://stackoverflow.com/questions/11493714
复制相似问题