9

皆さん、こんにちは。

QGLWidget をサブクラス化し、paintEvent() を再実装するだけで、OpenGL とハードウェア アクセラレーションを利用できますか? QPainter を作成し、この paintEvent() で QImages を描画します。

QGLWidget の paintEvent() メソッド内で何が起こっていますか? 画像 (QImage、QPixmap) を OpenGL テクスチャに変換しますか?

画像のスケーリングにハードウェア アクセラレーションを使用しますか?

前もってありがとう、ウマンガ

4

2 に答える 2

13

http://doc.qt.io/archives/4.6/opengl-2dpainting.htmlで有益な例をご覧ください。次の引用も見つかります。() を使用し、QWidget を使用する場合と同様に、QPainter を使用してデバイスに描画します。唯一の違いは、システムの OpenGL ドライバーでサポートされている場合、描画操作がハードウェアで高速化されることです。"

したがって、最初の質問に対する答えはイエスです。

実装の正確な詳細を理解するために、ソースコードの一部を簡単に見てみましょうQOpenGLPaintEngine(インターネットを検索すると見つかります)。

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

これは、QImages に関する質問に答えます。実際にテクスチャを使用して描画されます。

于 2010-07-01T12:46:51.983 に答える
6

はい、QGLWidget 内、paintGL、resizeGL、および initializeGL メソッド内で GL コマンドを使用すると、完全なハードウェア アクセラレーションが得られます (利用可能な場合)。

また、QGLWidget で QPainter を使用すると HW アクセラレーションも得られるようです。OpenGL QPainEngine の実装があるため、ここでそれについて読むことができます。

于 2010-07-01T11:47:43.590 に答える