QSGMaterialShader Class
QSGMaterialShader クラスは、グラフィックス API に依存しないシェーダープログラムを表します。詳細...
| ヘッダー: | #include <QSGMaterialShader> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
| qmake: | QT += quick |
- 継承されたメンバーを含む、すべてのメンバーの一覧
- QSGMaterialShaderは、Qt Quick のシーングラフマテリアルクラスの一部です。
パブリック型
| struct | GraphicsPipelineState |
| class | RenderState |
| enum | Flag { UpdatesGraphicsPipelineState } |
| flags | Flags |
パブリック関数
| QSGMaterialShader() | |
(since 6.4) int | combinedImageSamplerCount(int binding) const |
| QSGMaterialShader::Flags | flags() const |
| void | setFlag(QSGMaterialShader::Flags flags, bool on = true) |
| void | setFlags(QSGMaterialShader::Flags flags) |
| virtual bool | updateGraphicsPipelineState(QSGMaterialShader::RenderState &state, QSGMaterialShader::GraphicsPipelineState *ps, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) |
| virtual void | updateSampledImage(QSGMaterialShader::RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) |
| virtual bool | updateUniformData(QSGMaterialShader::RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) |
保護された関数
| void | setShader(QSGMaterialShader::Stage stage, const QShader &shader) |
| void | setShaderFileName(QSGMaterialShader::Stage stage, const QString &filename) |
(since 6.8) void | setShaderFileName(QSGMaterialShader::Stage stage, const QString &filename, int viewCount) |
詳細な説明
QSGMaterialShader は、頂点シェーダーとフラグメントシェーダーの組み合わせ、グラフィックスパイプラインの状態変化を定義するデータ、およびユニフォームバッファやテクスチャなどのグラフィックスリソースを更新するロジックを表します。
注: QSG という接頭辞を持つすべてのクラスは 、シーングラフのレンダリングスレッドでのみ使用する必要があります。詳細については、「シーングラフとレンダリング」を参照してください。
QSGMaterial とQSGMaterialShaderは密接な関係にあります。 1つのシーングラフ(ネストされたグラフを含む)に対して、そのマテリアルを使用してオブジェクトをレンダリングするためにシーングラフが使用するシェーダーやその他のデータをカプセル化した、一意のQSGMaterialShaderインスタンスが1つ存在します。各QSGGeometryNode には、そのノードの描画中にグラフィックスパイプラインをどのように構成すべきかを定義する、一意のQSGMaterial を1つ持つことができます。 QSGMaterialShaderのインスタンスは、ユーザーによって明示的に作成されることはなく、QSGMaterial::createShader()を通じてシーングラフによって必要に応じて作成されます。シーングラフはQSGMaterial::createShader()メソッドを呼び出すことでQSGMaterialShaderのインスタンスを作成し、各シェーダー実装のインスタンスが1つだけ存在することを保証します。
Qt 5 では、QSGMaterialShader は OpenGL に紐付けられていました。これはQOpenGLShaderProgram を直接基盤としており、updateState() のような、任意の OpenGL コマンドを発行できる関数を備えていました。 Qt 6では、この仕様は変更されました。QSGMaterialShaderは厳密にはデータ指向ではなく、データ(シェーダーや必要なパイプライン状態の変更)と、ユニフォームバッファ内のデータを更新するロジックを併せて提供します。 グラフィックスAPIへの直接アクセスは提供されていません。つまり、QSGMaterialShaderは単独でOpenGL、Vulkan、Metal、またはDirect 3Dへの呼び出しを行うことはできません。統一されたシェーダー管理と相まって、これによりQSGMaterialShaderは一度記述するだけで、実行時にサポートされているどのグラフィックスAPIでも機能するようになります。
protected関数setShaderFileName()を呼び出して設定されるシェーダーは、マテリアルがジオメトリからの頂点データをどのように処理するか、およびフラグメントがどのようにシェーディングされるかを制御します。通常、QSGMaterialShaderは生成時に頂点シェーダーとフラグメントシェーダーを設定します。その後でシェーダーを変更しても、意図した効果が得られない可能性があるため、避ける必要があります。
Qt 6では、デフォルトのアプローチとして、.qsb ファイルをアプリケーションに同梱します。通常、これらはリソースシステムを介して組み込まれ、setShaderFileName()の呼び出し時に参照されます。.qsb ファイルは、QtのShader Tools モジュールに含まれるqsb ツールを使用して、Vulkan形式のGLSLソースコードからオフラインで、遅くともアプリケーションのビルド時に生成されます。
オーバーライド可能な仮想関数は3つあります。これらは、ユニフォームバッファ、テクスチャ、およびパイプライン状態の変更のためのデータ、あるいはデータを生成するためのロジックを提供します。
updateUniformData() は、サブクラスで最も一般的に再実装される関数です。この関数は、QByteArray の内容を更新し、それをユニフォームバッファとしてシェーダーに公開することが期待されています。頂点シェーダーまたはフラグメントシェーダーにユニフォームブロックを持つすべての QSGMaterialShader は、updateUniformData() を再実装する必要があります。
updateSampledImage()は、シェーダーコードがテクスチャをサンプリングする際に重要になります。この関数は各サンプラー(該当するAPIでは複合画像サンプラー)に対して呼び出され、シェーダーにどのQSGTexture を公開するかを指定するオプションが与えられます。
シェーダーパイプラインの状態変更は、あまり頻繁には使用されません。使用例の一つとして、特定のブレンドモードを使用したいマテリアルが挙げられます。関連する関数はupdateGraphicsPipelineState() です。この関数は、QSGMaterialShader がフラグUpdatesGraphicsPipelineState を設定して有効にしていない限り、呼び出されません。この関数の役割は、渡されたGraphicsPipelineState 構造体インスタンスを、希望する変更内容で更新することです。 現在利用可能なのはブレンディングおよびカリング関連の機能のみであり、その他の状態はマテリアルによって制御することはできません。
テクスチャのサポートも含む最小限の例としては、次のようなものが考えられます。ここでは、Material がQSGMaterial であり、そのcreateShader() 内で Shader のインスタンスを作成し、フラグメントシェーダーでサンプリングしたいQSGTexture を保持していると仮定します。頂点シェーダーは、モデルビュー投影行列のみに依存しています。
class Shader : public QSGMaterialShader
{
public:
Shader()
{
setShaderFileName(VertexStage, QLatin1String(":/materialshader.vert.qsb"));
setShaderFileName(FragmentStage, QLatin1String(":/materialshader.frag.qsb"));
}
bool updateUniformData(RenderState &state, QSGMaterial *, QSGMaterial *)
{
bool changed = false;
QByteArray *buf = state.uniformData();
if (state.isMatrixDirty()) {
const QMatrix4x4 m = state.combinedMatrix();
memcpy(buf->data(), m.constData(), 64);
changed = true;
}
return changed;
}
void updateSampledImage(RenderState &, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *)
{
Material *mat = static_cast<Material *>(newMaterial);
if (binding == 1)
*texture = mat->texture();
}
};シェーダー用のVulkanスタイルのGLSLソースコードは、次のようなものになるでしょう。これらは、qsb ツールを使用してオフラインでプリプロセスされることが想定されており、その処理によって、Shader() のコンストラクタで参照される.qsb ファイルが生成されます。
#version 440
layout(location = 0) in vec4 aVertex;
layout(location = 1) in vec2 aTexCoord;
layout(location = 0) out vec2 vTexCoord;
layout(std140, binding = 0) uniform buf {
mat4 qt_Matrix;
} ubuf;
out gl_PerVertex { vec4 gl_Position; };
void main() {
gl_Position = ubuf.qt_Matrix * aVertex;
vTexCoord = aTexCoord;
}#version 440
layout(location = 0) in vec2 vTexCoord;
layout(location = 0) out vec4 fragColor;
layout(binding = 1) uniform sampler2D srcTex;
void main() {
vec4 c = texture(srcTex, vTexCoord);
fragColor = vec4(c.rgb * 0.5, 1.0);
}注: QSGというプレフィックスを持つすべてのクラスは 、シーングラフのレンダリングスレッドでのみ使用する必要があります。詳細については、「シーングラフとレンダリング」を参照してください。
関連項目: QSGMaterial 、シーングラフ - カスタムマテリアル、シーングラフ - 2つのテクスチャプロバイダ、およびシーングラフ - グラフ。
メンバ型のドキュメント
enum QSGMaterialShader::Flag
flags QSGMaterialShader::Flags
特殊な材料特性を示すフラグ値。
| 定数 | 値 | 説明 |
|---|---|---|
QSGMaterialShader::UpdatesGraphicsPipelineState | 0x0001 | このフラグを設定すると、updateGraphicsPipelineState() の呼び出しが可能になります。 |
Flags 型は、QFlags<Flag> の typedef です。Flag 値の OR 組み合わせを格納します。
メンバ関数のドキュメント
QSGMaterialShader::QSGMaterialShader()
新しい QSGMaterialShader を作成します。
[since 6.4] int QSGMaterialShader::combinedImageSamplerCount(int binding) const
binding にある結合済み画像サンプラー変数の要素数を返します。この値は、シェーダーコードからイントロスペクションによって取得されます。この変数は配列である場合があり、多次元である場合もあります。
このカウント値は、変数内の結合された画像サンプラー項目の総数を反映します。以下の例では、srcA のカウントは1、srcB は4、srcC は6となります。
layout (binding = 0) uniform sampler2D srcA;
layout (binding = 1) uniform sampler2D srcB[4];
layout (binding = 2) uniform sampler2D srcC[2][3];このカウント値は、QSGMaterialShader::updateSampledImage のtextureパラメータに含まれるQSGTexture ポインタの数です。
この関数は Qt 6.4 で導入されました。
「QSGMaterialShader::updateSampledImage」も参照してください 。
QSGMaterialShader::Flags QSGMaterialShader::flags() const
このマテリアルシェーダーに対して現在設定されているフラグを返します。
setFlags()も参照してください 。
void QSGMaterialShader::setFlag(QSGMaterialShader::Flags flags, bool on = true)
on がtrueの場合、このマテリアルシェーダーのflags を設定します。それ以外の場合は、指定されたフラグをクリアします。
void QSGMaterialShader::setFlags(QSGMaterialShader::Flags flags)
このマテリアルシェーダーのflags を設定します。
「flags()」も参照してください 。
[protected] void QSGMaterialShader::setShader(QSGMaterialShader::Stage stage, const QShader &shader)
指定されたstage に対して、shader を設定します。
[protected] void QSGMaterialShader::setShaderFileName(QSGMaterialShader::Stage stage, const QString &filename)
指定されたstage に対するシェーダーのfilename を設定します。
このファイルには、シリアル化されたQShader が含まれていることが想定されます。
警告: .qsb ファイルを含むシェーダーは 、信頼できるコンテンツであるとみなされます。アプリケーション開発者は、アプリケーションの一部ではないユーザー提供のコンテンツの読み込みを許可する前に、その潜在的な影響を慎重に検討することをお勧めします。
[protected, since 6.8] void QSGMaterialShader::setShaderFileName(QSGMaterialShader::Stage stage, const QString &filename, int viewCount)
指定されたstage のシェーダーに対して、filename を設定します。
このファイルには、シリアライズされたQShader が含まれていることが想定されます。
このオーバーロードは、multiview レンダリングを有効にする場合、特にビルドシステムの MULTIVIEW 便利オプションが使用される場合に使用されます。
viewCount は 2、3、または 4 である必要があります。filename はこれに基づいて自動的に調整されます。
警告: .qsb ファイルを含むシェーダーは 、信頼できるコンテンツであるとみなされます。アプリケーション開発者は、アプリケーションの一部ではないユーザー提供のコンテンツの読み込みを許可する前に、その潜在的な影響を慎重に検討することをお勧めします。
この関数は Qt 6.8 で導入されました。
[virtual] bool QSGMaterialShader::updateGraphicsPipelineState(QSGMaterialShader::RenderState &state, QSGMaterialShader::GraphicsPipelineState *ps, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
この関数は、シーングラフによって呼び出され、マテリアルがカスタムなグラフィックス状態のセットを提供できるようにします。マテリアルごとにカスタマイズ可能な状態のセットは、ブレンディングおよび関連する設定に限定されます。
注:この関数は 、setFlags() を通じてUpdatesGraphicsPipelineState フラグが有効にされた場合にのみ呼び出されます。デフォルトではこのフラグは設定されていないため、この関数は決して呼び出されません。
ps のメンバーのいずれかに変更が加えられた場合は、戻り値は必ずtrue でなければなりません。
注: ps の内容は 、この関数の呼び出し間で保持されません。
現在のレンダリング用 `state ` は、シーングラフから渡されます。
サブクラス固有の状態は、newMaterial から抽出できます。oldMaterial が null の場合、このシェーダーはアクティブになったばかりです。
[virtual] void QSGMaterialShader::updateSampledImage(QSGMaterialShader::RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
この関数は、シーングラフによって呼び出され、シェーダー内でのサンプリング済み画像(通常は複合画像サンプラーの形式)の使用準備を行います。
binding は、サンプラーのバインディング番号です。この関数は、QSGMaterialShader に関連付けられたシェーダーコード内の各複合画像サンプラー変数に対して呼び出されます。
texture は、QSGTexture ポインタの配列です。この配列の要素数は、シェーダーコードで指定された画像サンプラー変数の要素数と一致します。この変数は配列である場合があり、多次元である場合もあります。配列の要素数は、次のようにして確認できます。QSGMaterialShader::combinedImageSamplerCount
texture の要素がnullの場合、戻り値として返される前に、有効なQSGTexture ポインタに設定する必要があります。nullでない場合、新しいQSGTexture * をそこに格納するか、あるいは既に既知のQSGTexture のパラメータを更新するかは、マテリアル側の判断に委ねられます。QSGTexture の所有権は譲渡されません。
現在のレンダリング用state はシーングラフから渡されます。必要に応じて、QSGTexture::commitTextureOperations()を介してテクスチャデータのアップロードをキューに入れるかどうかは、マテリアル側で決定します。
サブクラス固有の状態は、newMaterial から取得できます。
oldMaterial を使用することで、変更を最小限に抑えることができます。oldMaterial が null の場合、このシェーダーはアクティブになったばかりです。
QSGMaterialShader::combinedImageSamplerCountも参照してください 。
[virtual] bool QSGMaterialShader::updateUniformData(QSGMaterialShader::RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
この関数は、シェーダープログラムのユニフォームバッファの内容を更新するために、シーングラフによって呼び出されます。この実装では、実際のグラフィックス演算を実行することは想定されておらず、RenderState::uniformData() から返されるQByteArray へのデータコピーのみを担当します。そのバッファをシェーダー内で可視化するのは、シーングラフの役割です。
現在のレンダリング用state はシーングラフから渡されます。状態が「ダーティ」であることを示している場合、実装はRenderState::uniformData()を介してアクセス可能なバッファデータ内の適切な領域を更新しなければなりません。行列や不透明度などの状態が「ダーティ」でない場合、データは永続的であるため、対応する領域を変更する必要はありません。
ユニフォームデータに変更が加えられた場合は、必ずtrue を戻り値として返さなければなりません。
フラットカラーマテリアルの色など、サブクラス固有の状態は、newMaterial から抽出し、それに応じてバッファ内の関連する領域を更新する必要があります。
oldMaterial を使用すると、マテリアルの状態を更新する際のバッファの変更(通常は memcpy 呼び出し)を最小限に抑えることができます。oldMaterial が null の場合、このシェーダーはアクティブになったばかりです。
© 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.