2016-08-02 1 views
2

Я хочу реализовать функцию, которая сохраняет содержимое, отображаемое OpenGLWidget, в файл изображения.C++, Qt5: результаты grabFrameBuffer ошибочны при использовании мультисэмплирования

Я использую следующий код, чтобы сохранить изображение:

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

Это прекрасно работает до тех пор, как я не использую мультисамплинг, но если добавить эту строку в моей инициализации, я получаю только странно выглядящие результаты:

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

enter image description here

дополнительно, рендеринг статической сцены несколько раз приводит к появлению различных изображений.

Я использую Qt5.6.0 и OpenGL 3.3 (Core Profile).

Вы можете помочь мне найти эту проблему у себя на странице? Я искал довольно долгое время, и я не знаю, что вызывает эту проблему.

Заранее благодарен!

+1

Это ошибка. Он должен работать. Если эта ошибка не сообщается, сделайте это на qt bugtracker. –

+0

Я подозреваю, что реализация этого метода может быть вызвана вызовом 'glReadPixels()' OpenGL, который не поддерживается для мультисэмплированных фреймбуферов. –

ответ

1

Схватка фреймбуфера виджета на самом деле не надежна. Даже без мультисэмплинга на некоторых операционных системах может случиться так, что вы не получите текущий, но предыдущий кадр и т. Д. То, что вы видите, - это в основном неинициализированная память.

Мой Обойти это сделать в фреймбуфера объекта вместо:

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

if (!success) 
    return; 

QImage img = b.toImage(); 

Вы, возможно, придется реорганизовать ваш код немного, но это происходит с другими преимуществами (например, выбирая пользовательское разрешение, различные настройки качества на художника и т. д.).

Вы можете найти мой старый вопрос точно с этим вопросом здесь: How to take reliable QGLWidget snapshot

+1

Другой вопрос был для 'QGLWidget': там захват фреймбуфера был действительно ненадежным. Это для 'QOpenGLWidget'. Он * уже втягивается в объект framebuffer! * 'DefaultFramebufferObject()' дает вам свой дескриптор в 'context()', в то время как живопись активна (и только тогда IIRC). –

+0

Спасибо, приятно знать. Может быть, у вас также есть ответ на этот вопрос? http://stackoverflow.com/questions/32030389/draw-content-of-qopenglframebufferobject-onto-qopenglwidget. Это удерживает меня от перехода на 'QOpenGLWidget'. – ypnos

+0

Вы действительно хотите, чтобы кто-то показывал вам, как рисовать текстурированный квадратик? Если это так, то этот вопрос является дубликатом, в значительной степени. –

Смежные вопросы