C++,Qt5 : grabFrameBuffer results are wrong when using multisampling

标签 c++ qt opengl

我想实现一个功能,将OpenGLWidget显示的内容保存到一个图片文件中。

我正在使用以下代码来保存图像:

ui->gl_widget->grabFramebuffer().save("/foo/bar.png");

只要我不使用多重采样,它就可以正常工作,但是如果我将这一行添加到我的初始化中,我只会得到看起来很奇怪的结果:

QSurfaceFormat format;
...
format.setSamples(4);
...

enter image description here

此外,多次渲染静态场景会产生不同的图像。

我正在使用 Qt5.6.0 和 OpenGL 3.3(核心配置文件)。

你能帮我找出问题所在吗?我现在搜索了很长时间,但不知道是什么导致了这个问题。

提前致谢!

最佳答案

获取小部件的帧缓冲区并不是很可靠。即使没有多重采样,在某些操作系统上,您也可能无法获得当前帧,而是之前的帧等。您看到的基本上是未初始化的内存。

我的解决方法是改为绘制到帧缓冲区对象中:

QGLFramebufferObject b(width, height);
QPainter p(&b);
bool success = drawScene(&p);

if (!success)
    return;

QImage img = b.toImage();

您可能需要稍微重构您的代码,但它具有其他优势(例如,选择自定义分辨率、画家的不同质量设置等)。

你可以在这里找到我的老问题:How to take reliable QGLWidget snapshot

关于C++,Qt5 : grabFrameBuffer results are wrong when using multisampling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38728154/

相关文章:

c++ - C++11 之后的 C++ 类分类

c++ - 在 unordered_map 中放置 unordered_set

c++ - 关于sstream,使用变量作为数组大小和计算溢出

c++ - 在 QTreeview 特定单元格中添加 QCombobox

c - OpenGL + 微型 C 编译器 : ", expected"

opengl - 如何在 GLSL 4.6 中设置统一结构

c++ - 如何使用 boost::flyweight 作为 GOF 模式?

c++ - 在 C++ 中从 XML 模式生成 XML 文档

python - QProcess 无法写入 cmd.exe

opengl - opengl中的背面多边形