このページでは

QShaderBaker Class

GLSL/VulkanシェーダーをSPIR-Vにコンパイルし、他のシェーディング言語に変換し、リフレクションメタデータを収集します。詳細...

ヘッダー: #include <qshaderbaker.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS ShaderTools)
target_link_libraries(mytarget PRIVATE Qt6::ShaderTools)
以下より: Qt 6.6

パブリック型

GeneratedShader
enum class GlslOption { GlslEsFragDefaultFloatPrecisionMedium }
flags GlslOptions
enum class SpirvOption { GenerateFullDebugInfo, StripDebugAndVarInfo }
flags SpirvOptions

パブリック関数

QShaderBaker()
~QShaderBaker()
QShader bake()
QString errorMessage() const
void setBatchableVertexShaderExtraInputLocation(int location)
void setBreakOnShaderTranslationError(bool enable)
void setGeneratedShaderVariants(const QList<QShader::Variant> &v)
void setGeneratedShaders(const QList<QShaderBaker::GeneratedShader> &v)
(since 6.9) void setGlslOptions(QShaderBaker::GlslOptions options)
(since 6.7) void setMultiViewCount(int count)
void setPerTargetCompilation(bool enable)
void setPreamble(const QByteArray &preamble)
void setSourceDevice(QIODevice *device, QShader::Stage stage, const QString &fileName = QString())
void setSourceFileName(const QString &fileName)
void setSourceFileName(const QString &fileName, QShader::Stage stage)
void setSourceString(const QByteArray &sourceString, QShader::Stage stage, const QString &fileName = QString())
void setSpirvOptions(QShaderBaker::SpirvOptions options)
void setTessellationMode(QShaderDescription::TessellationMode mode)
void setTessellationOutputVertexCount(int count)

詳細な説明

