2012-05-03 16 views
5

En mi solicitud tomo instantáneas de contenido de un QGLWidget para dos propósitos:Cómo tomar instantáneas QGLWidget fiable

  • se vuelve a dibujar la escena todo el tiempo cuando sólo una superposición cambios, utilizando un mapa de pixels en caché en lugar
  • Lat el usuario toma capturas de pantalla de los trazados particulares (escena 3D)

Lo primero que probé es grabFrameBuffer(). Es natural usar esta función como para la primera aplicación, lo que está visible actualmente en el widget es exactamente lo que quiero almacenar en caché. PROBLEMA: En algunos hardware (por ejemplo, gráficos Intel integrade, Mac OS X con gráficos GeForce), la imagen obtenida no contiene el contenido de la pantalla actual, sino el contenido anterior. Entonces, si la escena se dibujara dos veces, en la pantalla verá el segundo dibujo, en la imagen verá el primer dibujo (¿cuál debería ser el contenido del backbuffer?).

Lo segundo que probé es renderToPixmap(). Esto se representa usando paintGL(), pero no usando paint(). Tengo todas mis cosas en paint(), ya que utilizo la funcionalidad de pintura de Qt y solo una pequeña parte del código utiliza GL nativo (beginNativePainting(), endNativePainting()).

También probé la capacidad de captura instantánea de QWidget (QPixmap :: fromWidget(), o cómo se llama), pero allí el framebuffer GL es negro.

¿Alguna idea sobre cómo resolver el problema y obtener una representación confiable de la escena actualmente dibujada?

Respuesta

2

Cómo tomar instantáneas QGLWidget fiable

representar la escena actual al uso de este dispositivo, guardar los datos de uso de este dispositivo en el archivo. O agarrar el backbuffer actual después de glFlush. Cualquier otra cosa puede incluir artefactos o escenas incompletas.

+0

Terminé trabajando con un FBO. – ypnos

1

El resultado de QGLWidget::grabFrameBuffer(), como cualquier otra llamada OpenGL, depende del controlador de video. Qt simplemente reenvía su llamada al controlador y toma la imagen que devuelve, pero el contenido de la imagen no está bajo el control de Qt. Además de asegurarse de haber instalado el último controlador para su tarjeta de video, no hay mucho que pueda hacer, excepto reportar un error al fabricante de su tarjeta de video y orar.

0

Yo uso paintGL(); y glFlush(); antes de usar grabFrameBuffer(). El paintGL ayuda a dibujar el fotograma actual de nuevo antes de tomar el búfer de fotogramas, que hace una copia exacta de lo que se muestra actualmente.

2

Parece que QGLWidget :: grabFrameBuffer() internamente llama a glReadPixels() desde OpenGL. En las configuraciones de doble buffer, el modo inicial lee el buffer posterior (GL_BACK), cambia con la llamada OpenGL glReadBuffer (GL_FRONT) al buffer frontal antes de usar QGLWidget :: grabFrameBuffer() mostrando una imagen en la pantalla.

Cuestiones relacionadas