在 OpenGL 中创建屏幕截图不起作用
Posted
技术标签:
【中文标题】在 OpenGL 中创建屏幕截图不起作用【英文标题】:Creating Screenshot in OpenGL not working 【发布时间】:2015-11-17 13:01:38 【问题描述】:我正在尝试使用 this 解释将 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();
非常感谢您的任何提示!
【问题讨论】:
互斥体?你不需要它,你有一个线程。请向我们展示此屏幕截图的外观。什么是原始图像? 您是要截取您自己的程序渲染的图像,还是要截取其他程序在外部窗口中绘制的屏幕截图?如果是后者,请不要再尝试用 OpenGL 来做,因为它不可能(干净地)做。在 Windows Vista 之前,您可以(在 Windows 平台上)通过利用 Windows 将帧缓冲区分配给 Windows 的方式来做到这一点。但这不再有效。 我自己的。 :) 问题是我试图从另一个线程中获取像素缓冲区。所有的 openGL 命令必须在同一个线程中执行。 How to take screenshot in opengl 可能重复,因为这里没有使用 GLFW 细节。 【参考方案1】:问题是我试图从另一个线程中获取像素缓冲区。所有 openGL 命令必须从同一个线程执行。
【讨论】:
以上是关于在 OpenGL 中创建屏幕截图不起作用的主要内容,如果未能解决你的问题,请参考以下文章