Qt for Windows - グラフィックス・アクセラレーション

Qt Quick を動作させるには、Direct 3D 11、Direct3D 12、Vulkan 1.0、または OpenGL 2.1 以上をサポートするグラフィックドライバが必要です。Qt 6 では、Windows の Qt Quick のデフォルトは Direct3D 11 です。これは、デフォルトがOpenGLであったQt 5とは異なり、直接、またはOpenGLからDirect3DへのトランスレータであるANGLEを介して行われます。ANGLEはQt 6ではQtに同梱されなくなりました。

Direct3Dのソフトウェア・ラスタライザ(WARP)を強制的に使用するには、環境変数QSG_RHI_PREFER_SOFTWARE_RENDERER1 に設定します。場合によっては、Qt Quickが自動的にこのようなフォールバックを行い、追加設定なしでQtアプリケーションを実行できるようにします。これは、ドライバが十分なレベルの D3D11 機能を提供していない場合に起こり、適切な GPU アクセラレーションとパススルーが実装されていない仮想マシンでよく起こります。使用されているグラフィックデバイスが不明な場合や、トラブルシューティング、Qt に問題を報告する場合は、環境変数QSG_INFO=1 を設定してアプリケーションを実行し、デバッグ出力を確認してください。qtdiag ツールを実行すると、利用可能な 3D API をすべて列挙するので、有益な情報を得ることもできます。

Vulkan、OpenGL、または Direct 3D 12 の使用を要求するには、環境変数QSG_RHI_BACKENDvulkan またはopengl またはd3d12 に設定するか、同等のC++ APImain() で使用します。これらの 3D API の中には、適切なドライバをインストールする必要があるものもあります。

QWidgetQt Quick のデフォルトではありませんが、OpenGL は多くの Qt アプリケーションで一般的に使用されています。例えば、QOpenGLWindowQOpenGLWidget をベースにしたアプリケーションでは、OpenGL が使用されています。

OpenGL の動的ロード

Qtは、実行時にOpenGL実装を選択してロードすることをサポートしています。このモードはデフォルトで、configureスクリプトに-opengl dynamic

configure -opengl dynamic

この設定は、ビルド時にOpenGL実装に関する依存関係や仮定がハードコードされないため、最も柔軟です。そのため、アプリケーションのデプロイメントが堅牢になります。与えられた環境が適切なOpenGL 2.0実装を提供できない場合、opengl32.dll (デフォルト名はopengl32sw.dll )の代替をロードするように自動的にフォールバックします。ビルド済みの Qt パッケージは、OpenGL のソフトウェア・ラスタライザ実装であ る Mesa llvmpipe のビルドを、この名前で出荷しています。

-opengl dynamic で設定すると、Qt も、qmake またはCMake を使ってビルドされたアプリケーションも、opengl32.lib にリンクしません。代わりに、実行時にライブラリが選択され、ロードされます。デフォルトでは、Qtはシステムのopengl32.dllがOpenGL 2関数を提供しているかどうかを判断します。これらが存在する場合はopengl32.dllが使用され、そうでない場合はopengl32sw.dll をロードしようとします。詳細は以下を参照。

読み込みメカニズムは、QT_OPENGL 環境変数と以下のアプリケーション属性で設定できます:

  • Qt::AA_UseDesktopOpenGL QT_OPENGL を に設定するのと同じです。desktop
  • Qt::AA_UseOpenGLES Qt 6 では効果がありません。
  • Qt::AA_UseSoftwareOpenGL QT_OPENGL を に設定するのと同じです。software

特定のコンフィギュレーションが明示的に要求された場合、アプリケーションの起動時にチェックは行われません。

つまり、システムが提供する opengl32.dll は検査されません。ダイナミック・ローディングは、 ネイティブの OpenGL 呼び出しを含むアプリケーションに重大な影響を与えます。代わりに、アプリケーションはQOpenGLFunctions クラスを介して OpenGL 関数を使用することが期待されます。このように、OpenGLライブラリへの直接的な依存は取り除かれ、すべての呼び出しは実行時にQtが選択した実装にルーティングされます。あるいは、アプリケーションは、.proプロジェクトファイルにopengl32.libを追加すれば、OpenGL関数を直接呼び出すことができます:LIBS += opengl32.lib(Visual Studio) またはLIBS += -lopengl32(Mingw-w64).この結果は、アプリケーションから見ると、Qt の-opengl desktop ビルド設定と同じです。

Qt::AA_UseSoftwareOpenGL は、非標準的な名前のOpenGL実装をロードしようとするという意味で特別です。デフォルトの名前は です。これにより、ソフトウェアのみのOpenGL実装、たとえばopengl32sw.dllllvmpipeを使ったMesaのビルドを、この名前で出荷することができます。必要であれば、 環境変数を設定することで、ファイル名を上書きできます。QT_OPENGL_DLL

