【问题标题】:Freeglut: glReadPixels() does not work when minimizing (iconify) windowFreeglut:glReadPixels() 在最小化(图标化)窗口时不起作用
【发布时间】:2016-10-14 13:53:10
【问题描述】:

我使用 freeglut 在 Windows 窗口中显示 OpenGL 渲染。我的管道的最后一步是使用glReadPixels() 从我的缓冲区中获取像素以供以后处理(例如,存储在视频文件中)。 但是,一旦我使用标准 Windows 最小化按钮最小化窗口,对 glReadPixels() 的调用就不会读取任何数据,并且一旦我将窗口恢复到其可见状态,它就会再次工作。

如何在窗口最小化的情况下继续渲染?

这就是我获取图像数据的方式:

GLint viewPortParams[4];
glGetIntegerv(GL_VIEWPORT, viewPortParams);
const int width = viewPortParams[2];
const int height = viewPortParams[3];
// outImage is a cv::Mat* which stores image data as matrix
outImage->create(height, width, CV_8UC3);
// Set it to all grey for debugging - if image stays grey, data has not been fetched.
outImage->setTo(145);

const size_t step = static_cast<size_t>(renderParameters.outImage->step);
const size_t elemSize = renderParameters.outImage->elemSize();

//Set the byte alignment
glPixelStorei(GL_PACK_ALIGNMENT, (step & 3) ? 1 : 4);
//set length of one complete row
glPixelStorei(GL_PACK_ROW_LENGTH, step / elemSize);
glFlush();  //the flush before and after are to prevent unintentional flipping
glReadBuffer(GL_BACK);
glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, outImage->data);

/*
 * Now, outImage->data does contain the desired image if window is normal
 * but stays grey (i.e. the value 145 set above) if minimized
 */

glFlush();
glutSwapBuffers();

有趣的附注:使用完全屏幕外的管道(使用glutHideWindow())确实有效 - 图像数据被正确检索

【问题讨论】:

    标签: opengl glew freeglut


    【解决方案1】:

    但是,一旦我使用标准 Windows 最小化按钮最小化窗口,对 glReadPixels() 的调用就不会读取任何数据,并且一旦我将窗口恢复到其可见状态,它就会再次工作。

    是的,它就是这样工作的。渲染仅发生在通过像素所有权测试的像素上(即,属于屏幕外缓冲区的一部分的像素,即用户实际可见的屏幕窗口的像素)。

    如何在窗口最小化的情况下继续渲染?

    渲染到帧缓冲区对象(为您提供屏幕外缓冲区),然后从中读取。

    【讨论】:

    • 好的,我明白为什么会这样了。但是,如果我隐藏窗口,为什么它会起作用?这真的是无意的吗?
    • @PhilLab:这是未定义的行为,任何事情都可能发生。您很可能在使用窗口合成的系统上运行,隐藏窗口只是省略了最后的合成步骤。如果禁用合成,它可能无法工作(操作系统合成机制如下:Windows Vista 及以上 DWM/Aero。X11:XRender+Composite + {xcompmgr,compiz,emerald,Gnome Shell,etc.}。MacOS X:Quartz Extreme) .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多