バイナリシェーダーを使用すること

Kanzi アプリケーションのロード時間を短縮するために、バイナリシェーダーを使用します。デフォルトで、Kanzi はオンラインシェーダーを使用し、Kanzi Studio はソースコードとしてkzbファイルにエクスポートします。ターゲットデバイスで Kanzi アプリケーションを起動すると、アプリケーションはGLドライバーを使用してシェーダーをロードおよびコンパイルします。このコンパイルにより、アプリケーションのロード時間が増加します。バイナリシェーダーを使用すると、Kanzi Studio はkzbファイルをエクスポートする際にシェーダーをコンパイルし、設定したバイナリ形式でシェーダーをエクスポートします。ターゲットデバイスはバイナリシェーダーを即座に使用できます。

バイナリシェーダーは、バイナリシェーダーのドライバーサポートがあるGPUでのみ使用できます。GPUがバイナリシェーダーをサポートしていない場合、Kanzi Engine はソースからシェーダーをコンパイルします。デバイスの製造元が特定のバイナリシェーダーフォーマットをサポートしていると主張していても、必ずしもそのデバイスがすべてのバイナリシェーダーをサポートしているわけではありません。

以下の操作を行うことができます。

一般的なバイナリシェーダーフォーマットの使用

一般的なバイナリシェーダーフォーマットを使用するには:

  1. ターゲットデバイスで使用されている GPU の GPU ベンダー、GPU コアバージョン、GPU ドライバーバージョンを確認し、GPU ベンダーから正しいオフラインバイナリシェーダーコンパイラを入手します。

  2. Library の Kanzi Studio で、Materials and Textures > Shader Formats を Alt を押しながら右クリック し、Binary Shader Format を選択します。

    ../../_images/create-binary-shader-format.png
  3. ターゲットデバイスで使用されている GPU の名前に基づき、バイナリシェーダーフォーマットの名前を指定します。

    GPUベンダー

    Name

    Imagination Technologies

    SGX_BINARY_IMG、または IMG

    ARM Mali

    MALI_SHADER_BINARY_ARM

    Vivante

    SHADER_BINARY_VIV

    Digital Media Professionals

    SHADER_BINARY_DMP

    Fujitsu Semiconductor

    GCCSO_SHADER_BINARY_FJ

    NVidia

    NVIDIA_PLATFORM_BINARY_NV、または Tegra

    さまざまな

    SPIR-V

    ターゲットデバイスで上記以外の GPU が使用され、その GPU 用のオフラインシェーダーコンパイラがある場合には、シェーダーフォーマット GL 定数値の十進数値を名前として使用します。

  4. Properties で、設定します:

    • Enabled プロパティを使用して、バイナリシェーダーフォーマットを利用します。

      Enabled プロパティを有効にすると、Kanzi Studio は Kanzi Studio プロジェクト内のシェーダーをコンパイルします。Kanzi Studio は、使用しているコンパイラがシェーダーを正常にコンパイルしたかどうかを Log ウィンドウに表示します。

    • (オプション) Theme を、このバイナリシェーダーフォーマットを必要とするターゲットデバイス用に作成されたベイクドテーマにします。

      バイナリシェーダーをサポートするさまざまな GPU を搭載した各種デバイスにアプリケーションをデプロイするときには、テーマを使って、特定のターゲットデバイスのハードウェアに必要なフォーマットのバイナリシェーダーのみを kzb ファイルに含めます。複数ターゲットデバイス用のプロジェクトでバイナリシェーダーを設定する を参照してください。

    • Shader Compile をターゲットデバイスのGPU用のシェーダーコンパイラ実行ファイルとコマンドラインにします。

      Kanzi は、個々のシェーダーステージにこれを追加します。これを使用して、すべてのシェーダーステージに共通のオプションを設定できます。

      Kanzi Studio マクロを使用して、シェーダーバイナリをどこに保存するかコンパイラに指示します。例えば、BinaryShaderCompilerExecutable <vertexshadercode> <vertexshaderbinary>。

      シェーダーコードとシェーダーバイナリは、ファイルシステム上の一時ファイルです。シェーダーコンパイラは <shadercode> から読み込み、<outputfile> に書き込みます。コンパイラがサフィックス付きのバイナリを出力する場合は、サフィックスなしのバイナリのみを出力するラッパースクリプトを使用してください。

      <shadertype> マクロは、現在コンパイルされているシェーダーのタイプに展開されます。

      シェーダータイプ (Shader type)

      Expands to

      バーテックスシェーダー (Vertex Shader)

      vertex

      フラグメントシェーダー (Fragment Shader)

      fragment

      ジオメトリシェーダー

      geometry

      テッセレーションコントロールシェーダー

      tesscontrol

      テッセレーション評価シェーダー

      tesseval

      これらの値は、glslc -fshader-stage オプションで期待されるシェーダーステージタイプに直接マッピングされます。

      例:

      glslc --target-env=opengl -fshader-stage=<shadertype> -o <outputfile> <shadercode>
      
    • これらのプロパティは、ターゲットデバイスのGPU上で特定のシェーダータイプのコンパイラ実行ファイルに固有のオプションを設定するためのものです。

      • Vertex Shader Compile を、バーテックスシェーダーコンパイラ実行ファイルに特有のオプションにします。

      • Fragment Shader Compile をフラグメントシェーダーコンパイラ実行ファイルに特有のオプションにします。

      • Geometry Shader Compile をジオメトリシェーダーコンパイラ実行可能ファイルに特有のオプションにします。

      • Tessellation Control Shader Compile をテッセレーションコントロールシェーダーコンパイラ実行ファイルに特有のオプションにします。

      • Tessellation Evaluation Shader Compile をテッセレーション評価シェーダーコンパイラ実行ファイルに特有のオプションにします。

      各シェーダータイプに対して、Kanzi Studio マクロを使用して、コンパイラにシェーダーバイナリの保存場所を指示します。例えば、BinaryShaderCompilerExecutable <shadercode> <outputfile>。

      シェーダーコードとシェーダーバイナリは、ファイルシステム上の一時ファイルです。シェーダーコンパイラは <shadercode> から読み込み、<outputfile> に書き込みます。コンパイラがサフィックス付きのバイナリを出力する場合は、サフィックスなしのバイナリのみを出力するラッパースクリプトを使用してください。

    • すべての種類のシェーダーを組み合わせるコンパイラが GPU ベンダーから提供されている場合は、Combined Compile をシェーダーコンパイラの場所とオプションに設定します。

      リソースを最適に使用するためには、Vertex Shader Compile と Fragment Shader Compile、または Combined Compile のいずれかを使用し、両方を使用しないでください。拡張機能の詳細は、Khronos OpenGLレジストリで確認できます。

      <vertexshadercode> および <fragmentshadercode> マクロを使用して個々のソースを指し示し、<shaderbinary> マクロを使用して結合された出力ファイルを指し示すことができます。

      Combined Compile プロパティを設定する際は、次の名前を使用してください。

      GPUベンダー

      Name

      Imagination Technologies

      SGX_PROGRAM_BINARY_IMG

      ARM Mali

      MALI_PROGRAM_BINARY_ARM

      Vivante

      PROGRAM_BINARY_VIV

      Digital Media Professionals

      • SMAPHS30_PROGRAM_BINARY_DMP

      • SMAPHS_PROGRAM_BINARY_DMP

      • DMP_PROGRAM_BINARY_DMP

      NVidia

      NVIDIA_PROGRAM_BINARY_NV

      AMD

      Z400_BINARY_AMD

  5. ターゲットデバイスでバイナリシェーダーが機能するかどうかをテストします。

    1. File > Export > Export KZB を選択します。

      ../../_images/export-kzb-binary.png
    2. Kanzi アプリケーションをターゲットデバイスで起動し、アプリケーションログを確認してください。バイナリシェーダーに関連するエラーがなければ、バイナリシェーダーは正常に動作しています。Kanzi アプリケーションのデプロイ を参照してください。

