QSBマニュアル

qsbQt Shader Toolsモジュールが提供するコマンドラインツールです。glslangや SPIRV-Crossのようなサードパーティライブラリを統合し、オプションで や のような外部ツールを起動し、 ファイルを生成します。さらに、 パッケージの内容を検査するために使用することもできます。fxc spirv-opt .qsb .qsb

Usage: qsb [options] file
Qt Shader Baker (using QShader from Qt 6.8.0)

Options:
  -?, -h, --help               Displays help on commandline options.
  --help-all                   Displays help, including generic Qt options.
  -v, --version                Displays version information.
  -b, --batchable              Also generates rewritten vertex shader for Qt
                               Quick scene graph batching.
  --zorder-loc <location>      The extra vertex input location when rewriting
                               for batching. Defaults to 7.
  --glsl <versions>            Comma separated list of GLSL versions to
                               generate. (for example, "100 es,120,330")
  --hlsl <versions>            Comma separated list of HLSL (Shader Model)
                               versions to generate. F.ex. 50 is 5.0, 51 is 5.1.
  --msl <versions>             Comma separated list of Metal Shading Language
                               versions to generate. F.ex. 12 is 1.2, 20 is 2.0.
  --qt6                        Equivalent to --glsl "100 es,120,150" --hlsl 50
                               --msl 12. This set is commonly used with shaders
                               for Qt Quick materials and effects.
  --msltess                    Indicates that a vertex shader is going to be
                               used in a pipeline with tessellation. Mandatory
                               for vertex shaders planned to be used with
                               tessellation when targeting Metal (--msl).
  --tess-vertex-count <count>  The output vertex count from the tessellation
                               control stage. Mandatory for tessellation
                               evaluation shaders planned to be used with Metal.
                               The default value is 3. If it does not match the
                               tess.control stage, the generated MSL code will
                               not function as expected.
  --tess-mode <mode>           The tessellation mode: triangles or quads.
                               Mandatory for tessellation control shaders
                               planned to be used with Metal. The default value
                               is triangles. Isolines are not supported with
                               Metal. If it does not match the tess.evaluation
                               stage, the generated MSL code will not function
                               as expected.
  --view-count <num_views>     The number of views the shader is used with.
                               num_views must be >= 2. Mandatory when multiview
                               rendering is used (gl_ViewIndex). Set only for
                               vertex shaders that really do rely on multiview
                               (as the resulting asset is tied to num_views).
                               Can be set for fragment shaders too, to get
                               QSHADER_VIEW_COUNT auto-defined. (useful for
                               ensuring uniform buffer layouts)
  -g                           Generate full debug info for SPIR-V and DXBC
  -O                           Invoke spirv-opt (external tool) to optimize
                               SPIR-V for performance.
  -o, --output <filename>      Output file for the shader pack.
  --qsbversion <version>       QSB version to use for the output file. By
                               default the latest version is automatically used,
                               use only to bake compatibility versions. F.ex. 64
                               is Qt 6.4.
  -c, --fxc                    In combination with --hlsl invokes fxc (SM
                               5.0/5.1) or dxc (SM 6.0+) to store DXBC or DXIL
                               instead of HLSL.
  -t, --metallib               In combination with --msl builds a Metal library
                               with xcrun metal(lib) and stores that instead of
                               the source. Suitable only when targeting macOS,
                               not iOS.
  -T, --metallib-ios           In combination with --msl builds a Metal library
                               with xcrun metal(lib) and stores that instead of
                               the source. Suitable only when targeting iOS, not
                               macOS.
  -D, --define <name[=value]>  Define macro. This argument can be specified
                               multiple times.
  -p, --per-target             Enable per-target compilation. (instead of
                               source->SPIRV->targets, do source->SPIRV->target
                               separately for each target)
  -d, --dump                   Switches to dump mode. Input file is expected to
                               be a shader pack.
  -x, --extract <what>         Switches to extract mode. Input file is expected
                               to be a shader pack. Result is written to the
                               output specified by -o. Pass -b to choose the
                               batchable variant.
                               <what>=reflect|spirv,<version>|glsl,<version>|...
  -r, --replace <what>         Switches to replace mode. Replaces the specified
                               shader in the shader pack with the contents of a
                               file. This argument can be specified multiple
                               times. Pass -b to choose the batchable variant.
                               Also supports adding a shader for a
                               target/variant that was not present before.
                               <what>=<target>,<filename> where
                               <target>=spirv,<version>|glsl,<version>|...
  -e, --erase <what>           Switches to erase mode. Removes the specified
                               shader from the shader pack. Pass -b to choose
                               the batchable variant.
                               <what>=spirv,<version>|glsl,<version>|...
  -s, --silent                 Enables silent mode. Only fatal errors will be
                               printed.
  --depfile <depfile>          Enables generating the depfile for the input
                               shaders, using the #include statements.

