QSGMaterial Class
QSGMaterialクラスは、シェーダープログラムのレンダリング状態をカプセル化します。詳細...
Header: | #include <QSGMaterial> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
qmake: | QT += quick |
Inherited By: | QSGFlatColorMaterial, QSGOpaqueTextureMaterial, and QSGVertexColorMaterial |
- 継承メンバを含む全メンバ一覧
- QSGMaterial はQt Quick Scene Graph Material Classes の一部です。
パブリックタイプ
enum | Flag { Blending, RequiresDeterminant, RequiresFullMatrixExceptTranslate, RequiresFullMatrix, NoBatching, CustomCompileStep } |
flags | Flags |
パブリック関数
virtual int | compare(const QSGMaterial *other) const |
virtual QSGMaterialShader * | createShader(QSGRendererInterface::RenderMode renderMode) const = 0 |
QSGMaterial::Flags | flags() const |
void | setFlag(QSGMaterial::Flags flags, bool on = true) |
virtual QSGMaterialType * | type() const = 0 |
(since 6.8) int | viewCount() const |
詳しい説明
QSGMaterial とQSGMaterialShader サブクラスは、緊密な関係を形成しています。1つのシーングラフ(ネストされたグラフを含む)に対して、シーングラフがそのマテリアルをレンダリングするために使用するシェーダ(ジオメトリのフラットカラーリングのためのシェーダなど)をカプセル化する、1つのユニークなQSGMaterialShader インスタンスがあります。各QSGGeometryNode は、ジオメトリのレンダリングに使用する実際の色など、そのノードを描画するときにシェーダがどのように設定されるべきかを含む一意の QSGMaterial を持つことができます。
QSGMaterial には 2 つの仮想関数があり、どちらも実装する必要があります。関数type() は、特定のサブクラスのすべてのインスタンスに対して一意のインスタンスを返す必要があります。createShader() 関数は、QSGMaterial のそのサブクラスに固有のQSGMaterialShader の新しいインスタンスを返す必要があります。
最小限のQSGMaterialの実装はこのようになります:
class Material : public QSGMaterial { public: QSGMaterialType *type() const override { static QSGMaterialType type; return &type; } QSGMaterialShader *createShader(QSGRendererInterface::RenderMode) const override { return new Shader; } };
QSGGeometryNode とカスタムマテリアルに支えられたQQuickItem サブクラスの実装については、カスタムマテリアルの例を参照してください。
注: createShader() はシェーダー準備の冗長な作業を減らすために、QSGMaterialType ごとに一度だけ呼び出されます。QSGMaterial が複数の頂点シェーダとフラグメントシェーダの組み合わせでバッ クアップされている場合、type() の実装は、シェーダの組み合わせ ごとに異なる一意のQSGMaterialType ポインタを返す必要があります。
注意: QSG 接頭辞を持つすべてのクラスは、シーングラフのレンダリングスレッドでのみ使用する必要があります。詳しくはシーングラフとレンダリングを参照してください。
QSGMaterialShader 、Scene Graph - Custom Material、Scene Graph - Two Texture Providers、Scene Graph - Graphも参照して ください。
メンバタイプのドキュメント
enum QSGMaterial::Flag
flags QSGMaterial::Flags
定数 | 値 | 説明 |
---|---|---|
QSGMaterial::Blending | 0x0001 | マテリアルがレンダリング中にブレンドを有効にする必要がある場合、このフラグを true に設定します。 |
QSGMaterial::RequiresDeterminant | 0x0002 | マテリアルがジオメトリ ノードの行列式に依存してレンダリングする場合は、このフラグを true に設定します。 |
QSGMaterial::RequiresFullMatrixExceptTranslate | 0x0004 | RequiresDeterminant | マテリアルがレンダリングにジオメトリノードの行列(平行移動部分を除く)の完全な行列に依存する場合、このフラグを true に設定します。 |
QSGMaterial::RequiresFullMatrix | 0x0008 | RequiresFullMatrixExceptTranslate | マテリアルがレンダリングのためにジオメトリノードの完全な行列に依存する場合、このフラグを true に設定します。 |
QSGMaterial::NoBatching | 0x0010 | マテリアルがシーングラフのバッチメカニズムと互換性のないシェーダを使用している場合、このフラグを true に設定します。これは、バーテックスシェーダでgl_Position.z を直接操作するような、特定の高度な使い方に関連します。このような解決策は、特定のシーン構造に縛られることが多く、シーンの任意の内容で使用するのは安全でない可能性が高いです。したがって、このフラグは適切な調査の後にのみ設定されるべきであ り、大多数のマテリアルで必要になることはないでしょう。このフラグを設定すると、より多くの描画コールを発行する必要があるため、パフォーマンスが低下する可能性があります。このフラグは Qt 6.3 で導入されました。 |
QSGMaterial::CustomCompileStep | NoBatching | Qt 6では、このフラグはNoBatchingと同じです。代わりにNoBatchingを使うことをお勧めします。 |
Flags 型はQFlags<Flag> の typedef です。Flagの値のORの組み合わせを格納します。
メンバ関数のドキュメント
[virtual]
int QSGMaterial::compare(const QSGMaterial *other) const
このマテリアルをother と比較し、等しければ 0 を返す。このマテリアルがother よりも先にソートされるべき場合は -1、other よりも先にソートされるべき場合は 1 を返す。
シーングラフは、ジオメトリノードを並べ替えることで、状態の変化を最小限に抑えることができる。compare 関数は、QSGMaterialShader::updateState() を呼び出すたびにマテリアルをソートして状態変化を最小化できるように、ソート処理中に呼び出されます。
このポインタとother は同じtype() であることが保証されます。
[pure virtual]
QSGMaterialShader *QSGMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const
この関数は、QSGMaterial の特定の実装のジオメトリをレンダリングするために使用されるQSGMaterialShader 実装の新しいインスタンスを返します。
この関数は、マテリアルタイプとrenderMode の組み合わせごとに 1 回だけ呼び出され、内部的にキャッシュされます。
ほとんどのマテリアルではrenderMode は無視できます。いくつかのマテリアルは特定のレンダリングモードに対してカスタム処理が必要な場合があります。例えば、RenderMode3Dが使用されているときに、マテリアルがパースペクティブ変換を考慮する必要がある方法でアンチエイリアシングを実装している場合などです。
QSGMaterial::Flags QSGMaterial::flags() const
マテリアルのフラグを返します。
void QSGMaterial::setFlag(QSGMaterial::Flags flags, bool on = true)
on が true の場合、このマテリアルの flagsflags を設定します。そうでない場合、属性はクリアされます。
[pure virtual]
QSGMaterialType *QSGMaterial::type() const
この関数はシーングラフによって呼び出され、createShader() によってインスタンス化されたQSGMaterialShader に固有の識別子を問い合わせます。
多くのマテリアルでは、静的でグローバルに利用可能なQSGMaterialType インスタンスへのポインタを返すのが一般的です。QSGMaterialType は不透明なオブジェクトです。このオブジェクトの目的は、一意な材料識別子を生成するための、型安全で単純な方法としての役割を果たすことだけです。
QSGMaterialType *type() const override { static QSGMaterialType type; return &type; }
[since 6.8]
int QSGMaterial::viewCount() const
戻り値 マテリアルがマルチビューレンダリングで使用される場合のビュー数。
注意: 戻り値は、createShader() から呼び出されたときと、それ以降にのみ有効です。この値は、createShader ()がシーングラフによって呼び出される前に、必ずしも最新であるとは限りません。
通常、戻り値は1
である。ビューカウントが 2 より大きい場合は、マルチビューレンダーパスを意味します。マルチビューをサポートするマテリアルは、createShader() 内、またはQSGMaterialShader コンストラクタ内で viewCount() を照会し、適切なシェーダが選択されるようにします。バーテックスシェーダは、マルチビューモードでは複数の行列があるため、gl_ViewIndex
を使用してモデルビュー-投影行列配列にインデックスを付けることが期待されます。(各ビューに1つずつ)。
例として、次のような単純な頂点シェーダを見てみましょう:
#version 440 layout(location = 0) in vec4 vertexCoord; layout(location = 1) in vec4 vertexColor; layout(location = 0) out vec4 color; layout(std140, binding = 0) uniform buf { mat4 matrix[2]; float opacity; }; void main() { gl_Position = matrix[gl_ViewIndex] * vertexCoord; color = vertexColor * opacity; }
このシェーダは、2 つのビュー、および 2 つのビューだけを扱うように準備 されています。他のビュー数には対応していません。シェーダのコンディショニングを行う場合、--view-count 2
でqsb
ツールを起動するか、CMake インテグレーションを使用する場合は、qt_add_shaders()
コマンドでVIEW_COUNT 2
を指定する必要があります。
注: #extension GL_EXT_multiview : require
の行は、ビューカウントが 2 以上に設定されるたびに、qsb
によって自動的に注入されます。
開発者は、自動的に注入されるプリプロセッサー変数QSHADER_VIEW_COUNT
を使用して、異なるビュー数の取り扱いを簡素化することが推奨されます。例えば、同じソース・ファイルで、ビュー数が2の非マルチビューとマルチビューの両方をサポートする必要がある場合、次のようにすることができます:
#version 440 layout(location = 0) in vec4 vertexCoord; layout(location = 1) in vec4 vertexColor; layout(location = 0) out vec4 color; layout(std140, binding = 0) uniform buf { #if QSHADER_VIEW_COUNT >= 2 mat4 matrix[QSHADER_VIEW_COUNT]; #else mat4 matrix; #endif float opacity; }; void main() { #if QSHADER_VIEW_COUNT >= 2 gl_Position = matrix[gl_ViewIndex] * vertexCoord; #else gl_Position = matrix * vertexCoord; #endif color = vertexColor * opacity; }
同じソースファイルをqsb
またはqt_add_shaders()
で2回実行することができます。1回目はビュー数を指定せずに、もう1回目はビュー数を2に設定して実行します。
CMakeを使用すると、次のようになります。この例では、対応するQSGMaterialShader は、viewCount()の値に基づいて:/shaders/example.vert.qsb
と:/shaders/multiview/example.vert.qsb
のどちらかを選択することになります。(フラグメントシェーダも同様です。)
qt_add_shaders(application "application_shaders" PREFIX / FILES shaders/example.vert shaders/example.frag ) qt_add_shaders(application "application_multiview_shaders" GLSL 330,300es HLSL 61 MSL 12 VIEW_COUNT 2 PREFIX / FILES shaders/example.vert shaders/example.frag OUTPUTS shaders/multiview/example.vert shaders/multiview/example.frag )
注: フラグメントシェーダは頂点シェーダと同じように扱われるべきで すが、たとえフラグメントシェーダのコードがビューカウント (gl_ViewIndex
) に依存できないとしても、移植性を最大にするためです。フラグメントシェーダもマルチビューセットに含める理由は 2 つあります。たとえば D3D12 では、シェーダモデル 5.0 と 6.1 の HLSL シェーダを混ぜるとエラーになります。たとえば D3D12 では、シェーダモデル 5.0 と 6.1 の HLSL シェーダを混在させるとエラーが発生します。もう 1 つは、QSHADER_VIEW_COUNT
をフラグメントシェーダで定義しておくと、たとえば頂点ステージとフラグメントステー ジ間で均一なバッファレイアウトを共有するときに非常に便利です。
注意: OpenGL の場合、gl_ViewIndex
に依存する頂点シェーダーの最小 GLSL バージョンは330
です。これより低いバージョンはビルド時に受け入れられますが、 OpenGL の実装によっては実行時にエラーになる可能性があります。
便宜上、qt_add_shaders() にはMULTIVIEW
オプションもあります。これはまずqsb
ツールを通常通り実行し、次にVIEW_COUNT
を2
にオーバーライドし、GLSL
、HLSL
、MSL
を適切なデフォルトに設定し、qsb
を再度実行します。材料実装では、viewCount
引数を取るQSGMaterialShader::setShaderFileName() オーバーロードを使用することができ、自動的に正しい .qsb ファイルを選択します。
従って、手動で管理する出力ファイルを指定する必要がないことを除けば、以下は上記の呼び出し例とほぼ同じです。自動的に選択されたシェーディング言語バージョンでは十分でない場合があることに注意してください。
qt_add_shaders(application "application_multiview_shaders" MULTIVIEW PREFIX / FILES shaders/example.vert shaders/example.frag )
Qtのマルチビュー・サポートに関する、より低レベルの詳細については、QRhi::MultiView 、QRhiColorAttachment::setMultiViewCount ()、QRhiGraphicsPipeline::setMultiViewCount ()を参照してください。Qt Quick シーングラフ・レンダラは、QQuickRenderTarget::fromRhiRenderTarget() や、fromVulkanImage() のような 3D API 固有の関数で、arraySize
引数が 1 より大きい場合に、マルチビュー・レンダー・ターゲットを認識します。
この関数は Qt 6.8 で導入されました。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。