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++モジュールです。 QMLインポートで公開されるすべての型の定義と、いくつかのC++ APIが含まれています。QtQuick3D
- 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 Graphics Stack に組み込む方法
上の図は、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 の統合
3D コンテンツを 2D で表示することが、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 Sceneの2Dレンダリング中にレンダーコマンドをインラインで実行します。
このモードは、Qt Quick レンダラーと同じ深度バッファを使用し、Qt Quick と Qt Quick 3D では z 値の意味が全く異なるため、問題になることがあります。
2D と 3D の統合
3Dシーンをレンダリングするとき、2D要素を3Dに埋め込む必要があるシナリオがたくさんあります。3Dシーンの中に2Dコンテンツを統合するには、2つの異なる方法があります。
ダイレクト・パス
ダイレクト・パスは、Qt Quickの2Dコンテンツを、3Dシーン内のフラット・アイテムとして存在するかのようにレンダリングするために使用します。例えば、次のようなシーン定義を考えてみましょう:
Node {
Text {
text: "Hello world!"
}
}
子コンポーネントがQQuickItem タイプの空間ノードに設定されると、まず QQuick3DItem2D によってラップされます。これは、2D アイテムに 3D 座標を追加するだけのコンテナです。これは、2Dアイテムに3D座標を追加する単なるコンテナです。これにより、3Dシーンに正しく表示されるように、それ以降の2Dの子アイテムがどのようにレンダリングされるかのベースとなる3D変換が設定されます。
シーンをレンダリングするとき、これらの2DアイテムのQSGNodeはQt Quick Rendererに渡され、適切なレンダリングコマンドが生成されます。コマンドはインラインで実行され、現在の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つのシーンマネージャーを持つことになります。空間ノードがView3D の子として追加されると、それらはView3D のシーンマネージャーに登録されます。インポートされたシーンを使用する場合、View3D の直接の子ではないノードを管理するために、2つ目の SceneManager が作成されます(または、すでに存在する場合は参照されます)。これは、View3D とは異なり、インポートされたシーンは、参照されるまでQQuickWindow 上に存在しないため、必要です。追加の SceneManager は、インポートされたシーンに属するアセットが、それらが参照されるQQuickWindow ごとに少なくとも一度は作成されることを確認します。
シーンマネージャーは内部 API ですが、シーンマネージャーは update() メソッドを呼び出すことで、ダーティにマークされたすべてのオブジェクトの updateSpatialNode を呼び出す責任があることを知っておくことが重要です。
フロントエンドとバックエンドの同期
同期の目的は、フロントエンド(Qt Quick)で設定された状態とバックエンド(Qt Quick Spatial Scene Graph Renderer)で設定された状態を一致させることです。デフォルトでは、フロントエンドとバックエンドは別々のスレッドで動作します。フロントエンドはQt Mainスレッドで、バックエンドはQt Quickのレンダースレッドで動作します。同期フェーズでは、メインスレッドとレンダースレッドが安全にデータを交換できます。このフェーズの間、シーンマネージャはシーン内の各ダーティノードに対して updateSpatialNode を呼び出します。これにより、新しいバックエンドノードが作成されるか、レンダラーが使用する既存のノードが更新されます。
Qt Quick 空間シーングラフ
Qt Quick 3Dは、Qt Quickと同じフロントエンド/バックエンド分離パターンを使用するように設計されています。フロントエンドオブジェクトはQt Quickエンジンによって制御され、バックエンドオブジェクトはシーンをレンダリングするためのステートデータを含んでいます。フロントエンドオブジェクトはQObject を継承し、Qt Quick エンジンに公開されます。QMLソースファイルの項目は、直接フロントエンドオブジェクトにマッピングされます。
これらのフロントエンドオブジェクトのプロパティが更新されると、1つ以上のバックエンドノードが作成され、シーングラフに配置されます。3Dシーンのレンダリングは、2Dシーンのレンダリングよりも多くのステートを含むため、3Dシーンオブジェクトのステートを表現するために、専用のシーングラフノードが別に用意されています。このシーングラフは、Qt Quick Spatial Scene Graphとして知られています。
フロントエンドのオブジェクトとバックエンドのノードは、2つのクラスに分類できます。つは空間的なもので、3D空間のどこかに存在するという意味です。これが実際に意味するのは、これらのタイプはそれぞれトランスフォーム行列を含むということだ。各子アイテムは親のトランスフォームを継承するので、空間アイテムの場合、親子関係は重要です。
もう1つのクラスのアイテムはリソースです。リソース・アイテムは、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
- デフォルトマテリアル
- PrincipledMaterial
- CustomMaterial
- Effect
- SceneEnvironment
ビュー3Dとレンダーレイヤー
フロントエンドとバックエンドの分離に関しては、View3D がレンダリングするシーンコンテンツを定義するものであるため、View3D がユーザーの視点からの分離ポイントです。Qt Quick Spatial Scene Graphでは、レンダリングされるシーンのルート・ノードはLayerノードです。レイヤー・ノードはView3D のプロパティとSceneEnvironment のプロパティの組み合わせを使ってView3D によって作成されます。View3D のシーンをレンダリングするとき、シーンをレンダリングするためにレンダラーに渡されるのはこのレイヤー・ノードです。
シーンのレンダリング
レンダーターゲットの設定
レンダリングプロセスの最初のステップは、シーンのレンダーターゲットを決定し、設定することです。SceneEnvironment でどのプロパティを設定するかによって、実際のレンダー ターゲットは異なります。最初の決定は、コンテンツがウィンドウサーフェスに直接レンダリングされるか、オフスクリーンテクスチャにレンダリングされるかです。デフォルトでは、View3D 、オフスクリーンテクスチャにレンダリングされます。ポストプロセッシングエフェクトを使用する場合、オフスクリーンテクスチャへのレンダリングは必須です。
シーンレンダリングターゲットが決定されると、いくつかのグローバルステートが設定されます。
- ウィンドウサイズ - ウィンドウにレンダリングする場合。
- ビューポート - レンダリングされるシーン領域のサイズ。
- scissor rect - ビューポートがクリッピングされるべきウィンドウのサブセット。
- clear color - レンダーターゲットをクリアする色。
レンダリングの準備
レンダリングの次の段階は準備段階で、レンダラーがハウスキーピングを行い、指定されたフレームで何がレンダリングされる必要があるかを把握し、必要なリソースがすべて利用可能で最新であることを確認します。
準備段階自体には2つのフェーズがあります。何をレンダリングし、どのリソースが必要かを決定する高レベルの準備と、RHIを使用して実際にレンダリングパイプラインとバッファを設定し、メインシーンパスのレンダリング依存関係を設定する低レベルの準備です。
高レベルのレンダリング準備
このフェーズの目的は、空間シーングラフの状態を、レンダーコマンドの作成に使用できるものに抽出することです。ここでの概要は、レンダラーが、照明状態のセットを持つ単一のカメラの視点からレンダリングするジオメトリとマテリアルの組み合わせのリストを作成するということです。
最初に行われるのは、すべてのコンテンツのグローバルな共通ステートを決定することです。SceneEnvironment がlightProbe を定義している場合、そのライトプローブテクスチャに関連付けられている環境マップがロードされているかどうかをチェックし、ロードされていない場合は新しい環境マップをロードまたは生成します。環境の生成自体は、ソーステクスチャをキューブマップに畳み込むための一連のパスとなります。このキューブマップは、マテリアルシェーディングに使用される放射照度と鏡面反射情報の両方を含みます。
次に、レンダラーがシーン内のどのカメラを使用するかを決定する必要があります。アクティブなカメラがView3D で明示的に定義されていない場合は、シーンで使用可能な最初のカメラが使用されます。シーン内にカメラがない場合、コンテンツはレンダリングされず、レンダラーはベールアウトします。
カメラが決まれば、このフレームの投影行列を計算できます。各レンダラブルはどのように投影されるかを知る必要があるため、この時点で計算が行われます。これは、どのレンダリング項目をレンダリングすべきかを計算できるようになったことも意味します。すべてのレンダリング可能アイテムのリストから始めて、無効または完全に透明であるため表示されないアイテムをすべて削除します。次に、アクティブなカメラでフラストラムカリングが有効になっている場合、レンダリング可能な各アイテムがカメラのフラストラムのビューから完全に外れているかどうかをチェックし、外れている場合はレンダリング可能リストから削除します。
カメラの投影に加え、カメラの方向も計算されます。これは、シェーディング コードのライティング計算に必要だからです。
シーン内にライトノードがある場合、利用可能な最大ライトの長さのリストに集められます。シーン内にレンダラーがサポートするライトの数よりも多くのライトノードが存在する場合、その制限を超える追加のライトノードは無視され、シーンのライティングに寄与しません。ライトノードのスコープを指定することは可能ですが、スコープを設定しても、各ライトのライティング状態は、ライティングを持つすべてのマテリアルに送信されますが、スコープにないライトの明るさは 0 に設定されるため、実際には、それらのライトはそれらのマテリアルのライティングに寄与しないことに注意してください。
レンダラブルのリストが短くなったので、シーンの現在の状態を反映するために、各項目を更新する必要があります。各レンダラブルに対して、適切なマテリアルがロードされているかチェックし、ロードされていない場合は新しいマテリアルを作成します。マテリアルは、シェーダーとレンダリングパイプラインの組み合わせで、描画コールを作成するために必要です。さらにレンダラーは、レンダラブルのレンダリングに必要なリソースがロードされていることを確認します。たとえば、モデルに設定されたジオメトリやテクスチャなどです。まだロードされていないリソースはここでロードされます。
次に、レンダラブル リストは 3 つのリストにソートされます。
- Opaque Items(不透明なアイテム):前面から背面へ、言い換えると、カメラに最も近いアイテムからカメラから最も遠いアイテムへとソートされます。これは、ハードウェアオクルージョンカリングやフラグメントシェーダーの早期Z検出を利用するために行われます。
- 2D アイテム: Qt Quick レンダラーによってレンダリングされるQtQuick アイテムです。
- 透明アイテム:背面から前面へ、言い換えると、カメラから最も遠いアイテムからカメラに最も近いアイテムへとソートされます。これは、透明なアイテムは、その後ろにあるすべてのアイテムとブレンドする必要があるためです。
ローレベルレンダーの準備
このフレームで考慮すべきことがすべて決定されたので、メインのレンダーパスの配管と依存関係に対処できます。このフェーズで最初に行うことは、メインパスに必要なプリパスをレンダリングすることです。
- DepthPassのレンダリング - Screen Space Ambient OcclusionやShadowingのような特定の機能は、深度プリパスを必要とします。このパスは、すべての不透明なアイテムが深度テクスチャにレンダリングされます。
- Render SSAOPass - Screen Space Ambient Occlusionパスの目的は、アンビエントオクルージョンテクスチャを生成することです。このテクスチャは、シェーディング時に特定のエリアを暗くするためにマテリアルによって後で使用されます。
- レンダリングシャドウパス(Render ShadowPasses) - 影が有効になっているシーン内の各ライトは、追加のシャドウパスに寄与します。レンダラーには 2 つの異なるシャドウイング テクニックがあるため、ライト タイプによって異なるパスがあります。指向性ライトからシャドウをレンダリングする場合、シーンは指向性ライトの方向とカメラフラクタムのサイズの組み合わせから2Dオクルージョンテクスチャにレンダリングされます。ポイントライトやスポットライトから影をレンダリングする場合、ライトのオクルージョンテクスチャは、ライトの各面方向に対するオクルージョン寄与を表す立方体マップになります。
- スクリーンテクスチャをレンダリングする - このパスは、スクリーンテクスチャを必要とするCustomMaterial を使用する場合にのみ発生します。このパスは深度パスのように動作しますが、代わりにすべての不透明なアイテムをカラーテクスチャにレンダリングします。
依存関係のレンダリングが終わると、残りのパスの準備は行われますが、レンダリングは行われません。この準備には、高レベルの準備ステージで収集されたステートを取り込み、ユニフォームバッファ値の作成/更新、サンプラーと依存テクスチャの関連付け、シェーダーリソースバインディングのセットアップ、描画コールの実行に必要なパイプラインステートの作成に関わる他のすべてのもののようなグラフィックプリミティブに変換することが含まれます。
シーンレンダリング
準備の大変な作業が終わったので、簡単なのはメインシーンのコンテンツに貢献するコマンドを実行することです。レンダリングはこの順番で動作する:
- クリアパス(Clear Pass) - これは実際にはパスではありませんが、SceneEnvironment に設定されている backgroundMode によって、ここでさまざまなことが起こります。背景モードが透明またはカラーの場合、カラーバッファは透明または指定されたカラーでクリアされます。ただし、背景モードが SkyBox に設定されている場合は、カメラの視点から SkyBox をレンダリングするパスが実行され、バッファも初期データで満たされます。
- 不透明パス - 次に、すべての不透明アイテムが描画されます。これはパイプラインの状態を設定し、各アイテムの描画コマンドをリストの順番に実行するだけです。
- 2D パス - シーンに 2D アイテムがある場合は、Qt Quick レンダラーが呼び出され、それらのアイテムをレンダリングするために必要なレンダリングコマンドが生成されます。
- 透明パス - 最後に、シーン内の透明アイテムが不透明アイテムと同じ方法で1つずつレンダリングされます。
これでシーンのレンダリングは終了です。
後処理
後処理機能が有効になっている場合、シーンレンダラの結果は、後処理フェーズの入力であるテクスチャであると仮定できます。すべての後処理メソッドは、このシーン入力テクスチャを操作する追加パスです。
後処理フェーズのすべてのステップはオプションであり、ビルトイン機能とユーザー定義エフェクトが有効になっていない場合、シーンレンダーの出力は最終レンダーターゲットで使用されるものです。ただし、tonemapping はデフォルトで有効になっています。
ビルトイン・ポストプロセッシング
ExtendedSceneEnvironment およびその親タイプ( )は、3Dシーンで使用される最も一般的なエフェクトと、レンダラーによって生成されたハイダイナミックレンジのカラー値を0~1 LDR範囲にマッピングするために使用されるトーンマッピングを提供します。エフェクトには、被写界深度、グロー/ブルーム、レンズフレア、ビネット、カラー調整とグレーディング、フォグ、アンビエントオクルージョンなどがあります。SceneEnvironment
後処理エフェクト
アプリケーションは、独自のカスタム後処理エフェクトをSceneEnvironment::effects プロパティの順序付きリストとして指定できます。このリストが空でない場合、その中のエフェクトは、ExtendedSceneEnvironment によって提供されるビルトインエフェクトの前に適用されます。各後処理エフェクトは、前のエフェクトの出力が次のエフェクトの入力になるようなチェーンの一部です。このチェーンの最初のエフェクトは、シーンレンダラーステップの出力から直接入力を得ます。エフェクトがシーンレンダラの深度テクスチャ出力にアクセスすることも可能です。
このプロセスの各エフェクトは複数のサブパスで構成することができ、これは中間バッファにコンテンツをレンダリングすることが可能であることを意味します。マルチパスエフェクトの最終パスは、ポスト処理フェーズの次のステップで使用されるカラーデータを含む単一のテクスチャを出力することが期待されます。
テンポラルおよびプログレッシブアンチエイリアス
Temporal and Progressive Antialiasing steps are optional enabled by setting properties in theSceneEnvironment. 厳密にはポスト処理フェーズの一部ではありませんが、Temporal and Progressive Antialiasingの実際の結果はポスト処理フェーズで実現されます。
Temporal Antialiasingは、シーンがアクティブに更新されているときに実行されます。有効にすると、アクティブカメラは、シーンを描画しながら、各フレームのカメラ方向に非常に小さな調整を行います。現在のフレームは、レンダリングされたものを滑らかにするために、以前にレンダリングされたフレームとブレンドされます。
プログレッシブ・アンチエイリアスは、シーンが更新されていないときにのみ実行されます。有効にすると、更新が強制され、シーンの現在の状態が、アクティブなカメラの方向に非常に小さな調整を加えてレンダリングされます。最大8つのフレームが蓄積され、あらかじめ設定された重みでブレンドされます。これは非アニメーションシーンを滑らかにする効果がありますが、更新のたびに余分なフレームがレンダリングされるため、パフォーマンスが犠牲になります。
スーパーサンプリング・アンチエイリアス(SSAA)
スーパーサンプリングアンチエイリアシングは、シーンを滑らかにする総当たり的な方法です。これは、シーンの要求サイズの倍数であるテクスチャにレンダリングし、その後、ターゲットサイズにダウンサンプリングすることで動作します。たとえば、2倍のSSAAが要求された場合、シーンは意図されたサイズの2倍のテクスチャにレンダリングされ、その後、この段階の一部としてダウンサンプリングされます。これはパフォーマンスとリソース使用量に大きな影響を与える可能性があるため、可能であれば避けるべきです。また、View3D のサイズが大きすぎて、この方法が使えないこともあります。この方法に必要なテクスチャは、レンダリングハードウェアがサポートするサイズよりも大きい可能性があるからです。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。