グラフィックスカードとドライバーのバージョンに応じて、どのOpenGL実装を使うかを指定するJSON形式の設定ファイルを提供することができる。場所は環境変数QT_OPENGL_BUGLIST で指定します。相対パスはQLibraryInfo::SettingsPath またはQStandardPaths::ConfigLocation を使用して解決されます。 このファイルは、The Chromium Projects で使用されているドライバーバグリストの形式を利用しています。このファイルは、エントリーのリストで構成され、各エントリーは一連の条件と 機能キーワードのリストを指定する。通常、デバイスIDとベンダーIDは、特定のグラフィックスカードにマッチするために使用されます。これらは、qtdiag6 またはdxdiag ツールの出力で見つけることができる。

以下の特徴キーワードは、OpenGL実装の選択に関連します:

注意: Qt 6では、レガシーなANGLE関連キーワード(disable_angle,disable_d3d11,disable_d3d9)が使えますが、効果はありません。

  • disable_desktopgl - OpenGLを無効にします。これにより、Qtは通常のOpenGL(opengl32.dll)を使用しようとせず、すぐにANGLEを開始します。これは悪いOpenGLドライバがアプリケーションをクラッシュさせるのを防ぐのに便利です。
  • disable_rotation - アプリケーションを常に横向きで実行するように強制します。ソフトウェアOpenGL実装を使用している場合は効果がありません。これは回転に問題のあるドライバ向けです。
  • disable_program_cache - シェーダープログラムのバイナリをディスクに保存しないようにします。

サンプルファイルは次のようになります:

{
"entries": [
{
  "id": 1,
  "description": "Disable D3D11 on older nVidia drivers",
  "os": {
    "type": "win"
  },
  "vendor_id": "0x10de",
  "device_id": ["0x0DE9"],
  "driver_version": {
    "op": "<=",
    "value": "8.17.12.6973"
  },
  "features": [
    "disable_d3d11"
  ]
},
...

QT_OPENGL_BUGLIST が指定されていない場合、組み込みのリストが使用されます。disable_desktopgl これは、Qt が不安定なデスクトップ OpenGL 実装を使用しないようにするためで、代わりにソフトウェアベースの代替ライブラリをすぐにロードするようにフォールバックします。

実際には、最も一般的な組み合わせは以下のようになると思われます:

  • disable_desktopgl - システムがOpenGL 2.0以降を提供しているが、ドライバが不安定でクラッシュしやすいことが知られている場合。
  • disable_desktopgldisable_angle - アクセラレーション・パスを使用しない場合。これは、Qtがソフトウェア・ラスタライザー(opengl32sw.dll)のみを試行することを保証します。仮想マシンや、さまざまな古いシステム上にデプロイされるアプリケーションで役立ちます。

指定したカードやドライバにマッチするためにサポートされているキーは以下の通りです。これらのいくつかは Qt 固有のものであることに注意してください。

  • os.type - オペレーティングシステム: 、win linux macosx android
  • os.version - カーネルバージョン
  • os.release - Windows のオペレーティング・システム・リリースのリストを指定します: , , , , .xp vista 7 8 8.1 10
  • vendor_id - アダプタ識別子からのベンダー
  • device_id - PCI デバイス ID のリスト。
  • driver_version - アダプタ識別子からのドライバ・バージョン
  • driver_description - 値がアダプタ識別子からのドライバ説明の部分文字列の場合にマッチする。
  • gl_vendor - 値が 文字列の部分文字列の場合に一致します。GL_VENDOR

すべてのブラックリストを無効にするには、環境変数QT_NO_OPENGL_BUGLIST を任意の値に設定します。これにより、設定ファイルの読み込みが省略され、ドライバやOSに関係なく、何も無効化されていないとみなされる。

注意: 通常は必要ありませんが、QT_NO_OPENGL_BUGLIST は、複数の、おそらくは仮想の、グラフィックアダプターが存在する、特定の仮想環境では関連する可能性があります。qt.qpa.gl のようなカテゴリからのログが、ドライバとディスプレイアダプタの検出が、OpenGLを誤って無効にしていることを示している場合、アプリケーションを正常に実行できるようにするために、この環境変数を設定することが推奨されます。この環境変数は Qt 5.15 で導入されました。

opengl32.dll への直接依存

デフォルトのdynamic OpenGL ビルドに代わる方法として、opengl32.dll に直接依存する方法があります。このモードでは、コマンドラインオプション-opengl desktop を configure スクリプトに渡します。

configure -opengl desktop

注意: EGL と OpenGL ES の使用は Windows ではサポートされていません。Qt 6では、Windows上のOpenGLは常にウィンドウシステムインターフェイスとしてWGLを使用することを意味します。

そのような Qt ビルドでは、多くの Qt 共有ライブラリや Qt アプリケーションが opengl32.dll に依存するため、別のライブラリを使用することはできません。

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。