【保存版】Qt GUIでOpenGLを使う前に知っておくべきこと:QSurface::supportsOpenGL()の使い方


QSurface::supportsOpenGL() 関数は、Qt GUI における QSurface オブジェクトが OpenGL グラフィックライブラリとの互換性を持っているかどうかを判断します。この関数は、OpenGL を利用したグラフィック処理を行う必要があるかどうかを判断する際に役立ちます。

機能

この関数は、以下の 3 つのケースを考慮して判定を行います。

  1. QSurface オブジェクトが OpenGL 対応型であるかどうか: QSurface::surfaceType() 関数を使用して、オブジェクトのタイプを確認します。OpenGLSurface または RasterGLSurface タイプの場合は、OpenGL に対応していることを示します。
  2. QSurface オブジェクトがラスターベースの表面かどうか: ラスターベースの表面は、ソフトウェアラスターライザーを使用してレンダリングでき、オプションで OpenGL もサポートできます。QSurface::surfaceType() 関数で RasterSurface タイプを検出した場合、QPlatformIntegration::hasCapability(QPlatformIntegration::OpenGLOnRasterSurface) 関数を使用して、プラットフォームがラスター表面上で OpenGL をサポートしているかどうかを確認します。
  3. プラットフォーム固有の OpenGL サポート: プラットフォームによっては、QPlatformIntegration::hasOpenGL() 関数を使用して、プラットフォーム全体で OpenGL がサポートされているかどうかを確認できます。

戻り値

  • false: QSurface オブジェクトが OpenGL に対応していない場合
  • true: QSurface オブジェクトが OpenGL に対応している場合
bool isOpenGLSupported = mySurface->supportsOpenGL();
if (isOpenGLSupported) {
    // OpenGL を利用したグラフィック処理を行う
} else {
    // OpenGL を利用できない処理を行う
}
  • OpenGL を利用する前に、QOpenGLContext オブジェクトを作成する必要があります。
  • ラスターベースの表面上で OpenGL を使用する場合は、パフォーマンスが低下する可能性があります。
  • QSurface::supportsOpenGL() 関数は、Qt 5.3 以降で利用可能です。


#include <QCoreApplication>
#include <QSurface>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QSurface surface;

    bool isOpenGLSupported = surface.supportsOpenGL();
    if (isOpenGLSupported) {
        // OpenGL を利用したグラフィック処理を行う
        std::cout << "OpenGL is supported" << std::endl;
    } else {
        // OpenGL を利用できない処理を行う
        std::cout << "OpenGL is not supported" << std::endl;
    }

    return 0;
}

例 2: ラスターベースの表面上で OpenGL サポートを確認する

#include <QCoreApplication>
#include <QSurface>
#include <QPlatformIntegration>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QSurface surface;

    if (surface.surfaceType() == QSurface::RasterSurface) {
        bool isOpenGLOnRasterSupported = QPlatformIntegration::hasCapability(QPlatformIntegration::OpenGLOnRasterSurface);
        if (isOpenGLOnRasterSupported) {
            // ラスターベースの表面上で OpenGL を利用したグラフィック処理を行う
            std::cout << "OpenGL is supported on raster surface" << std::endl;
        } else {
            // ラスターベースの表面上で OpenGL を利用できない処理を行う
            std::cout << "OpenGL is not supported on raster surface" << std::endl;
        }
    } else {
        // ラスターベースの表面ではない
        std::cout << "Surface is not raster-based" << std::endl;
    }

    return 0;
}
#include <QCoreApplication>
#include <QSurface>
#include <QPlatformIntegration>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QSurface surface;

    bool isOpenGLSupportedOnPlatform = QPlatformIntegration::hasOpenGL();
    if (isOpenGLSupportedOnPlatform) {
        // プラットフォーム全体で OpenGL を利用したグラフィック処理を行う
        std::cout << "OpenGL is supported on platform" << std::endl;
    } else {
        // プラットフォーム全体で OpenGL を利用できない処理を行う
        std::cout << "OpenGL is not supported on platform" << std::endl;
    }

    return 0;
}
  • OpenGL のプログラミング知識も必要です。
  • Qt を正しくインストールして設定されていることを確認してください。
  • 上記のコードはあくまで例であり、実際の用途に合わせて変更する必要があります。


しかし、いくつかの状況では、QSurface::supportsOpenGL() 関数の代替方法が必要になる場合があります。

代替方法

  1. QPlatformIntegration::hasOpenGL() 関数を使用する

この関数は、プラットフォーム全体で OpenGL がサポートされているかどうかを確認します。この方法は、QSurface::supportsOpenGL() 関数よりも汎用性があり、プラットフォーム固有の OpenGL サポートを確認する必要がある場合に役立ちます。

bool isOpenGLSupportedOnPlatform = QPlatformIntegration::hasOpenGL();
if (isOpenGLSupportedOnPlatform) {
    // OpenGL を利用したグラフィック処理を行う
} else {
    // OpenGL を利用できない処理を行う
}
  1. QPlatformIntegration::hasCapability(QPlatformIntegration::OpenGLOnRasterSurface) 関数を使用する

この関数は、ラスターベースの表面上で OpenGL がサポートされているかどうかを確認します。この方法は、QSurface::supportsOpenGL() 関数よりも詳細な情報を提供し、ラスターベースの表面上で OpenGL を使用する必要がある場合に役立ちます。

if (surface.surfaceType() == QSurface::RasterSurface) {
    bool isOpenGLOnRasterSupported = QPlatformIntegration::hasCapability(QPlatformIntegration::OpenGLOnRasterSurface);
    if (isOpenGLOnRasterSupported) {
        // ラスターベースの表面上で OpenGL を利用したグラフィック処理を行う
    } else {
        // ラスターベースの表面上で OpenGL を利用できない処理を行う
    }
}
  1. OpenGL ヘッダーファイルが存在するかどうかを確認する

この方法は、プラットフォーム上で OpenGL がサポートされているかどうかを簡易的に確認するのに役立ちます。ただし、この方法は詳細な情報提供は行われないため、他の方法と組み合わせて使用することを推奨します。

#include <QtOpenGL>

if (QGLWidget::hasOpenGL()) {
    // OpenGL を利用したグラフィック処理を行う
} else {
    // OpenGL を利用できない処理を行う
}
  • OpenGL のプログラミング知識も必要です。
  • 使用する代替方法は、具体的な要件によって異なります。
  • 上記の代替方法は、QSurface::supportsOpenGL() 関数よりも汎用性や詳細度が異なる場合があります。