Arguments:
  file                         Vulkan GLSL source file to compile. The file
                               extension determines the shader stage, and can be
                               one of .vert, .tesc, .tese, .frag, .comp. Note:
                               Tessellation control/evaluation is not supported
                               with HLSL, instead use -r to inject handcrafted
                               hull/domain shaders. Some targets may need
                               special arguments to be set, e.g. MSL
                               tessellation will likely need --msltess,
                               --tess-vertex-count, --tess-mode, depending on
                               the stage.

操作モード

動作モードは大きく分けて5つある:

  • .qsb ファイル生成
  • .qsb ファイル生成。たとえば、 、反射メタデータ(JSON形式)と含まれるシェーダが表示されます。qsb -d myshader.frag.qsb
  • 抽出モード。これにより、既存の.qsb ファイルから指定されたシェーダを別のファイルに書き込むことができます。たとえば、qsb -x spirv,100 -o myshader.spv myshader.frag.qsb は SPIR-V バイナリをmyshader.spv に書き込みます。
  • 置換モード。これにより、.qsb ファイル内の 1 つまたは複数のシェーダーの内容を、指定されたファイルから読み込んだ内容で置き換えることができます。こうすることで、手作りのシェーダー・コードを.qsb パッケージに注入することができます。
  • 消去モード。これは.qsb ファイルから指定されたシェーダバリアントを削除します。

次のフラグメントシェーダを例にします:

#version 440

layout(location = 0) in vec2 v_texcoord;
layout(location = 0) out vec4 fragColor;
layout(binding = 1) uniform sampler2D tex;

layout(std140, binding = 0) uniform buf {
    float uAlpha;
};

void main()
{
    vec4 c = texture(tex, v_texcoord);
    fragColor = vec4(c.rgb, uAlpha);
}

qsb -o shader.frag.qsb shader.frag を実行するとshader.frag.qsb が生成されます。このファイルをqsb -d shader.frag.qsb で検査すると、次のようになります:

Stage: Fragment
QSB_VERSION: 5
Has 1 shaders:
  Shader 0: SPIR-V 100 [Standard]

Reflection info: {
    "combinedImageSamplers": [
        {
            "binding": 1,
            "name": "tex",
            "set": 0,
            "type": "sampler2D"
        }
    ],
    "inputs": [
        {
            "location": 0,
            "name": "v_texcoord",
            "type": "vec2"
        }
    ],
    "localSize": [
        0,
        0,
        0
    ],
    "outputs": [
        {
            "location": 0,
            "name": "fragColor",
            "type": "vec4"
        }
    ],
    "uniformBlocks": [
        {
            "binding": 0,
            "blockName": "buf",
            "members": [
                {
                    "name": "uAlpha",
                    "offset": 0,
                    "size": 4,
                    "type": "float"
                }
            ],
            "set": 0,
            "size": 4,
            "structName": "_27"
        }
    ]
}


