Qt Quick 3Dアーキテクチャ
Qt Quick 3Dは、Qt Quick を拡張して3Dコンテンツのレンダリングをサポートします。これには、いくつかの新しい公開QMLインポートに加え、新しい内部シーングラフやレンダラーなど、広範な機能が追加されています。このドキュメントでは、公開APIからレンダリングパイプラインの動作の詳細に至るまで、Qt Quick 3Dのアーキテクチャについて説明します。
モジュールの概要
Qt Quick 3Dは、追加の3D APIを提供するほか、既存の3Dアセットを加工・インポートするためのユーティリティを備えた、いくつかのモジュールとプラグインで構成されています。
QMLインポート
- QtQuick3D -Qt Quick 3Dのすべてのコアコンポーネントを含むメインのインポート
- QtQuick3D.AssetUtils - 実行時に3Dアセットをインポートするためのライブラリ
- QtQuick3D.Helpers - 3D の設計や 3D シーンのデバッグに役立つ追加コンポーネントのライブラリ
C++ ライブラリ
- QtQuick3D - 唯一の公開 C++ モジュール。QtQuick3D QML インポートで公開されるすべての型の定義に加え、いくつかの C++ API が含まれています
- QQuick3DGeometry - プロシージャルメッシュデータを作成するためのサブクラス
- QQuick3DTextureData - プロシージャルテクスチャデータを作成するためのサブクラス
- QQuick3D::idealSurfaceFormat - 最適なサーフェス形式を取得するために使用されます
QtQuick3DAssetImport- アセットのインポートやQMLへの変換を支援する、内部かつプライベートなライブラリ。QtQuick3DRuntimeRender- 空間シーングラフノードとレンダラーを含む、内部かつ非公開のライブラリ。QtQuick3DUtils- 他のすべてのC++モジュールで共通のユーティリティライブラリとして使用される、内部かつ非公開のライブラリ。
AssetImporters プラグイン
アセットインポートツールは、プラグインベースのアーキテクチャを用いて実装されています。Qt Quick 3Dに同梱されているプラグインは、アセットインポーターライブラリおよびツールであるBalsamの機能を拡張します。
- Assimp - このプラグインは、サードパーティ製ライブラリであるlibAssimpを使用して、3D交換フォーマットで保存された3DアセットをQt Quick 3DのQMLコンポーネントに変換します。
Qt Quick 3D は Qt グラフィックススタックにどのように組み込まれるのか
Qt Quick 3D グラフィックス・スタックのアーキテクチャ図" src="images/quick3d-graphics-stack.drawio.svg" title="Qt Quick 3D グラフィックス・スタックのアーキテクチャ図"/>
上の図は、Qt Quick 3Dがより広範なQtグラフィックススタックにどのように組み込まれているかを示しています。Qt Quick 3Dは、2DのQt Quick APIの拡張として機能し、3DシーンアイテムをView3D と組み合わせて使用する場合、シーンはQt Rendering Hardware Interface (RHI) を通じてレンダリングされます。 RHIは、API呼び出しを、指定されたプラットフォームに適したネイティブのレンダリングハードウェアAPI呼び出しに変換します。上の図は、各プラットフォームで利用可能なオプションを示しています。ネイティブバックエンドが明示的に定義されていない場合、Qt Quick は各プラットフォームのレンダリングに適したネイティブバックエンドをデフォルトで選択します。
スタック内のQt Quick の3DコンポーネントとQt Quick スタックとの統合については、以下の各セクションで説明します。
2D での 3D 統合
2Dで3Dコンテンツを表示することは、Qt Quick 3D APIの主な目的です。3Dコンテンツを2Dに統合するための主要なインターフェースは、View3D コンポーネントです。
View3D コンポーネントは、コンテンツを持つ他のQQuickItem 派生クラスと同様に動作し、仮想関数QQuickItem::updatePaintNode を実装しています。Qt Quick は、同期フェーズ中にQt Quick シーングラフ内のすべての「変更済み」アイテムに対してupdatePaintNodeを呼び出します。これには、View3D によって管理される3Dアイテムも含まれ、updatePaintNodeの呼び出しの結果として、これらのアイテムも独自の同期フェーズを経ることになります。
View3D のupdatePaintNodeメソッドは、以下の処理を実行します:
- まだ存在しない場合は、レンダラーとレンダリングターゲットを設定する
- SceneManagerを介して3Dシーン内のアイテムを同期する
- Qt Quick によってレンダリングされた「動的」テクスチャ(以下の3Dテクスチャパス内の2Dテクスチャ)を更新する
ただし、3Dシーンのレンダリングは、View3D のupdatePaintNodeメソッド内では行われません。代わりに、updatePaintNodeは、Qt Quick 3D用のレンダラーを含むQSGNode のサブクラスを返します。このサブクラスは、Qt Quick のレンダリングプロセスのプリプロセスフェーズ中に3Dシーンをレンダリングします。
Qt Quick の3Dレンダリングの仕組みは、どのView3D::renderMode が使用されるかによって異なります:
オフスクリーン
View3D のデフォルトモードはOffscreen です。オフスクリーンモードを使用する場合、View3D はオフスクリーンサーフェスを作成してそこにレンダリングを行うことで、テクスチャプロバイダとなります。このサーフェスはQt Quick 内でテクスチャとしてマッピングされ、QSGSimpleTextureNode を使用してレンダリングされます。
このパターンは、Qt Quick ですでに実装されている QSGLayerNodes の動作と非常に似ています。
アンダーレイ
Underlay モードを使用する場合、3DシーンはView3D を含むQQuickWindow に直接レンダリングされます。レンダリングはシグナルQQuickWindow::beforeRenderPassRecording()の呼び出しによって行われるため、Qt Quick 内の他のすべての要素は、3Dコンテンツの上に重ねてレンダリングされます。
オーバーレイ
Overlay モードを使用する場合、3DシーンはView3D を含むQQuickWindow に直接レンダリングされます。レンダリングはシグナルQQuickWindow::afterRenderPassRecording()の発火によって行われるため、3DコンテンツはQt Quick 内の他のすべてのコンテンツの上にレンダリングされます。
インライン
Inline レンダリングモードはQSGRenderNode を使用します。これにより、オフスクリーンサーフェスを使用せずに、Qt Quick のレンダリングターゲットへ直接レンダリングすることが可能になります。これは、Qt Quick シーンの2Dレンダリング中に、レンダリングコマンドをインラインで挿入することで実現されます。
このモードでは、Qt Quick レンダラーと同じ深度バッファを使用するため、Qt Quick とQt Quick 3Dではz値の意味が全く異なるという問題が生じる可能性があります。
2Dと3Dの統合
3Dシーンをレンダリングする際、2D要素を3Dに組み込む必要が生じるケースは数多くあります。3Dシーン内に2Dコンテンツを統合するには2つの異なる方法があり、それぞれが画面に表示されるまでの独自の経路を持っています。
ダイレクトパス
ダイレクトパスは、2DのQt Quick コンテンツを、あたかも3Dシーン内の平面アイテムとして存在するかのようにレンダリングするために使用されます。例えば、次のシーン定義を考えてみましょう:
Node {
Text {
text: "Hello world!"
}
}ここで起こっていることは次の通りです。QQuickItem 型の空間ノードに子コンポーネントが設定されると、まずそのコンポーネントは QQuick3DItem2D でラップされます。これは、2D アイテムに 3D 座標を追加するだけのコンテナです。 これにより、それ以降のすべての子2Dアイテムが3Dシーン内で正しく表示されるよう、レンダリング方法の基礎となる3D変換が設定されます。
シーンをレンダリングする段階になると、これらの2DアイテムのQSGNodesがQt Quick レンダラーに渡され、適切なレンダリングコマンドが生成されます。 コマンドはインラインで実行され、現在の 3D 変換が考慮されるため、2D レンダラーとまったく同じようにレンダリングされますが、3D でレンダリングされたかのように表示されます。
このアプローチの欠点は、Qt Quick 2D レンダラーには照明の概念がないため、3D シーンの照明情報を 2D コンテンツのシェーディングに使用できないことです。
テクスチャパス
テクスチャパスは、2DのQt Quick シーンを使用して動的なテクスチャコンテンツを作成します。以下のテクスチャ定義を考えてみましょう:
Texture {
sourceItem: Item {
width: 256
height: 256
Text {
anchors.centerIn: parent
text: "Hello World!"
}
}
}このアプローチは、Qt Quick におけるレイヤーアイテムの動作と同じ仕組みで機能します。つまり、すべてがトップレベルのアイテムと同じサイズのオフスクリーンサーフェスにレンダリングされ、そのオフスクリーンサーフェスは、他の場所で再利用可能なテクスチャとして使用できるようになります。
このテクスチャは、シーン内のマテリアルによって使用され、アイテム上にQt Quick のコンテンツをレンダリングするために利用できます。
シーンの同期
シーンマネージャー
Qt Quick 3D のシーンマネージャは、3D シーン内の空間アイテムを追跡し、同期フェーズ中にアイテムが対応するシーングラフノードを確実に更新するようにする役割を担っています。Qt Quick では、2D の場合、この役割はQQuickWindow によって実行されます。シーンマネージャは、フロントエンドノードとバックエンドのシーングラフオブジェクト間の主要なインターフェースです。
各View3D アイテムには、少なくとも1つのSceneManagerが存在します。これは、インスタンス化時に1つが作成され、組み込みのシーンルートに関連付けられるためです。空間ノードがView3D の子として追加されると、それらはView3D のSceneManagerに登録されます。 インポートされたシーンを使用する場合、View3D の直接の子ではないノードを管理するために、2つ目のSceneManagerが作成されます(すでに存在する場合は参照されます)。これは、View3D とは異なり、インポートされたシーンは参照されるまでQQuickWindow 上に存在しないため、必要となります。 追加のSceneManagerは、インポートされたシーンに属するアセットが、参照されている各QQuickWindow に対して少なくとも1回は作成されることを保証します。
シーンマネージャは内部 API ですが、update() メソッドの呼び出しによって「変更あり」とマークされたすべてのオブジェクトに対して、updateSpatialNode を呼び出す役割を担っていることを知っておくことが重要です。
フロントエンド/バックエンドの同期
同期の目的は、フロントエンド(Qt Quick )で設定された状態が、バックエンド(Qt Quick Spatial Scene Graph Renderer)で設定された状態と一致するようにすることです。デフォルトでは、フロントエンドとバックエンドは別々のスレッドで実行されます。フロントエンドは Qt のメインスレッドで、バックエンドはQt Quick のレンダリングスレッドで実行されます。 同期フェーズでは、メインスレッドとレンダリングスレッドが安全にデータをやり取りできます。このフェーズ中、シーンマネージャーはシーン内の変更されたノードごとに `updateSpatialNode` を呼び出します。これにより、レンダラーが使用するために、新しいバックエンドノードが作成されるか、既存のノードが更新されます。
Qt Quick 空間シーングラフ
Qt Quick 3Dは、Qt Quick と同じフロントエンド/バックエンド分離パターンを採用するように設計されています。フロントエンドオブジェクトはQt Quick エンジンによって制御され、バックエンドオブジェクトはシーンをレンダリングするための状態データを保持します。フロントエンドオブジェクトはQObject を継承し、Qt Quick エンジンに公開されます。QMLソースファイル内の項目は、フロントエンドオブジェクトに直接対応します。
これらのフロントエンドオブジェクトのプロパティが更新されると、1つまたは複数のバックエンドノードが作成され、シーングラフに配置されます。3Dシーンのレンダリングには2Dのレンダリングよりもはるかに多くの状態が関与するため、3Dシーンオブジェクトの状態を表すための専用のシーングラフノードのセットが別途用意されています。 このシーングラフは、「Qt Quick 空間シーングラフ」として知られています。
フロントエンドオブジェクトとバックエンドノードは、いずれも2つのクラスに分類できます。1つ目は「空間的」なもので、3D空間内のどこかに存在するという意味です。実際には、これらの各タイプには変換行列が含まれています。空間的アイテムの場合、各子アイテムは親の変換を継承するため、親子関係が重要になります。
もう一方のクラスはリソースです。リソースには3D空間上の位置はなく、単に他のアイテムによって使用される状態を表しています。これらのアイテム間には親子関係が存在することがありますが、それは所有権を表す以外に特別な意味を持ちません。
Qt Quick の2Dシーングラフとは異なり、空間シーングラフではリソースノードがユーザーに直接公開されます。 例えば、Qt Quick では、QSGTexture は公開 API ですが、このオブジェクトを直接公開するQQuickItem はありません。その代わりに、ユーザーは、テクスチャの出典とレンダリング方法の両方を記述する Image アイテムを使用するか、QSGTexture 自体を操作する C++ コードを記述する必要があります。Qt Quick 3D では、これらのリソースが QML API 内で直接公開されています。 これは、リソースがシーンの状態において重要な部分を占めるためです。これらのリソースは、シーン内の多くのオブジェクトから参照される可能性があります。例えば、多くのマテリアルが同じテクスチャを使用する可能性があります。また、実行時にテクスチャのプロパティを設定することで、例えばテクスチャのサンプリング方法を直接変更することも可能です。
空間オブジェクト
すべての空間オブジェクトは Node コンポーネントのサブクラスであり、このコンポーネントには 3D 空間における位置、回転、スケールを定義するプロパティが含まれています。
リソースオブジェクト
リソースオブジェクトは、Object3D コンポーネントのサブクラスです。Object3D は、シーンマネージャーで使用するためのいくつかの特別なヘルパー関数を備えた、単なるQObject のサブクラスに過ぎません。リソースオブジェクトには親子関係がありますが、これらは主にリソースの所有権管理に役立ちます。
- Texture
- TextureData
- Geometry
- Material
- DefaultMaterial
- PrincipledMaterial
- CustomMaterial
- Effect
- SceneEnvironment
View3Dとレンダリングレイヤー
フロントエンドとバックエンドの分離に関して言えば、ユーザー視点ではView3D が分離点となります。なぜなら、View3D こそが、どのシーンコンテンツをレンダリングするかを定義するからです。Qt Quick の空間シーングラフにおいて、レンダリングされるシーンのルートノードはLayerノードです。Layerノードは、View3D によって、View3D のプロパティとSceneEnvironment のプロパティを組み合わせて作成されます。View3D 向けにシーンをレンダリングする際、シーンをレンダリングするためにレンダラーに渡されるのは、このLayerノードです。
シーンのレンダリング
レンダリングターゲットの設定
レンダリングプロセスの最初のステップは、シーンのレンダリングターゲットを決定し、設定することです。SceneEnvironment に設定されているプロパティに応じて、実際のレンダリングターゲットは異なります。 まず、コンテンツをウィンドウ表面に直接レンダリングするか、オフスクリーンテクスチャにレンダリングするかを決定します。デフォルトでは、View3D はオフスクリーンテクスチャにレンダリングします。ポストプロセッシングエフェクトを使用する場合は、オフスクリーンテクスチャへのレンダリングが必須となります。
シーンのレンダリングターゲットが決定されると、いくつかのグローバル状態が設定されます。
- ウィンドウサイズ — ウィンドウへのレンダリングの場合
- ビューポート — レンダリングされるシーン領域のサイズ
- クリッピング矩形 — ビューポートがクリップされるべきウィンドウの一部
- クリアカラー - 必要に応じて、レンダリングターゲットをクリアする色。
レンダリングの準備
レンダリングの次の段階は「準備」段階です。この段階では、レンダラーがハウスキーピングを行い、特定のフレームで何をレンダリングする必要があるかを判断し、必要なリソースがすべて利用可能で最新の状態であることを確認します。
準備段階自体は、2つのフェーズに分かれています。1つは、何がレンダリングされるか、どのようなリソースが必要かを決定する高レベルの準備、もう1つは、RHI を使用して実際にレンダリングパイプラインやバッファを設定し、メインシーンパスのレンダリング依存関係を設定する低レベルの準備です。
高レベルなレンダリング準備
このフェーズの目的は、空間シーングラフの状態を抽出し、それをレンダリングコマンドの作成に利用できる形に変換することです。概要としては、レンダラーが、一連の照明状態を持つ単一のカメラの視点から、レンダリング対象となるジオメトリとマテリアルの組み合わせのリストを作成します。
まず最初に行われるのは、すべてのコンテンツに共通するグローバルな状態を決定することです。SceneEnvironment がlightProbe を定義している場合、そのライトプローブテクスチャに関連付けられた環境マップが読み込まれているかどうかを確認し、読み込まれていない場合は、新しい環境マップを読み込むか生成します。 環境マップの生成自体は、ソーステクスチャをキューブマップに畳み込む一連のパスで構成されます。このキューブマップには、スペキュラー反射情報と、マテリアルシェーディングに使用される放射照度の両方が含まれます。
次に、レンダラーはシーン内でどのカメラを使用するかを決定する必要があります。View3D によってアクティブなカメラが明示的に定義されていない場合、シーン内で最初に利用可能なカメラが使用されます。シーン内にカメラが存在しない場合、コンテンツはレンダリングされず、レンダラーは処理を中止します。
カメラが決定されると、そのフレームの投影行列を計算できるようになります。各レンダラブルはどのように投影されるべきかを知る必要があるため、この時点で計算が行われます。これはまた、どのレンダラブル項目をレンダリングすべきかを計算できるようになったことを意味します。 すべてのレンダラブル項目のリストから始め、無効化されているか完全に透明であるために表示されない項目をすべて削除します。 次に、アクティブなカメラでフラスタムカリングが有効になっている場合、各レンダラブル項目について、カメラのフラスタムの視野範囲から完全に外れているかどうかを確認し、外れている場合はレンダラブルリストから削除します。
カメラの投影に加え、シェーディングコードでの照明計算に必要なため、カメラの方向も計算されます。
シーン内にライトノードが存在する場合、これらは利用可能な最大ライト数と同じ長さのリストにまとめられます。シーン内のライトノード数がレンダラーがサポートするライト数を超える場合、その制限を超える余分なライトノードは無視され、シーンの照明には影響しません。 ライトノードのスコープを指定することは可能ですが、スコープを設定した場合でも、各ライトの照明状態は照明機能を持つすべてのマテリアルに送信されることに注意してください。ただし、スコープ外にあるライトの輝度は 0 に設定されるため、実際にはそれらのライトは該当するマテリアルの照明に寄与しません。
これで、レンダラブルのリストが(願わくば)短くなったはずですが、これらの各項目について、シーンの現在の状態を反映するように更新する必要があります。各レンダラブルについて、適切なマテリアルが読み込まれているかを確認し、読み込まれていない場合は新しいマテリアルを作成します。 マテリアルとは、シェーダーとレンダリングパイプラインの組み合わせであり、ドローコールを生成するために必要です。さらに、レンダラーは、レンダラブルをレンダリングするために必要なリソース(例えば、モデルに設定されたジオメトリやテクスチャなど)がすべて読み込まれていることを確認します。まだ読み込まれていないリソースは、ここで読み込まれます。
マテリアルやエフェクト用のシェーダーのディスクベースのキャッシュに関する説明については、「シェーダーのディスクベースのキャッシュ」を参照してください。
その後、レンダラブルのリストは3つのリストに分類されます。
- 不透明アイテム:これらは手前から奥へ、つまりカメラに最も近いアイテムから最も遠いアイテムへとソートされます。これは、ハードウェアによるオクルージョンカリングや、フラグメントシェーダーでの早期Z検出を活用するために行われます。
- 2Dアイテム:これらは、Qt Quick レンダラーによってレンダリングされるQtQuick アイテムです。
- 透明オブジェクト:これらは後ろから手前へ、つまりカメラから最も遠いオブジェクトから最も近いオブジェクトへとソートされます。これは、透明オブジェクトが背後のすべてのオブジェクトとブレンドされる必要があるためです。
低レベルなレンダリング準備
このフレームで考慮すべき事項がすべて決定されたため、メインのレンダリングパスに関する基盤構築と依存関係を処理できます。このフェーズで最初に行われるのは、メインパスに必要なプレパスのレンダリングです。
- 深度パスのレンダリング - スクリーンスペースアンビエントオクルージョンやシャドウイングなどの特定の機能には、深度プレパスが必要です。このパスでは、不透明なオブジェクトすべてが深度テクスチャにレンダリングされます。
- SSAOパスのレンダリング - スクリーンスペースアンビエントオクルージョン(SSAO)パスの目的は、アンビエントオクルージョンテクスチャを生成することです。このテクスチャは、後でマテリアルがシェーディングを行う際に、特定の領域を暗くするために使用されます。
- シャドウパスのレンダリング - シーン内の各光源で、シャドウが有効になっているものは、追加のシャドウパス生成に寄与します。レンダラーでは 2 種類の異なるシャドウ処理技術が採用されているため、光源の種類に応じて異なるパスが生成されます。 指向性ライトからの影をレンダリングする場合、シーンは、指向性ライトの方向とカメラのフラスタムのサイズを組み合わせて、2Dオクルージョンテクスチャにレンダリングされます。ポイントライトまたはスポットライトからの影をレンダリングする場合、ライトのオクルージョンテクスチャは、ライトの各面の方向に対するオクルージョンの寄与を表すキューブマップとなります。
- Render ScreenTexture - このパスは、スクリーンテクスチャを必要とするCustomMaterial を使用する場合にのみ発生します。このスクリーンテクスチャは、屈折などのレンダリング技法に使用できます。このパスは深度パスと同様に機能しますが、不透明なオブジェクトをすべてカラーテクスチャにレンダリングします。
依存関係のレンダリングが完了すると、残りのパスは準備されますが、レンダリングは行われません。 この準備には、高レベルの準備段階で収集された状態を取り込み、それをグラフィックプリミティブに変換することが含まれます。具体的には、ユニフォームバッファ値の作成・更新、サンプラーと依存テクスチャの関連付け、シェーダーリソースバインディングの設定、およびドローコールの実行に必要なパイプライン状態の作成に関わるその他すべての処理です。
シーンのレンダリング
準備という骨の折れる作業が完了した今、メインシーンのコンテンツを構成するコマンドを実行するのは簡単な作業です。このレンダリングは次の順序で行われます:
- クリアパス - これは厳密には「パス」ではありませんが、SceneEnvironment でbackgroundModeがどのように設定されているかによって、ここで異なる処理が行われます。 backgroundModeがtransparentまたはcolorに設定されている場合、カラーバッファは透明状態、あるいは指定された色でクリアされます。一方、backgroundModeがSkyBoxに設定されている場合は、カメラの視点からSkyBoxをレンダリングするパスが実行され、これによりバッファに初期データが書き込まれます。
- 不透明パス - 次に、すべての不透明なアイテムが描画されます。これは、パイプラインの状態を設定し、この時点で既にソートされているリストの順序に従って各アイテムの描画コマンドを実行するだけです。
- 2Dパス - シーンに2Dオブジェクトが存在する場合、Qt Quick レンダラーが呼び出され、それらのオブジェクトをレンダリングするために必要なレンダリングコマンドが生成されます。
- 透明パス - 最後に、シーン内の透明なアイテムが、不透明なアイテムと同じ方法で一つずつレンダリングされます。
これでシーンのレンダリングは完了します。
ポストプロセッシング
ポストプロセッシング機能が有効になっている場合、シーンレンダラーの出力はポストプロセッシングフェーズへの入力となるテクスチャであるとみなされます。すべてのポストプロセッシング手法は、このシーン入力テクスチャに対して処理を行う追加のパスです。
ポストプロセッシングフェーズのすべてのステップはオプションであり、組み込み機能もユーザー定義のエフェクトも有効になっていない場合、シーンレンダリングの出力が最終的なレンダリングターゲットとして使用されます。ただし、tonemapping はデフォルトで有効になっている点に注意してください。
組み込みのポストプロセッシング
ExtendedSceneEnvironment およびその親タイプである「SceneEnvironment 」は、3Dシーンで最も一般的に使用されるエフェクトに加え、レンダラーによって生成された高ダイナミックレンジ(HDR)の色値を0~1のLDR範囲にマッピングするために使用されるトーンマッピング機能を提供します。 エフェクトには、被写界深度、グロー/ブルーム、レンズフレア、ビネット、色調整およびグレーディング、フォグ、アンビエントオクルージョンなどが含まれます。
ポストプロセッシングエフェクト
アプリケーションは、SceneEnvironment::effects プロパティ内で順序付きリストとして、独自のカスタム後処理エフェクトを指定できます。このリストに値が指定されている場合、その中のエフェクトは、ExtendedSceneEnvironment によって提供される組み込みエフェクトよりも先に適用されます。各後処理エフェクトはチェーンの一部であり、前のエフェクトの出力が次のエフェクトの入力となります。 このチェーンの最初のエフェクトは、シーンレンダラーステップの出力から直接入力を受け取ります。また、エフェクトがシーンレンダラーの出力である深度テクスチャにアクセスすることも可能です。
このプロセスにおける各エフェクトは複数のサブパスで構成されることがあり、これにより中間バッファにコンテンツをレンダリングすることが可能です。マルチパスエフェクトの最終パスは、ポストプロセッシングフェーズの次のステップで使用される色データを含む単一のテクスチャを出力することが期待されます。
時間的およびプログレッシブアンチエイリアシング
「時間的アンチエイリアシング」および「プログレッシブ・アンチエイリアシング」ステップは、SceneEnvironment のプロパティを設定することでオプションで有効にできます。これらは厳密にはポストプロセッシングフェーズの一部ではありませんが、時間的およびプログレッシブ・アンチエイリアシングの実際の結果は、ポストプロセッシングフェーズ中に実現されます。
時間的アンチエイリアシングは、シーンが積極的に更新されているときに実行されます。有効にすると、アクティブなカメラはシーンを描画する際に、フレームごとにカメラの方向をごくわずかに調整します。その後、現在のフレームは、以前にレンダリングされたフレームとブレンドされ、レンダリング結果が滑らかになります。
プログレッシブアンチエイリアシングは、シーンが更新されていないときにのみ実行されます。有効にすると、更新が強制され、アクティブなカメラの方向にごくわずかな調整を加えて、シーンの現在の状態がレンダリングされます。 最大8フレームが蓄積され、あらかじめ定義された重み付けに基づいて合成されます。これにより、アニメーションのないシーンが滑らかになりますが、更新ごとに余分なフレームがいくつかレンダリングされるため、パフォーマンスの低下を招きます。
スーパーサンプリングアンチエイリアシング(SSAA)
スーパーサンプリングアンチエイリアシングは、シーンを滑らかにするブルートフォース的な手法です。これは、シーンの要求サイズの倍数となるテクスチャにレンダリングし、その後、ターゲットサイズにダウンサンプリングすることで機能します。 例えば、2倍のSSAAが要求された場合、シーンは意図したサイズの2倍のテクスチャにレンダリングされ、このフェーズの一環としてダウンサンプリングされます。これはパフォーマンスやリソース使用量に多大な影響を与える可能性があるため、可能であれば避けるべきです。 また、View3D のサイズが大きすぎる場合、この方法を使用できない可能性があります。この方法に必要なテクスチャが、レンダリングハードウェアがサポートするサイズを超える可能性があるためです。
© 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.