是否有某种同步原语允许我们阻止线程直到OpenGL显示刷新,即在调用glutPostRedisplay()
之后?
static GLubyte *pixels = NULL;
glutSetWindow(mainWindow);
glutPostRedisplay();
pixels = (GLubyte *)realloc(pixels, format_nchannels * sizeof(GLubyte) * width * height);
glReadPixels(0, 0, width, height, FORMAT, GL_UNSIGNED_BYTE, pixels);
我正在尝试在刷新绘图后将像素从GPU复制到内存。但是,我发现在glReadPixels
执行后,像素不一定包含更新的图像。
答案 0 :(得分:2)
glutPostRedisplay不刷新任何东西。它只是设置一个标志,就是这样。由glutPostRedisplay设置的标志在主循环中进行测试,如果没有其他事件需要处理并且设置了标志,则主循环调用显示功能。如果你在调用glutPostRedisplay之后等待显示完成但在返回主循环之前你的程序将无限期地等待,从不返回主循环,从而给它一个重新显示的机会。
如果你想截取屏幕截图,只需自己介绍另一个标志并在显示功能中处理它。
出于稳健性原因,你不应该从主帧缓冲区glReadPixels
(它的内容可能是未定义的,被窗口遮挡),但是当请求屏幕截图渲染到FBO时,你可以从中保存截图并将其blit到主framebuffer。