Shader 0: SPIR-V 100 [Standard]
Entry point: main
Contents:
Binary of 864 bytes

デフォルトでは SPIR-V だけが生成されるので、このシェーダパッケージを使 用するアプリケーションは Vulkan でのみ機能します。もっと使えるようにしましょう:

qsb --glsl "100 es,120,150" --hlsl 50 --msl 12 -o shader.frag.qsb shader.frag

これは、OpenGL、Direct 3D、Metalにも適したシェーダー・パッケージを生成することにつながります。このシェーダーで使われている機能は基本的なもので、GLSL ES 100(OpenGL ES 2.0のシェーディング言語)でも適しています。

結果を検査するとわかる:

Stage: Fragment
QSB_VERSION: 5
Has 6 shaders:
  Shader 0: GLSL 120 [Standard]
  Shader 1: HLSL 50 [Standard]
  Shader 2: GLSL 100 es [Standard]
  Shader 3: MSL 12 [Standard]
  Shader 4: SPIR-V 100 [Standard]
  Shader 5: GLSL 150 [Standard]

Reflection info: {
    ... <same as above>
}


Shader 0: GLSL 120 [Standard]
Entry point: main
Contents:
#version 120

struct buf
{
    float uAlpha;
};

uniform buf _27;

uniform sampler2D tex;

varying vec2 v_texcoord;

void main()
{
    vec4 c = texture2D(tex, v_texcoord);
    gl_FragData[0] = vec4(c.xyz, _27.uAlpha);
}

************************************

Shader 1: HLSL 50 [Standard]
Entry point: main
Native resource binding map:
0 -> [0, -1]
1 -> [0, 0]
Contents:
cbuffer buf : register(b0)
{
    float _27_uAlpha : packoffset(c0);
};

Texture2D<float4> tex : register(t0);
SamplerState _tex_sampler : register(s0);

static float2 v_texcoord;
static float4 fragColor;

struct SPIRV_Cross_Input
{
    float2 v_texcoord : TEXCOORD0;
};

struct SPIRV_Cross_Output
{
    float4 fragColor : SV_Target0;
};

void frag_main()
{
    float4 c = tex.Sample(_tex_sampler, v_texcoord);
    fragColor = float4(c.xyz, _27_uAlpha);
}

SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
    v_texcoord = stage_input.v_texcoord;
    frag_main();
    SPIRV_Cross_Output stage_output;
    stage_output.fragColor = fragColor;
    return stage_output;
}

************************************

...

Shader 3: MSL 12 [Standard]
Entry point: main0
Native resource binding map:
0 -> [0, -1]
1 -> [0, 0]
Contents:
#include <metal_stdlib>
#include <simd/simd.h>

using namespace metal;

struct buf
{
    float uAlpha;
};

struct main0_out
{
    float4 fragColor [[color(0)]];
};

struct main0_in
{
    float2 v_texcoord [[user(locn0)]];
};

fragment main0_out main0(main0_in in [[stage_in]], constant buf& _27 [[buffer(0)]], texture2d<float> tex [[texture(0)]], sampler texSmplr [[sampler(0)]])
{
    main0_out out = {};
    float4 c = tex.sample(texSmplr, in.v_texcoord);
    out.fragColor = float4(c.xyz, _27.uAlpha);
    return out;
}

************************************

...

このパッケージはQt QuickでサポートされているすべてのグラフィックスAPIで使用できます:Vulkan、Direct 3D、Metal、OpenGL、OpenGL ESです。実行時に、Qt Quick と Qt Quick 3D の下にある Qt Rendering Hardware Interface によって、適切なシェーダが自動的にピックアップされます。

SPIR-Vバイトコードをより高いレベルのソースコードに戻すだけでなく、SPIR-Vバインディング番号をネイティブリソースに正しくマッピングするなどの追加的な問題も処理します。例えば、HLSLでは上のようなセクションがある:

Native resource binding map:
 0 -> [0, -1]
 1 -> [0, 0]

