Qt Quick 3D によるシェーダーの永続キャッシュ
シェーダーと3Dマテリアル
マテリアルを使用した3Dオブジェクトのレンダリングには、頂点シェーダーとフラグメントシェーダーが関与します。
3D シーンの存続期間中にマテリアルが初めて検出されると、実行時には以下の処理が行われます。
- シェーダーのソーステキストが生成されます。
- シェーダーは、標準の Qt シェーダーパイプラインを通過します。その結果、シェーダーの中間バイトコード版 (SPIR-V)、他の 3D API 用のいくつかのソースコードバリアント (OpenGL 用の GLSL、Direct3D 用の HLSL など)、および追加のメタデータが生成されます。
- 3Dエンジンがgraphics pipeline を作成する際、使用される3D APIに適したバイトコードまたはソースコードのバリエーションが選択され、その後、基盤となる3D APIが実際のGPU命令セットを対象とした第2段階のコンパイルを実行する可能性があります。
これら一連の処理は、負荷の高い操作となる可能性があります。アプリケーションのその後の実行でこれを回避するために、2つの永続的なディスクベースのキャッシュが採用されています。
低レベルキャッシュ
Qt Quick 3Dは、Qt Quick とシーングラフに基づいています。OpenGLプログラムバイナリやVulkanパイプラインなどの、永続的なディスクベースのキャッシュに関しては、同じインフラストラクチャが使用されます。
詳細については、QQuickGraphicsConfiguration#Pipeline Cache Save and Load を参照してください。
デフォルトでは、シェーダーのディスクキャッシュが有効になっています。つまり、プラットフォームや3D APIの実装がコンパイル済みシェーダーの永続的なキャッシュを行わない場合でも、QtはQQuickWindow の存続期間中に収集されたOpenGLプログラムバイナリや類似のアセットを保存することがあります。 データのディスクへの書き込みはウィンドウが閉じられた際に行われ、アプリケーションの次回実行時に再読み込みされます。これにより、アプリケーションの以前の実行中にシェーダーが使用されていた場合、グラフィックスパイプラインの構築が大幅に高速化される可能性があります。
3Dマテリアルやポストプロセッシング効果用のシェーダーも、この仕組みの対象となります。
マテリアルシェーダーキャッシュ
Qt Quick とは異なり、Qt Quick 3D は現在、3D マテリアルおよびエフェクト用のシェーダーソーステキストをランタイムで生成することに依存しています。ただし、Shadergen ツールを使用する場合は例外ですが、この機能は実験的なものであり、現時点では本番環境での使用は推奨されていません。
シェーダーソーステキストを生成し、その後、第1段階のコンパイルおよびトランスパイル(詳細はQtShader Tools を参照)を実行することは、負荷の高い処理となる可能性があります。2Dマテリアルおよびエフェクトの場合、これは通常ビルド時に実行されますが、3Dの場合は現時点ではその選択肢がありません。
そのため、Qt Quick 3D では別のディスクベースのキャッシュを採用しています。このキャッシュには、生成された 3D マテリアルおよびエフェクトのアセットが格納されます。
つまり、低レベルキャッシュと組み合わせることで、アプリケーションの以前の実行時に遭遇したマテリアルを含む3Dシーンが、その後の実行で再度遭遇しても、負荷が高く処理をブロックするような操作にはなりません。
注: 低レベルのシェーダーおよびパイプラインキャッシュと同様 、これには書き込み可能なファイルシステムが必要であり、プラットフォームがQStandardPaths を通じて書き込み可能なキャッシュ場所を提供している必要があります。
アプリケーション属性 `Qt::AA_DisableShaderDiskCache ` および対応する環境変数は、マテリアルシェーダキャッシュにも適用されます。これが設定されると、Qt の低レベルキャッシュと `Qt Quick 3D` のマテリアルキャッシュの両方が無効になります。
注: qml ツールは 、デフォルトでこの属性を設定します。スタンドアロンの Qt アプリケーションと同様の動作にするには、--enable-shader-cache コマンドライン引数を指定してください。
実行時に3Dマテリアルキャッシュに関する情報を出力するには、qt.quick3d.cache というロギングカテゴリを有効にしてください。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.