Freeglut:glReadPixels()在最小化(iconify)窗口

时间:2016-10-14 13:53:10

标签: opengl glew freeglut

我使用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())确实有效 - 图像数据被正确检索

1 个答案:

答案 0 :(得分:3)

  

但是,只要我使用标准Windows最小化按钮最小化窗口,对glReadPixels()的调用就不会读取任何数据,只要我将窗口恢复到可见状态,它就会再次运行。

是的,它是如何运作的。渲染仅发生在通过像素所有权测试的像素上(即,作为屏幕外缓冲区一部分的像素,屏幕窗口的像素实际上对用户可见)。

  

即使窗口最小化,如何继续渲染?

渲染到一个帧缓冲对象(它为你提供了一个离屏缓冲区),然后从中读取。