内部的には、SPIR-V スタイルのバインディングポイント0 を HLSL レジスタb0 にマッピングし、1t0s0 にバインディングすることができます。これにより、様々なシェーディング言語間のリソースバインディングの違いを、レンダリングハードウェアインターフェースのユーザーに透過させることができ、Qtのすべてが、元のVulkanスタイルのGLSLソースコードで指定されているVulkan/SPIR-Vスタイルのバインディングポイントで操作できるようになります。

シェーダーの種類

シェーダーのタイプは、入力ファイルの拡張子から推測されます。したがって、拡張子は以下のいずれかでなければなりません:

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

注: テッセレーション・コントロール・シェーダと評価シェーダは、現在Direct 3D (HLSL)ではサポートされていません。

シェーディング言語とバージョン

SPIR-V 1.0は常に生成されます。さらに何が生成されるかは、コマンドライン引数--glsl,--hlsl,--msl に依存します。

これらのパラメータはすべて、カンマで区切られたリストが続きます。リストにはGLSLスタイルのバージョン番号を含める必要があり、オプションで接尾辞(es 、GLSL ESを示す)を付けることができます。接尾辞とバージョンの間の空白はオプションです(空白を入れないことで、引用符で囲む必要がなくなります)。

例えば、Qt Quick の組み込みマテリアル(ImageTextRectangle などのシェーダー)は、すべて--glsl "100 es,120,150" --hlsl 50 --msl 12 でシェーダーを準備します。これにより、OpenGL ES 2.0以上、OpenGL 2.1以上、およびバージョン3.2以上のOpenGLコア・プロファイル・コンテキストと互換性があります。

シェーダが、指定されたターゲットに等価なものがない関数やコンストラクトを使 用する場合、qsb は失敗します。その場合、ターゲットを調整する必要があり、これはアプリケーションの最小システム要件が暗黙のうちに調整されることも意味します。例として、OpenGL ES 3.0以上(つまりGLSL ES 300以上)でしか利用できないtextureLod GLSL関数を考えてみましょう。100 es の代わりに GLSL300 es を要求すると、qsb は成功しますが、.qsb ファイルを使用するアプリケーションは OpenGL ES 3.0 以上を要求するようになり、OpenGL ES 2.0 ベースのシステムとは互換性がなくなります。

.comp シェーダーは、--glsl 310es,430 を指定する必要があります。コンピュートシェーダーは、OpenGL ES 3.1 以降と OpenGL 4.3 以降でのみ利用可能だからです。

HLSL 用のシェーダーモデル・バージョン、または Metal Shading Language 用のシェーダーモデル・バージョンを調整する必要はほとんどないと思われます。シェーダーモデル 5.0 (--hlsl 50) と MSL 1.2 (--msl 12) で十分です。

Qt クイックシーングラフのバッチ処理

Qt Quick Scene Graph のレンダラは、ジオメトリのバッチ処理をサポートし、描画の呼び出し回数を減らします。詳細はScene Graph のページを参照してください。これは、頂点シェーダの main() 関数にコードを注入することに依存しています。Qt 5.x では、供給された GLSL バーテックスシェーダコードを修正することで、実行時にこれが行われました。Qt 6 では、これはオプションではありません。その代わりに、qsb ツールによって、バッチ可能な頂点シェーダのバリエーションをビルドすることができます。これは-b 引数で要求されます。入力が.vert 拡張を持つ頂点シェーダでない場合、これは何の効果もありません。ただし、頂点シェーダの場合は、ターゲットごとに 2 つのバージョンが生成されます。Qt Quick は、実行時に自動的に正しいバージョン(標準またはバッチ可能)を選択します。

注意: アプリケーションはバッチ処理の詳細を気にする必要はありません。アプリケーションは、頂点シェーダーを処理するときに、-b (またはCMake統合を使用している場合は、同等のBATCHABLE キーワード)が指定されていることを確認するだけです。これは、ShaderEffect またはQSGMaterialShader で使用される Qt Quick シェーダのみに関連します。

