2010-07-01 33 views
9

Saludos a todos,QGL ¿Aceleración de hardware y hardware?

¿La subclasificación de QGLWidget y la reimplementación de paintEvent() utilizan OpenGL y la aceleración de hardware? Creo un QPainter y dibujo QImages en este paintEvent().

¿Qué sucede dentro del método paintEvent() de QGLWidget? ¿Convierte las imágenes (QImage, QPixmap) en texturas OpenGL?

¿Utiliza la aceleración de hardware para escalar la imagen?

Gracias de antemano, Umanga

+1

Parece muy poco probable. Desde los documentos, excepto que en lugar de dibujar los contenidos del widget usando QPainter, etc., utiliza los comandos estándar de renderizado de OpenGL. – tathagata

+2

@tathagata: lamentablemente te equivocas, a pesar del voto en contra; por favor lea mi respuesta a la pregunta. –

+0

Gracias Greg, por señalar eso! Solo estaba haciendo una suposición lógica. Supongo que estaba equivocado. – tathagata

Respuesta

13

Mire http://doc.qt.io/archives/4.6/opengl-2dpainting.html para un ejemplo instructivo, donde también puede encontrar la siguiente cita: "es posible volver a implementar su [QGLWidget] paintEvent() y usar QPainter para dibujar en el dispositivo, igual que lo haría con un QWidget. La única diferencia es que las operaciones de pintura se acelerarán en el hardware si es compatible con los controladores OpenGL de su sistema ".

Entonces, la respuesta a su primera pregunta es sí.

Para averiguar los detalles exactos de la aplicación, vamos a echar un vistazo rápido a un trozo de código fuente de QOpenGLPaintEngine (que se puede encontrar buscando en el Internet):

void QOpenGLPaintEngine::drawImage(const QRectF &r, const QImage &image, 
           const QRectF &sr, Qt::ImageConversionFlags) 
{ 
    Q_D(QOpenGLPaintEngine); 
    if (d->composition_mode > QPainter::CompositionMode_Plus 
     || d->high_quality_antialiasing && !d->isFastRect(r)) 
     d->drawImageAsPath(r, image, sr); 
    else { 
     GLenum target = (QGLExtensions::glExtensions 
         & QGLExtensions::TextureRectangle) 
         ? GL_TEXTURE_RECTANGLE_NV 
         : GL_TEXTURE_2D; 
     if (r.size() != image.size()) 
      target = GL_TEXTURE_2D; 
     d->flushDrawQueue(); 
     d->drawable.bindTexture(image, target); 
     drawTextureRect(image.width(), image.height(), r, sr, target); 
    } 
} 

Esto responde a su pregunta con respecto a QImages, de hecho se dibujan con texturas.

+0

muchas gracias Greg! eso despejó mis dudas. –

+3

¡Los beneficios de opensource! –

6

Sí, si utiliza los comandos GL dentro de un QGLWidget, dentro de los métodos paintGL, resizeGL y initializeGL, obtendrá la aceleración de hardware completa (si está disponible).

También parece que usar QPainter en un QGLWidget también tiene aceleración de HW, ya que hay una implementación de OpenGL QPainEngine, puede leer acerca de eso here.

Cuestiones relacionadas