2010-07-01 8 views
9

인사말 전체,QGLWidget 및 하드웨어 가속?

QGLWidget을 서브 클래 싱하고 paintEvent()를 다시 구현하기 만하면 OpenGL 및 하드웨어 가속을 사용합니까? QPainter를 만들고이 paintEvent()에 QImages를 그립니다.

QGLWidget의 paintEvent() 메서드는 어떻게됩니까? 이미지 (QImage, QPixmap)를 OpenGL 텍스처로 변환합니까?

이미지 가속에 하드웨어 가속을 사용합니까? 사전에

감사합니다,

umanga
+1

매우 보입니다. 문서에서 - QPainter 등을 사용하여 위젯의 내용을 그리는 대신 표준 OpenGL 렌더링 명령을 사용합니다. – tathagata

+2

@ tathagata : 불행히도 당신은 upvote에도 불구하고 틀렸어; 질문에 대한 내 대답을 읽어주십시오. –

+0

Greg에게 감사드립니다. 나는 논리적 추측을하고 있었다. 내가 틀렸다고 생각해. – tathagata

답변

13

http://doc.qt.io/archives/4.6/opengl-2dpainting.html을 보시고, 다음 인용문을 찾을 수 있습니다 : "[QGLWidget] paintEvent()를 다시 구현하고 QPainter를 사용하여 장치에서 그릴 수 있습니다. 유일한 차이점은 페인팅 작업이 시스템의 OpenGL 드라이버에서 지원되는 경우 하드웨어에서 가속된다는 것입니다. "

첫 번째 질문에 대한 대답은 '예'입니다. 이것은 당신의 질문에 대한 대답

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); 
    } 
} 

:

구현의 정확한 세부 사항을 파악 대한

, 이제 (인터넷을 검색하여 찾을 수 있습니다) QOpenGLPaintEngine에서 소스 코드의 조각에 빠른 들여다 보자 QImages에 관해서는 실제로 텍스처를 사용하여 그려집니다.

+0

Greg에게 감사드립니다. 그게 내 의심을 해결해 줬어. –

+3

opensource의 이점! –

6

예, GL이 QGLWidget 내부 명령을 사용할 경우 paintGL, resizeGL 및 initializeGL 방법 안에, 당신은 (가능한 경우) 전체 하드웨어 가속을 얻을 것이다.

또한 QGLWidget에서 QPainter를 사용하면 HW 가속도를 얻을 수 있습니다. OpenGL QPainEngine 구현이 있으므로이 부분을 읽을 수 있습니다. here.

관련 문제