Kanzi シェーダーをバイナリシェーダーでオーバーライドする

Kanzi は、テキストのレンダリングやテクスチャのブリットなどの基本的なレンダリング操作を実行するために使用するデフォルトのマテリアルタイプのセットを備えています。Kanzi は、デフォルトのマテリアルタイプを専用の kzb ファイルに保存し、これらは Kanzi kzcoreui および kzui ライブラリに埋め込まれています。デフォルトのマテリアルタイプはソースシェーダーのみを持っているため、Kanzi はアプリケーションの起動時や実行時にシェーダーを取得する際に、シェーダーのコンパイルに時間がかかります。Kanzi アプリケーションの起動時間を短縮するには、デフォルトのマテリアルタイプの組み込みソースシェーダーを、ターゲットデバイス用のバイナリシェーダーでオーバーライドすることができます。

Kanzi シェーダーをバイナリシェーダーでオーバーライドするには:

  1. Kanzi Studio で次のいずれかを開きます:

    • <KanziWorkspace>/Assets/RuntimeAssets/Tool_project/RuntimeAssets.kzproj Kanzi Studio プロジェクト。

    • Library Alt を押しながら右クリック Project References の Kanzi アプリケーションのメインプロジェクトで、Existing Project を選択し、<KanziWorkspace>/Assets/RuntimeAssets/Tool_project/RuntimeAssets.kzproj Kanzi Studio プロジェクトを選択します。Kanzi Studio プロジェクトを Kanzi アプリケーションに統合する を参照してください。Kanzi Studio は新しいタブで RuntimeAssets プロジェクトをロードします。

      ../../_images/project-reference-create-existing-project.png ../../_images/runtimeassets-project-tab.png
  2. (オプション) デフォルトで、すべての Kanzi デフォルトシェーダーをバイナリシェーダーで上書きしたくない場合は、RuntimeAssets プロジェクトで削除します:

    • バイナリシェーダーで上書きしたくないシェーダーを持つマテリアル。

    • これらのマテリアルが使用するシェーダーファイルとマテリアルタイプ。

  3. ターゲットデバイス用のバイナリシェーダーフォーマットを作成します。一般的なバイナリシェーダーフォーマットの使用 を参照してください。

  4. RuntimeAssets プロジェクトで:

    1. メインメニューで Project > Properties を選択し、Properties で:

      • Export Shader Source Code プロパティを無効にします。

        kzb ファイルのサイズを縮小するには、シェーダーソースコードをエクスポートしないでください。

      • Property Namespace が空であることを確認してください。

      ../../_images/runtimeassets-project-menu.png ../../_images/disable-export-shader-source-code.png
    2. Node Tree で RuntimeAssetsScreen ノードを選択し、Properties で Disable KZB Export プロパティが有効になっていることを確認してください。

      ../../_images/runtimeassetsscreen-disable-kzb-export.png
  5. File > Export > Export KZB を選択します。

    Kanzi Studio は <KanziWorkspace>/Assets/RuntimeAssets/Tool_project/Binary ディレクトリに RuntimeAssets.kzb ファイルを作成します。

    ../../_images/export-kzb-binary.png
  6. Kanzi アプリケーションのリソースマネージャーに RuntimeAssets.kzb ファイルを登録するには、次のいずれかの方法を使用します。

    • Kanzi アプリケーションが kzb 設定ファイルを使用してスタートアップ kzb ファイルをロードする場合、アプリケーションのメインプロジェクトの kzb 設定ファイル <project_name>.kzb.cfg に RuntimeAssets.kzb を追加してください。

    • アプリケーションのメイン Kanzi Studio プロジェクトに RuntimeAssets.kzproj をプロジェクト参照として追加した場合、メインプロジェクトのkzbファイルをエクスポートすると、Kanzi Studio が自動的に RuntimeAssets.kzb をメインプロジェクトのkzb設定ファイルに追加します。

    • スタートアップkzbファイルを手動でロードする場合、ResourceManager::addKzbFile 関数を使用して、RuntimeAssets.kzb ファイルを Kanzi アプリケーションのリソースマネージャーに追加してください。

      // At application startup register the RuntimeAssets.kzb file to the resource manager.
      void onStartup() override
      {
          getResourceManager()->addKzbFile("RuntimeAssets.kzb");
      }
      
  7. アプリケーションに3Dテキストが含まれている場合は、<KanziWorkspace>/Assets/kzuiassets/Tool_project/kzuiassets.kzproj Kanzi Studio プロジェクトを使用して手順を繰り返してください。

    kzuiassets プロジェクトには、Kanzi がデフォルトで3Dテキストをレンダリングするために使用するマテリアルタイプが含まれています。

