Как сделать надежный снимок QGLWidget

В моем приложении я делаю снимки содержимого QGLWidget для двух целей:

  • Не перерисовывать сцену все время, когда изменяется только наложение, вместо этого используя кэшированное растровое изображение
  • Lat пользователь сделать скриншоты отдельных участков (3D-сцена)

Первое, что я попробовал, это grabFrameBuffer(). Естественно использовать эту функцию как для первого приложения, то, что в данный момент видно в виджете, это именно то, что я хочу кэшировать. ПРОБЛЕМА:На некоторых аппаратных средствах (, например. Интегрированная графика Intel, Mac OS X с графикой GeForce ), полученное изображение содержит не текущее содержимое экрана, а содержимое, предшествующее этому. Итак, если бы сцена рисовалась два раза, на экране вы видите второй рисунок, а на изображении вы видите первый рисунок (, который должен быть содержимым бэкбуфера? ).

Второе, что я попробовал, это renderToPixmap(). Это визуализирует с использованием paintGL(), но не с использованием paint(). У меня все есть в paint(), так как я использую функции рисования Qt, и только небольшая часть кода использует родной GL (beginNativePainting(),endNativePainting()).

Я также попробовал функцию моментального снимка обычного QWidget (QPixmap ::fromWidget (), или как она называется ), но там кадровый буфер GL черный.

Есть идеи, как решить проблему и получить достоверное изображение текущей сцены?

5
задан Nicol Bolas 3 May 2012 в 15:38
поделиться