QSBマニュアル
qsb
はQt 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
にマッピングし、1
をt0
とs0
にバインディングすることができます。これにより、様々なシェーディング言語間のリソースバインディングの違いを、レンダリングハードウェアインターフェースのユーザーに透過させることができ、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 の組み込みマテリアル(Image 、Text 、Rectangle などのシェーダー)は、すべて--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
) は少なくとも330
か300 es
でなければなりません。前者はqsb
やQShaderBaker によって強制されるものではありませんが、実際には 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 が生成したシェーダソースまたはバイトコードを完全に置き換えます。
次のフラグメントシェーダを見てください。tex
OpenGL 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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。