Kanzi アプリケーションを実行すると、組み込みのソースシェーダーを使用する代わりに、RuntimeAssets.kzb および kzuiassets.kzb ファイルからバイナリシェーダーをロードします。これにより、Kanzi アプリケーションの起動時間が短縮されます。なぜなら、Kanzi Engine がソースシェーダーをコンパイルする必要がないからです。

複数ターゲットデバイス用のプロジェクトでバイナリシェーダーを設定する

Kanzi ソリューションでは、シェーダーを含む各 Kanzi Studio プロジェクトは、ターゲットデバイスの各タイプに対して1つのバイナリシェーダーフォーマットのみを必要とします。Kanzi Studio では、特定のターゲットデバイスに必要なバイナリシェーダーのみを各 kzb ファイルに含めるためにテーマを使用できます。Kanzi Studio ソリューションに複数のプロジェクトが含まれている場合、シェーダー、マテリアルタイプ、およびマテリアルを専用のリソースプロジェクトに保存できます。これにより、異なるターゲットデバイス向けのコンテンツを単一のプロジェクトで管理することが可能になります。

1 つのプロジェクトで複数ターゲットデバイスのバイナリシェーダーを設定するには:

  1. Library > Themes で Theme Group を作成し、Properties で Export Baked Usages プロパティを有効にします。

    この Theme Group は、異なるバイナリシェーダーフォーマットを必要とする各ターゲットデバイスのためにテーマを作成する際に使用します。

    Export Baked Usages プロパティを有効にすると、このテーマグループ内のテーマからリソースをベイクすることができます。

    ベイクされた Themes を参照してください。

    ../../_images/target-hardware-theme-group-in-library.png ../../_images/target-hardware-theme-group-properties.png
  2. Library > Themes で、前のステップで作成した Theme Group をダブルクリックし、Theme Editor で異なるバイナリシェーダーフォーマットを必要とする各ターゲットデバイスのためのテーマを作成します。Themes を使用する を参照してください。

    ../../_images/create-themes-for-target-hardware.png
  3. Library > Materials and Textures > Shader Formats で、使用したい各 Binary Shader Format を選択し、Properties で Theme プロパティを、バイナリシェーダーフォーマットを必要とするターゲットデバイス用に前のステップで作成したテーマに設定します。

    この方法で、Kanzi Studio を設定して、この焼き付けられたテーマでこの Binary Shader Format をエクスポートします。

    ../../_images/sgx_binary_img-properties.png
  4. File > Export > Export Baked Theme Binaries を選択し、Themes and Locales to Bake on Export ウィンドウで作成した Theme Group に対して、Theme Group 内のすべてのテーマをベイクするために < All > を選択するか、ベイクしたい特定のテーマを選択します。ベイクされた Themes のエクスポート を参照してください。

    ../../_images/export-baked-theme-binaries.png ../../_images/export-baked-target-hardware-themes.png

