在OpenGL中创建屏幕截图不起作用

在OpenGL中创建屏幕截图不起作用,opengl,glfw,Opengl,Glfw,我试图使用解释将openGL屏幕保存到文件中,但收到的图像无效: 为什么会这样 我正在使用带有双缓冲区的glfw,据报道在某些情况下会出现问题。但是,使用glFlush()会冻结我的屏幕:/ 在执行缓冲区交换时是否会调用glReadPixels方法?我实际上使用互斥来防止这种情况 我需要glfw的一些技巧吗 以下是代码供参考: glfwGetWindowSize(&mWidth, &mHeight); glBufferLock.lock(); std::cout <

我试图使用解释将openGL屏幕保存到文件中,但收到的图像无效:

为什么会这样

  • 我正在使用带有双缓冲区的glfw,据报道在某些情况下会出现问题。但是,使用glFlush()会冻结我的屏幕:/

  • 在执行缓冲区交换时是否会调用glReadPixels方法?我实际上使用互斥来防止这种情况

  • 我需要glfw的一些技巧吗

以下是代码供参考:

glfwGetWindowSize(&mWidth, &mHeight);

glBufferLock.lock();
std::cout << "\nSaving screenshot (" << mWidth << ", " << mHeight << ")\n";

int n=3 * mWidth * mHeight;
GLubyte* pixels = new GLubyte[n];

glPixelStorei(GL_PACK_ALIGNMENT, 1);


glReadPixels(0,0,mWidth,mHeight, GL_RGB, GL_UNSIGNED_BYTE, pixels);
if (GL_NO_ERROR != glGetError()) throw "Error: Unable to read pixels.";

// Convert to FreeImage format & save to file
FIBITMAP* image = FreeImage_ConvertFromRawBits(pixels, mWidth, mHeight, 3 * mWidth, 24,  0xFF0000, 0x00FF00, 0x0000FF, false);
FreeImage_Save(FIF_BMP, image, "test.bmp", 0);

// Free resources
FreeImage_Unload(image);
delete [] pixels;
glBufferLock.unlock();
glfwGetWindowsSize(&mWidth,&mHeight);
glBufferLock.lock();

问题是我试图从另一个线程获取像素缓冲区。所有openGL命令必须从同一线程执行。

Mutex?你不需要它,你只有一根线。请告诉我们这个截图应该是什么样子。什么是原始图像?您是希望拍摄您自己的程序渲染的图像的屏幕快照,还是希望拍摄其他程序在外部窗口中绘制的屏幕快照?如果是后者,不要再尝试用OpenGL来实现它,因为它不可能(干净地)实现。在Windows Vista之前,您可以(在Windows平台上)利用Windows为Windows分配帧缓冲区的方式来实现这一点。但这已经不起作用了。我自己的。:)问题是我试图从另一个线程获取像素缓冲区。所有openGL命令都必须从同一线程执行。由于此处未使用GLFW规范,因此可能会重复。