警告: QShaderBakerは 、Qt GUIモジュールのQRhi クラスファミリー(QShader およびQShaderDescription を含む)と同様に、互換性の保証は限定的です。これらのクラスについては、ソースコードおよびバイナリの互換性が保証されていません。つまり、APIが動作することが保証されるのは、アプリケーションの開発に使用されたQtのバージョンに限られます。 ただし、ソース互換性を損なう変更は最小限に抑えるよう努めており、マイナーリリース(6.7、6.8など)でのみ行われます。アプリケーションでこのクラスを使用するには、(CMakeを使用している場合は)Qt::ShaderToolsPrivate をリンクし、rhi というプレフィックスが付いたヘッダー(例:#include <rhi/qshaderbaker.h> )をインクルードしてください。

QShaderBaker は、グラフィックスシェーダー(頂点シェーダー、フラグメントシェーダーなど)またはコンピュートシェーダーを受け取り、リフレクション情報とともに、そのソースまたはバイトコード形式の複数のバリアントを生成します。結果はQShader インスタンスとして表され、このインスタンスはシンプルかつ高速なシリアライズおよびデシリアライズ機能も提供します。

注:アプリケーションや ライブラリでは 、このクラスを直接使用しないことを推奨します。むしろ、すべてのQtユーザーは、ビルド時にCMakeを介してqsb コマンドラインツールを呼び出し、オフラインコンパイルを利用することを推奨します。qsb ツールはQShaderBakerを使用し、生成されたQShader のシリアライズされたバージョンをファイルに書き込みます。 このクラスの使用は、ユーザーが提供したシェーダーソース文字列や動的に生成されたシェーダーソース文字列を扱う場合など、実行時コンパイルが避けられない場合に限定すべきです。

現時点では、入力形式は常にVulkan仕様のGLSLであると想定されています。 概要についてはGL_KHR_vulkan_glsl 仕様を参照してください。ただし、QtShader Tools モジュールは、Qt Rendering Hardware Interface モジュールのQRhi クラスと組み合わせて使用することを意図しているため、多くの概念や構文(プッシュ定数、ストレージバッファ、サブパス、 など)は現時点では適用できません。将来的には、例えばHLSLからSPIR-Vへのコンパイルが適切と判断された際に、ソース形式としてHLSLを有効にするなど、追加のオプションが導入される可能性があります。

リフレクションメタデータは、QShader::description() を呼び出すことで、生成されたQShader から取得できます。多くの最新のグラフィックス API には組み込みのシェーダーリフレクション機能がないため、シェーダーがどのような頂点入力やシェーダーリソースを期待しており、それらのレイアウトがどのようなものであるかを特定する必要がある場合、これは不可欠です。

典型的なワークフロー

アプリケーションに、次のような頂点シェーダーとフラグメントシェーダーがあると仮定しましょう。

頂点シェーダー:

#version 440

layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;
layout(location = 0) out vec3 v_color;

layout(std140, binding = 0) uniform buf {
    mat4 mvp;
    float opacity;
};

void main()
{
    v_color = color;
    gl_Position = mvp * position;
}

フラグメントシェーダー:

#version 440

layout(location = 0) in vec3 v_color;
layout(location = 0) out vec4 fragColor;

layout(std140, binding = 0) uniform buf {
    mat4 mvp;
    float opacity;
};

void main()
{
    fragColor = vec4(v_color * opacity, opacity);
}

QRhiGraphicsPipeline にそのまま渡せる `QShader ` インスタンスを取得するには、2つの方法があります。シェーダーパックの生成をオフラインで行うか、実行時に行うかです。

前者の方法では、qsb ツールを実行します:

qsb --glsl "100 es,120" --hlsl 50 --msl 12 color.vert -o color.vert.qsb
qsb --glsl "100 es,120" --hlsl 50 --msl 12 color.frag -o color.frag.qsb

この例では、QRhi に適した翻訳ターゲットを使用しています。具体的には、GLSL/ES 100、GLSL 120、HLSL Shader Model 5.0、およびMetal Shading Language 1.2です。

コマンドラインオプションが、setGeneratedShaders() を通じて指定可能な内容とどのように対応しているかに注目してください。生成されたファイルが利用可能になると、それらをアプリケーションに同梱(通常は Qt リソースシステムを介して実行ファイルに埋め込む)でき、実行時に読み込んでQShader::fromSerialized() に渡すことができます。

ここでは示していませんが、qsb にはさらに多くの機能があります。Windowsではfxc を、macOSでは適切なXCodeツールを呼び出し、生成されたHLSLまたはMetalシェーダーコードをバイトコードにコンパイルし、コンパイル済みのバージョンをQShader に含めることも可能です。ベイクされたシェーダーパックがファイルに書き込まれた後、その内容を確認するには、qsb -d を実行します。 詳細については、--help を指定してqsb を実行してください。

別の方法として、実行時に同じ処理を行うこともできます。これには、QShaderBakerインスタンスを作成し、setSourceFileName()を呼び出し、setGeneratedShaders()を使用して変換先を設定します。

baker.setGeneratedShaderVariants({ QShader::StandardShader });
QList<QShaderBaker::GeneratedShader> targets;
targets.append({ QShader::SpirvShader, QShaderVersion(100) });
targets.append({ QShader::GlslShader, QShaderVersion(100, QShaderVersion::GlslEs) });
targets.append({ QShader::SpirvShader, QShaderVersion(120) });
targets.append({ QShader::HlslShader, QShaderVersion(50) });
targets.append({ QShader::MslShader, QShaderVersion(12) });
baker.setGeneratedShaders(targets);
QShader shaders = baker.bake();
if (!shaders.isValid())
    qWarning() << baker.errorMessage();

QShaderも参照してください 。

メンバ型のドキュメント

[alias] QShaderBaker::GeneratedShader

std::pair<QShader::Source,QShaderVersion> の同義語。

enum class QShaderBaker::GlslOption
flags QShaderBaker::GlslOptions

定数値説明
QShaderBaker::GlslOption::GlslEsFragDefaultFloatPrecisionMedium0x01GLSL ES 向けに、フラグメントシェーダー内で `precision mediump float; ` を出力します。

GlslOptions 型は、QFlags<GlslOption> の typedef です。これは、GlslOption 値の論理和(OR)の組み合わせを格納します。

enum class QShaderBaker::SpirvOption
flags QShaderBaker::SpirvOptions

定数値説明
QShaderBaker::SpirvOption::GenerateFullDebugInfo0x01SPIR-Vバイナリ内に追加のデバッグ情報を生成して格納します。
QShaderBaker::SpirvOption::StripDebugAndVarInfo0x02SPIR-Vバイナリからすべてのデバッグ情報および変数名情報を削除する。

SpirvOptions 型は、QFlags<SpirvOption> の typedef です。これは、SpirvOption 値の論理和 (OR) 組み合わせを格納します。

メンバ関数のドキュメント

QShaderBaker::QShaderBaker()

新しい QShaderBaker を生成します。

[noexcept] QShaderBaker::~QShaderBaker()

デストラクタ。

QShader QShaderBaker::bake()

コンパイルおよび翻訳プロセスを実行します。

QShader インスタンスを返します。処理が正常に完了したかどうかを確認するには、QShader::isValid()を呼び出します。false が返された場合は、errorMessage()を呼び出してログを取得してください。

これは処理負荷の高い操作です。アプリケーションからこれを呼び出す場合は、別のスレッドで実行することをお勧めします。

注: QShaderBaker インスタンスは再利用可能です。bake()を呼び出した後、同じインスタンスを異なる入力に対して再度使用できます。ただし、QShaderBaker インスタンスは、その存続期間中、単一のスレッドでのみ使用してください。

QString QShaderBaker::errorMessage() const

最後に実行されたbake()からのエラーメッセージを返します。エラーがなかった場合は、空の文字列を返します。

注:エラーには 、ファイルの読み取りエラー、コンパイルエラー、および翻訳エラーが含まれます。ターゲットやバリアントを指定しなかった場合、結果として生成されるQShader が無効であっても、エラーとはみなされません。

void QShaderBaker::setBatchableVertexShaderExtraInputLocation(int location)

QShader::BatchableVertexShader バリアントを生成する際、location は、挿入される頂点入力の入力位置を指定します。この値はデフォルトで7に設定されており、頂点シェーダーがすでに入力位置7を使用している場合にのみ、上書きする必要があります。

void QShaderBaker::setBreakOnShaderTranslationError(bool enable)

シェーダーの変換(SPIR-V から GLSL/HLSL/MSL へ)が失敗した際の挙動を制御します。 デフォルトではこの設定は true になっており、要求されたシェーダーを生成できない場合、bake() はエラーを返します。これを望まず、生成可能な部分は生成し、残りは黙ってスキップしたい場合は、enable を false に設定してください。

複数のGLSLバージョンを対象にすると、特定の機能が指定されたバージョンに変換できない場合にエラーが発生する可能性があります。たとえば、textureSize() を使用するシェーダーを GLSL ES 100 に変換しようとすると、bake() の呼び出し全体が失敗し、「textureSize is not supported in ESSL 100」というエラーメッセージが表示されます。 要求されたにもかかわらず、結果にGLSL ES 100シェーダーが含まれなくても構わない場合は、このフラグをfalseに設定することで、bake()が成功するようになります。

void QShaderBaker::setGeneratedShaderVariants(const QList<QShader::Variant> &v)

生成されるシェーダーバリアントを指定します。各シェーダーバージョンについて、生成されるQShader には複数のバリアントが含まれる場合があります。

ほとんどの場合、v にはQShader::StandardShader という 1 つのエントリが含まれます。

注: バリアントが設定されていない場合 、生成されるQShader は空となり、無効となります。

void QShaderBaker::setGeneratedShaders(const QList<QShaderBaker::GeneratedShader> &v)

コンパイルまたは変換するシェーダーの種類を指定します。デフォルトでは何も生成されないため、bake() を呼び出す前にこの関数を呼び出すことが必須です

注: この関数が呼び出されない場合 、またはv が空であるか無効なエントリのみを含む場合、結果として得られるQShader は空となり、したがって無効となります。

たとえば、他の言語への追加の変換を行わない、最小限のベイク先としてSPIR-Vがあります。これを指定するには、次のようにします:

baker.setGeneratedShaders({ QShader::SpirvShader, QShaderVersion(100) });

注: QShaderBaker は 、SPIR-V および人間が読めるソース形式のターゲットのみを扱います。QShader::DxbcShader やQShader::MetalLibShader などの API 固有の中間形式へのさらなるコンパイルは、qsb コマンドラインツールによって実装されており、QShaderBaker ランタイム API の一部ではありません。

[since 6.9] void QShaderBaker::setGlslOptions(QShaderBaker::GlslOptions options)

生成される GLSL および GLSL ES ソースに対して、追加のoptions を設定します。デフォルトでは、フラグは設定されません。

この関数は Qt 6.9 で導入されました。

[since 6.7] void QShaderBaker::setMultiViewCount(int count)

マルチビューを使用してシェーダーをトランスパイルする場合(例:GL_OVR_multiview2、VK_KHR_multiview などに依存するレンダラー向けに gl_ViewIndex を使用する頂点シェーダーなど)、一部のターゲットでは、シェーダー内でビューの数を宣言する必要があります。 これはVulkanスタイルのGLSLコードでは行われず、SPIR-VやHLSLなどのターゲットには関係ありませんが、OpenGLおよびGLSLでは必要となるため、この値を追加のメタデータとして指定する必要があります。

デフォルトでは値は 0 であり、これにより `num_views ` ステートメントの挿入が無効になります。1 に設定しても意味がありません。なぜなら、いずれにせよそれがデフォルトの `num_views ` だからです。したがって、効果を得るためには `count ` を 2 以上に設定する必要があります。例えば 2 に設定すると、生成される GLSL シェーダーには `layout(num_views = 2) in; ` ステートメントが含まれます。

count を2以上に設定すると、いくつかのプリプロセッサステートメントも挿入されます。QSHADER_VIEW_COUNT はcount に設定され、GL_EXT_multiview 拡張機能が自動的に有効になります。したがって、適切なcount を設定することは、他の種類のシェーダーにおいても重要になる場合があります。例えば、頂点シェーダーとフラグメントシェーダー間でユニフォームバッファを共有し、両方のシェーダーが#if QSHADER_VIEW_COUNT >= 2 のような書き込みを行える必要がある場合などです。

この関数は Qt 6.7 で導入されました。

void QShaderBaker::setPerTargetCompilation(bool enable)

ターゲットごとのコンパイルをenable に設定します。デフォルトではこれは無効になっており、Vulkan/GLSLソースはバリアントごとに1回SPIR-Vにコンパイルされます(つまり、デフォルトでは1回、頂点シェーダーであり、かつ指定された「Batchable」バリアントである場合は2回コンパイルされます)。 生成されたSPIR-Vは、その後、さまざまなターゲット言語(GLSL、HLSL、MSL)に変換されます。

ターゲットごとのコンパイルモードでは、ターゲットごとに個別のGLSLからSPIR-Vへのコンパイルステップが行われます。つまり、setGeneratedShaders() を通じて指定された各GLSL/HLSL/MSLバージョンごとにコンパイルが行われます。入力ソースは同じですが、ターゲット固有のプリプロセッサ定義が挿入されます。 この方法は大幅に時間がかかりますが、アプリケーションが単一のシェーダーを提供し、#ifdef ブロックを使用して区別することを可能にします。このモードが無効になっている場合、同じことを実現する唯一の方法は、シェーダーファイルの複数のバージョンを用意し、それぞれを個別に処理し、それぞれに対応する{.qsb}ファイルを出力し、実行時のロジックに基づいて適切なファイルを選択することです。

このモードでは、以下のマクロが自動的に定義されます。なお、これらのマクロは常にシェーディング言語に紐づいており、グラフィックスAPIには紐づいていない点に注意してください。

  • QSHADER_SPIRV - SPIR-Vをターゲットとする場合に定義されます(通常、Vulkanによって利用されます)。
  • QSHADER_SPIRV_VERSION - ターゲットとするSPIR-Vのバージョン番号(例:100 )。
  • QSHADER_GLSL - GLSL または GLSL ES をターゲットとする場合に定義されます(通常、OpenGL または OpenGL ES で利用されます)。
  • QSHADER_GLSL_VERSION - ターゲットとするGLSLまたはGLSL ESのバージョン番号(例:100 、300 、330 など)。
  • QSHADER_GLSL_ES - GLSL ES をターゲットとする場合にのみ定義される
  • QSHADER_HLSL - HLSLをターゲットとする場合に定義されます(通常、Direct 3Dで利用されます)
  • QSHADER_HLSL_VERSION - 対象とする HLSL シェーダーモデルのバージョン。例:50
  • QSHADER_MSL - Metal Shading Language をターゲットとする場合に定義されます(通常は Metal によって使用されます)
  • QSHADER_MSL_VERSION - ターゲットとするMSLのバージョン(例:12 や20 など)。

これにより、次のようなシェーダーコードを記述できます。

#if QSHADER_HLSL || QSHADER_MSL
vec2 uv = vec2(uv_coord.x, 1.0 - uv_coord.y);
#else
vec2 uv = uv_coord;
#endif

注:バージョン 番号はGLSLに準拠したQShaderVersion の構文に従うため、常に単一の整数となります。

注: 個別のターゲットがいくつあっても、QShader ごとにQShaderDescription は 1つだけです 。したがって、ユニフォームブロックや頂点入力などの要素を、上記のマクロを使用して条件付きにしてはなりません。

警告: グラフィックスAPIとシェーディング言語の概念の違いに注意してください 。QShaderBaker および関連ツールは、結果がその後どのように利用されるかを無視し、シェーディング言語の概念に厳密に従って動作します。 したがって、Qtグラフィックススタックの上位層が将来、Vulkan以外のAPIでもSPIR-Vを使用するようになった場合、「QSHADER_SPIRV」がVulkanを意味するという前提はもはや成り立たなくなります。

void QShaderBaker::setPreamble(const QByteArray &preamble)

通常のシェーダーコードの前に処理される、カスタムpreamble を指定します。

これは単にソース文字列の先頭に追加するだけではありません。他のすべての記述よりも前に配置することが求められるGLSLバージョンディレクティブの有効性には影響しません。また、preamble 内に記述された内容を無視するため、エラーメッセージに表示される行番号も変更されません。

プレアンブルの用途の一つとして、動的に生成された#define ステートメントを透過的に挿入することが挙げられます。

void QShaderBaker::setSourceDevice(QIODevice *device, QShader::Stage stage, const QString &fileName = QString())

ソースdevice を設定します。これにより、ファイルだけでなく、任意のQIODevice を使用できるようになります。stage はシェーダーステージを指定し、オプションのfileName には、エラーメッセージで使用されるファイル名が格納されます。

警告: device には 、信頼できるコンテンツが含まれていることが想定されています。アプリケーション開発者は、アプリケーションの管理下にないソースからのユーザー提供データを渡す前に、その潜在的な影響を慎重に検討することをお勧めします。

void QShaderBaker::setSourceFileName(const QString &fileName)

シェーダーソースファイルの名前を `fileName` に設定します。これは、bake() を呼び出した際に読み込まれるファイルです。シェーダーステージはファイル拡張子から自動的に判別されます。これが望ましくない場合や不可能な場合は、代わりに `stage` 引数を持つオーバーロードを使用してください。

サポートされているファイル拡張子は以下の通りです:

  • .vert - 頂点シェーダー
  • .frag - フラグメント(ピクセル)シェーダー
  • .tesc - テッセレーション制御(ハル)シェーダー
  • .tese - テッセレーション評価(ドメイン)シェーダー
  • .geom - ジオメトリシェーダー
  • .comp - コンピュートシェーダー

警告: fileName には、 信頼できるコンテンツが含まれていることが想定されています。アプリケーション開発者は、アプリケーションの一部ではないユーザー提供のソースファイルを渡す前に、その潜在的な影響を慎重に検討することを推奨します。

void QShaderBaker::setSourceFileName(const QString &fileName, QShader::Stage stage)

シェーダーソースファイルの名前を `fileName` に設定します。これは、bake() を呼び出した際に読み込まれるファイルです。シェーダーステージは `stage` で指定されます。

警告: ` fileName ` には信頼できるコンテンツが含まれていることが前提となっています。アプリケーション開発者は、アプリケーションの一部ではないユーザー提供のソースファイルを渡す前に、その潜在的な影響を慎重に検討することをお勧めします。

void QShaderBaker::setSourceString(const QByteArray &sourceString, QShader::Stage stage, const QString &fileName = QString())

入力シェーダーsourceString を設定します。stage はシェーダーステージを指定し、オプションのfileName にはエラーメッセージで使用されるファイル名が格納されます。

警告: ` sourceString ` には信頼できるコンテンツが含まれていることが想定されています。アプリケーション開発者は、アプリケーションの管理下にないソースからのユーザー提供データを渡す前に、その潜在的な影響を慎重に検討することを推奨します。

void QShaderBaker::setSpirvOptions(QShaderBaker::SpirvOptions options)

生成されるSPIR-Vバイナリに対して、追加のoptions を設定します。デフォルトでは、フラグは設定されません。

void QShaderBaker::setTessellationMode(QShaderDescription::TessellationMode mode)

テッセレーション制御シェーダー用のMSLシェーダーコードを生成する際、テッセレーションのmode (三角形または四角形)はあらかじめ決定されている必要があります。GLSLでは、これは通常テッセレーション評価シェーダー内で宣言されますが、Metalの場合、テッセレーション制御シェーダーからコンピュートシェーダーを生成する際にも、この が既知である必要があります。

設定されていない場合、デフォルトは三角形となります。

void QShaderBaker::setTessellationOutputVertexCount(int count)

テッセレーション評価シェーダー用のMSLシェーダーコードを生成する際は、テッセレーション制御シェーダーの出力頂点count を事前に把握しておく必要があります。GLSLでは通常、これはテッセレーション制御シェーダー内で宣言されますが、Metalの場合、テッセレーション評価シェーダーから頂点シェーダーを生成する際にも、この を把握しておく必要があります。

設定されていない場合、デフォルト値は 3 です。

© 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.