次の頂点シェーダの例を見てください:

#version 440
layout(location = 0) in vec4 position;
layout(location = 1) in vec2 texcoord;
layout(location = 0) out vec2 v_texcoord;
layout(std140, binding = 0) uniform buf {
    mat4 mvp;
} ubuf;

void main()
{
    v_texcoord = texcoord;
    gl_Position = ubuf.mvp * position;
}

qsb -b --glsl 330 -o example.vert.qsb example.vert を実行すると次のようになります:

Stage: Vertex
QSB_VERSION: 5
Has 4 shaders:
  Shader 0: GLSL 330 [Standard]
  Shader 1: GLSL 330 [Batchable]
  Shader 2: SPIR-V 100 [Standard]
  Shader 3: SPIR-V 100 [Batchable]

Reflection info: {
  ...

すべてのターゲット言語とバージョンは、現在2つのバリエーションがあることに注意してください:すべてのターゲット言語とバージョンは、Standard と少し修正された Batchable の 2 種類があることに注意してください。

外部ツールの起動

qsb は、特定の外部ツールを呼び出すことができます。すなわち、シェーダ バイトコードの最適化を実行するツール(SPIR-V)と、シェーダコンパイル の第一段階(ソースから中間バイトコード形式まで)を実行するプラットフォーム特 有のツールです。

これらは以下のコマンドラインオプションで有効になります:

  • -O - は、SPIR-V バイナリの後処理として を起動します。 ファイルには最適化されたバージョンが含まれる。これは、 がシステム上で利用可能で(たとえば、Vulkan SDK から)、呼び出す準備ができていることを前提としています。spirv-opt .qsb spirv-opt
  • -c または - Direct 3D シェーダー・コンパイラーである を起動します。結果として (DirectX Byte Code) データが、HLSL の代わりに ファイルに保存されます。Qt は実行時にこれを自動的に取り込みますので、 ファイルの作成者が、HLSL ソースと中間フォーマットのどちらを含めるかを決定します。実行時にHLSLソースを解析する必要がなくなり、グラフィックスパイプラインの作成時に大幅なパフォーマンス向上につながる可能性があるからです。欠点は、この引数は が Windows 上で実行される場合にのみ使用できることです。--fxc fxc.exe DXBC .qsb .qsb qsb
  • -t または - 適切なXCode Metalツールを呼び出して.metallibファイルを生成し、MSLソースコードの代わりにそれを パッケージに含めます。このオプションは、 が macOS 上で実行されている場合にのみ使用できます。--metallib .qsb qsb

その他のオプション

  • -D - マクロを定義します。これにより、GLSLソースコードで#ifdefなどを使用できるようになります。
  • -g - SPIR-V の完全なデバッグ情報を生成できるようになり、RenderDoc のようなツールで、パイプラインを検査するときや、頂点やフラグメントのデバッグを行うときに、完全なソースを表示できるようになります。また、 が指定された場合、 が生成される中間バイトコードにデバッグ情報を含めるように指示されるため、Direct 3D にも効果があります。-c fxc

テッセレーション

  • --msltess - 頂点シェーダがテッセレーションステージを含むパイプラインで使用されていることを示します。他のタイプのシェーダ、および MSL シェーダ生成が有効でない場合は効果がありません。指定しない場合、頂点シェーダはテッセレーションと組み合わせてMetal上で機能しません。
  • --tess-vertex-count <count> - テッセレーション制御ステージからの出力頂点数を指定します。Metalでテッセレーション評価シェーダを使用する場合、この指定は必須です。デフォルト値は3です。テッセレーション制御ステージと一致しない場合、生成されたMSLコードは期待通りに機能しません。
  • --tess-mode <mode> - このオプションはテッセレーションモードを指定します。デフォルト値は です。このオプションの指定は、Metalで使用されるテッセレーションコントロールシェーダーでは必須です。この値はテッセレーション評価ステージと一致していなければなりません。そうでない場合、生成されたMSLコードは期待通りに機能しません。triangles quads triangles

マルチビュー

次の頂点シェーダを例にとります。これはVulkan互換のGLSLとして書かれており、gl_ViewIndex の使用を合法にするためのGL_EXT_multiview 拡張を可能にします。

#version 440
#extension GL_EXT_multiview : require

layout(location = 0) in vec4 pos;
layout(std140, binding = 0) uniform buf
{
    mat4 mvp[2];
};

void main()
{
    gl_Position = mvp[gl_ViewIndex] * pos;
}

注: 実際には、#extension GL_EXT_multiview 行は、qsb に渡されるソースコードでは必要ありません。なぜなら、後述の--view-count 引数を渡すと、SPIR-V にコンパイルする前に、自動的にその行がシェーダソースコードに注入されるからです。

Vulkan の場合、Vulkan 1.1 がランタイムでサポートされている限り、これはそのまま機能します。詳細はVK_KHR_multiviewを参照してください。

上記から Direct 3D 12 用に HLSL バーテックスシェーダを生成するには(詳細はビューインスタンシングを参照)、最小シェーダモデルバージョンは 6.1 です。つまり、--hlsl 50 などを指定すると、qsb は失敗します。マルチビューのバーテックスシェーダを処理するときは、少なくとも--hlsl 61 を使用してください。マルチビューは Direct 3D 11 ではサポートされていません。

OpenGL では、追加のメタデータが必要です:

  • --view-count - 上記のシェーダを(SPIR-V にコンパイルした後)OpenGL 互換 GLSL ソースコードにトランスパイルするときは、 を にマップするだけでは不十分で、シェーダ内でビュー数も宣言する必要があります。引数 に値 2 を渡すと、生成された GLSL ソースコードに ステートメントが挿入され、有効な(OpenGL)GLSL シェーダになります。詳細についてはgl_ViewIndex gl_ViewID_OVR --view-count layout(num_views = 2) in; #extension GL_OVR_multiviewを参照してください。また、生成されるGLSLシェーダはGL_OVR_multiview2が実行時にサポートされている必要があります。

このような頂点シェーダで OpenGL (ES) をターゲットにする場合、 生成される GLSL バージョン (--glsl) は少なくとも330300 es でなければなりません。前者はqsbQShaderBaker によって強制されるものではありませんが、実際には OpenGL 実装は、GLSL バージョンが 150 以下の場合、このようなシェーダを拒否することが知られています。したがって、GL_EXT_multiviewを有効にする頂点シェーダを条件付けするときは、--glsl 330,300es を渡すことが推奨されます。

--view-count を指定すると、プリプロセッサ定義が自動的に生成され、注入されます:#define QSHADER_VIEW_COUNT n ここで、n はビュー数です。ここで、 はビュー数です。ビュー数が提供されない場合、define はまったく設定されません。これにより、以下のようなコードを書くことができ、シェーダーのビュー数に特化したすべてのバリエーションに同じソースファイルを使用することができます。

layout(std140, binding = 0) uniform buf {
#if QSHADER_VIEW_COUNT >= 2
    mat4 matrix[QSHADER_VIEW_COUNT];
#else
    mat4 matrix;
#endif
    float opacity;
};

さらに、#extension GL_EXT_multiview : require 行は、2 以上のビューカウントが設定されるたびに、頂点シェーダで自動的に生成されます。これにより、頂点シェーダでマルチビューをサポートするために追加 する必要がある余分な行の数を減らすことができます。

ビューカウントの設定は、他のタイプのシェーダにも関連することがあります。たとえば、頂点シェーダとフラグメントシェーダの間で一様バッ ファを共有し、両方のシェーダが同じバッファレイアウトを保証しなけれ ばならないとき、両方のソースファイルに#if QSHADER_VIEW_COUNT >= 2 を書けると便利です。これは、qsb を呼び出すときに両方に--view-count を指定することで確保できます。

注意: たとえばフラグメントシェーダのような非頂点ステージでgl_ViewIndex キーワードに直接依存することは、現時点では移植性がないので避けるべきです。

OpenGL 固有の GLSL 機能を使う

OpenGL と GLSL に特有で、他のシェーディング言語、中間フォーマット、 およびグラフィックス API には適用できないシェーディング言語コンストラ クトを使用する必要がある場合があります。

その代表例がOpenGL ESの外部テクスチャとサンプラーです。OpenGLのテクスチャオブジェクトは、通常の2Dテクスチャとしては使用できませんが、OpenGL APIのGL_TEXTURE_EXTERNAL_OESバインディングポイントや、シェーダのsamplerExternalOES サンプラータイプによって、限定された機能セットで使用できます。QtのSPIR-Vベースのシェーダパイプラインを使用する場合、後者は潜在的なショーストッパーになります。qsbを通してそのようなシェーダを実行すると、samplerExternalOES 、SPIR-Vや他のターゲットシェーディング言語にマッピングできないため、有効な型として受け入れられず、失敗に終わります。

これを克服するために、qsb は、.qsb ファイル内の任意のシェーダバリアントの内容を、ファイルから読み込まれるユーザ提供のデータで置き換えるオプションを提供し、元の qsb が生成したシェーダソースまたはバイトコードを完全に置き換えます。

次のフラグメントシェーダを見てください。texOpenGL ES で実行するときに、タイプをsamplerExternalOES にする必要がある場合はどうしますか?

#version 440

layout(location = 0) in vec2 texCoord;
layout(location = 0) out vec4 fragColor;

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

layout(binding = 1) uniform sampler2D tex;

void main()
{
    fragColor = texture(tex, texCoord).rgba * ubuf.opacity;
}

samplerExternalOES の型を変更するだけでは実行できません。それはすぐにコンパイルエラーにつながります。

しかし、簡単な解決策があります。シェーダの純粋なOpenGL ESをターゲットにしたバージョンを別に書き、それを.qsbファイルに注入します。以下のシェーダはGLSL ESとしか互換性がなく、qsbを通して実行することはできません。しかし、実行時に OpenGL ES で処理できることはわかっています。

precision highp float;
#extension GL_OES_EGL_image_external : require
varying vec2 texCoord;

struct buf
{
    float opacity;
};

uniform buf ubuf;
uniform samplerExternalOES tex;

void main()
{
    gl_FragColor = texture2D(tex, texCoord).rgba * ubuf.opacity;
}

これをshader_gles.frag と呼びましょう。qsb --glsl 100es -o shader.frag.qsb shader.frag が完了し、(半分準備のできた).qsb ファイルができたら、qsb -r glsl,100es,shader_gles.frag shader.frag.qsb を実行してshader.frag.qsb を更新し、GLSL 100 es 用のシェーダーを指定されたファイル(shader_gles.frag )の内容で置き換えることができます。これでshader.frag.qsb 、OpenGL ESで実行時に使用する準備が整いました。

注意: シェーダとアプリケーション間のインターフェイスを変更しないよう に注意してください。-d オプションで .qsb ファイルの内容を表示するか、qsb -x glsl,100es -o gles_shader.frag shader.frag.qsb を実行して GLSL ES 100 シェーダを抽出することで、qsb が生成した GLSL コードを必ず最初に検査します。構造体、構造体メンバ、およびユニフォーム名は、手動注入バージョンでも異なってはなりません。

注: 任意のファイルから .qsb パッケージにデータを配置する機能は、Direct 3D でもテッセレーションベースのグラフィックパイプラインを機能させるために、手作りのハルとドメインの HLSL シェーダーを注入するために使用することもできます。

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。