在 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 中创建屏幕截图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

BitBlt 屏幕截图在 Windows 10 上不起作用

为啥在 RegisterController 中创建函数在 laravel 中不起作用

OpenGL累积缓冲区不起作用

在 mysql 中创建函数不起作用 - 错误 1064

在 Azure 项目中创建附件不起作用

SoftInput.AdjustPan 不起作用