マルチビュー・レンダリング

マルチビューレンダリングとは、2Dテクスチャ配列のレイヤーに描画コールをインスタンス化することです。Qt では、特に Qt Quick 3D Xr を使用して構築された VR/AR アプリケーションに適しています。マルチビューレンダリングは、シーンのトラバーサル、レンダリングの準備、左右の目のコンテンツのレンダーパスの記録を別々に行う代わりに、1回のレンダーパスでの描画コールをテクスチャ配列のレイヤー0と1にインスタンス化することで、1回で済ませることができます。頂点シェーダは、ビューインデックスを示す特別な変数を使用し、それに基づいてビューごとの値を計算します。カメラマトリクスなど、ビューに依存するデータを含むユニフォームは、両目分用意する必要があります。マルチビューレンダリングは、システムに対するレンダラーの負荷を減らし、パフォーマンスの向上につながる可能性が期待されています。その代償として、レンダラーとシェーダーがビュー依存データとテクスチャ配列の適切な処理を認識する必要があります。

低レベルの概要

Qt アプリケーションの開発者は、Qt レンダリング スタックの低レベルでマルチビュー レンダリングがどのように有効になっているかを完全に理解する必要はありません。以下のリンクは、その詳細を知りたい開発者のために用意されています。

3D API におけるマルチビューのサポート

マルチビューレンダリングは、基礎となる 3D API が実行時にサポートしている場合にのみ利用できます。詳細については、適切な仕様とドキュメントを参照してください:

Qt のレンダリングハードウェアインタフェース(RHI)でのマルチビューサポート

Qt では、3D グラフィック API はQRhi クラスによって抽象化されています。Qt Quick と Qt Quick 3D は、すべてのアクセラレーションレンダリングにこのインフラストラクチャを使用しています。マルチビュー・レンダリングのサポートに関する低レベルの情報は、以下を参照してください:

Qt Quick - Quick 3D - Quick 3D XR スタックでのマルチビューサポート

Qt Quick のマルチビューサポート

Qt Quick はマルチビューに対応していますが、マルチビューレンダリングを単独で使用することはありません。マルチビューレンダリングのサポートは、2D要素が3Dシーンに埋め込まれたときにQt Quick 3Dとの組み合わせで重要になります。3Dシーンがマルチビュー・レンダー・ターゲットに出力されるときに2Dコンテンツを正しくレンダリングするには、2Dレンダラーとそのマテリアル(シェーダー)がマルチビュー・サポート用に準備されている必要があります。

Qt Quick の組み込みマテリアル(RectangleImageText など)はすべてマルチビューに対応しているため、Qt ベースのアプリケーションの開発者は多くの場合、この点を考慮する必要はありません。

しかし、カスタムマテリアル(QSGMaterial,QSGMaterialShader)を開発したり、ShaderEffect のシェーダーを書いたりする場合、Qt Quick 3D Xr アプリケーションの VR/AR シーン内でその 2D コンテンツを使用することを意図している場合は、カスタムコンテンツはマルチビューに対応している必要があります。この詳細については、QSGMaterial::viewCount() を参照してください。

マルチビュー対応のシェーダを記述することは、Qt のシェーダ調整パイプラインによって可能になります。詳細はQSB マニュアルと Qt Shader Tools Build System Integrationのマルチビューのセクションを参照してください。

Qt Quick 3D のマルチビューサポート

Qt Quick 3D Xr を使用しない、つまり VR/AR アプリケーションではない Qt Quick 3D アプリケーションは、現在マルチビューレンダリングを使用できません。しかし、Qt Quick 3D Xr は同じインフラストラクチャ上に構築されているため、3D レンダラーは完全にマルチビューに対応しています。ModelPrincipledMaterial などの標準的な組み込み機能は、すべてマルチビューに対応しています。古いスタンドアロンエフェクトモジュールなど、一部の非推奨機能はマルチビューレンダリングに対応していない場合があります。

カスタムシェーダースニペットがCustomMaterialEffect に含まれている場合、マルチビューレンダリングが有効な Qt Quick 3D Xr アプリケーションで正しく機能するためには、アプリケーションが提供するシェーダコードをマルチビューサポートを考慮して記述する必要があります。その方法については、これらのタイプのドキュメントを参照してください。特に重要な特殊キーワードはVIEW_INDEX,INPUT,SCREEN_TEXTURE,DEPTH_TEXTURE,AO_TEXTURE です。

例えば、以下の後処理エフェクトはマルチビューに対応しています。これは、INPUTsampler2D ではなく、sampler2DArray の場合に用意されているからです:

void MAIN()
{
    vec4 c = texture(someTexture, TEXTURE_UV);
    // ...
#if QSHADER_VIEW_COUNT >= 2
    FRAGCOLOR = c * texture(INPUT, vec3(INPUT_UV, VIEW_INDEX));
#else
    FRAGCOLOR = c * texture(INPUT, INPUT_UV);
#endif
}

Qt Quick 3D Xr のマルチビューサポート

マルチビューレンダリングは、基礎となるグラフィックス API がサポートしている限り、デフォルトで有効です。これは、可能な限り最高のパフォーマンスを保証するためです。マルチビュー・レンダリングがサポートされているかどうかを確認するには、multiViewRenderingSupported プロパティをチェックします。

開発およびテスト目的では、マルチビュー・レンダリングの使用を無効にすると便利です。これは、環境変数QT_QUICK3D_XR_DISABLE_MULTIVIEW をゼロ以外の値に設定することで可能です。

マルチビュー・レンダリングが有効かどうかを調べるには、multiViewRenderingEnabled プロパティを使用します。マルチビュー・レンダリングを有効にできない場合、値は常に False のままになります。

一般的に、VR/ARアプリケーションでは、マルチビューレンダリングがサポートされている場合は有効にしておき、問題が発生した場合やテスト目的でのみ無効にすることを推奨します。マルチビューレンダリングは、GPU と特に CPU の負荷を軽減し、パフォーマンスを向上させることが期待されています。

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