1

这是非常简单的代码..唯一的问题是我多次重复相同的代码以进行详细调试。详细信息:OpenGL 版本 3.3.0、Window 7 OS 和 VS2008、OpenCV 2.2.0。

RenderObject();
//glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
Mat image;
image.create(screenHeight,screenWidth, CV_8UC3);
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, (uchar*)image.data);
int error_code1 = glGetError();  // Error Code: 0, NO Error, Also output is good/as expected!
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
int error_code8 = glGetError();  // Error Code: 0, NO Error
//flip(image, image, 0);
//glPopClientAttrib();
const char *title = "glReadPixels Output";
cv::namedWindow(title);  
int error_code2 = glGetError();  // Error Code: 1282, GL_INVALID_OPERATION
imshow(title, image);
int error_code3 = glGetError();  // Error Code: 1282, GL_INVALID_OPERATION
waitKey(5000);
int error_code4 = glGetError();  // Error Code: 0, NO Error
destroyWindow(title);
int error_code5 = glGetError();  // Error Code: 1282, GL_INVALID_OPERATION
image.release();

int error_code6 = glGetError();  // Error Code: 1282, GL_INVALID_OPERATION

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);

int error_code7 = glGetError();  // Error Code: 1282, GL_INVALID_OPERATION

引擎盖下发生了一些事情。那是什么?...好吧,即使 OpenCV 窗口正在接管默认缓冲区,至少 error_code7 应该为 0(即没有错误)。我用帧缓冲对象和默认的 glut 隐藏窗口测试了代码。还让我告诉你,我必须使用帧缓冲区对象来达到我的目的。所以,不能使用相同的默认窗口来绘制和显示。

4

2 回答 2

0

code4 为 0,因为在之前的 glGetError() 之后没有发生新的 OpenGL 操作。您应该在问题开始时解决问题,这是在 glGetError() 的非零返回值第一次出现时。因此,待办事项列表上的第一件事是在下面添加一个 glGetError() glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

那条线不应该真的造成任何麻烦,但仍然要检查它。如果不是,那么可能是 namedWindow 调用搞砸了。您的 OpenGL 上下文是哪个版本?

于 2011-06-17T13:44:43.733 回答
0

当使用“WITH_QT_OPENGL”构建 OpenCV 时,会出现上述问题。

解决方案:

  1. 构建没有“WITH_QT_OPENGL”选项的 OpenCV。它将完全消除所有错误。
  2. 或解决方法 - 重新附加绘图缓冲区(即 glDrawBuffer 仅与默认缓冲区对象或帧缓冲区对象(FBO)同时 FBO 和纹理/渲染缓冲区,您可以使用 'glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);' 来验证它)
于 2011-06-18T11:49:29.003 回答