ベイクされたテーマをエクスポートする際、Kanzi Studio は、ベイクされたテーマに設定したバイナリシェーダーのタイプのみを持つマテリアルタイプを各kzbファイルに含めます。

シェーダーバイナリのキャッシュ

パフォーマンスが制約されているプラットフォームでは、シェーダーのコンパイルがアプリケーションの起動を大幅に遅くし、実行時のパフォーマンスを低下させる可能性があります。プラットフォームがオフラインのシェーダーコンパイルツールを提供していない場合、アプリケーションが必要とするシェーダーのセットでプライムされたシェーダーバイナリキャッシュを使用することができます。これにより、アプリケーションは実行時にソースからシェーダーをコンパイルする必要がなくなります。

シェーダーバイナリをキャッシュするには、アプリケーション構成で:

  1. シェーダーバイナリキャッシュを保存するディレクトリを設定します。ShaderBinaryCacheDirectory を参照してください。

  2. キャッシングを有効にします。ShaderBinaryCacheEnabled を参照してください。

  3. (オプション) ハッシュの衝突を防ぐために、開発中にアプリケーションを設定してシェーダーのソースコードを保存し、完全な文字列比較を行ってシェーダーが同一であることを確認できます。2つのシェーダーが同じハッシュ値を生成した場合、アプリケーションは警告をログに記録します。詳細は、ShaderBinaryCacheCollisionCheck を参照してください。

  4. (オプション) アプリケーションが本番環境の準備が整ったら、シェーダーバイナリキャッシュを読み取り専用にすることができます。詳細は、ShaderBinaryCacheReadOnly を参照してください。

たとえば、次のいずれかを行います。

  • application.cfg 設定ファイルに、追加してください。

    # Set the shader binary cache directory to /tmp/shader-cache/.
    ShaderBinaryCacheDirectory = "/tmp/shader-cache/"
    
    # Enable the caching of shader binaries.
    ShaderBinaryCacheEnabled = true
    
    # Enable checking for hash collisions in cached shaders.
    # Use this only during development.
    ShaderBinaryCacheCollisionCheck = true
    
  • Application::onConfigure 関数内のC++アプリケーションで、追加

    // Set the shader binary cache directory to /tmp/shader-cache/.
    configuration.shaderBinaryCacheDirectory = "/tmp/shader-cache/";
    
    // Enable the caching of shader binaries.
    configuration.shaderBinaryCacheEnabled = true;
    
    // Enable checking for hash collisions in cached shaders.
    // Use this only during development.
    configuration.shaderBinaryCacheCollisionCheck = true;
    

シェーダーバイナリのキャッシュには、Kanzi Studio がシェーダーのソースコードを kzb ファイルにエクスポートする必要があります。Kanzi Studio の Project > Properties で、Export Shader Source Code プロパティが有効になっていることを確認してください。これはデフォルトの値です。

../../_images/project-properties.png ../../_images/properties-export-shader-source-code-enabled.png

関連項目

Kanzi アプリケーションのデプロイ

シェーダースイッチの削減

フラグメントシェーダーの最適化

リソースを並列でロードする

アプリケーションのパフォーマンスのトラブルシューティング

Kanzi Studio プロジェクトを Kanzi アプリケーションに統合する

アプリケーションのテーマ設定

Themes を使用する

Themes のエクスポート

アプリケーション開発

アプリケーション構成リファレンス