【问题标题】:Creating Screenshot in OpenGL not working在 OpenGL 中创建屏幕截图不起作用
【发布时间】:2023-03-17 04:40:01
【问题描述】:

我正在尝试使用 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 细节。

标签: opengl glfw


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多