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

Kanzi は、レンダリングされたバッチが前のバッチと異なるシェーダーを持つたびにシェーダーを切り替える必要があります。マテリアルは独自の頂点シェーダーとフラグメントシェーダーを持つことができるため、場合によってはシーンのレンダリング中にアプリケーションが何度もシェーダーを切り替える必要があります。

バーテックスシェーダーとフラグメントシェーダーはそれぞれシェーダープログラムにコンパイルされ、使用が必要になるたびに GPU に送られます。GPU は一度に 1 つのプログラムしか保持しません。シーン内のマテリアルごとに少なくとも 1 回のシェーダー切り替えが必要です。シェーダープログラム間の過剰な切り替えが必要になる順序でオブジェクトが描画されると、レンダリングが遅くなる可能性があります。

シェーダーの切り替え回数 (Pipeline Count) は、Kanzi Studio の Preview の Performance HUD で確認できます。アプリケーションのパフォーマンスのトラブルシューティング を参照してください。

シェーダースイッチによってアプリケーションのパフォーマンスが低下するので、シェーダースイッチは最小限に抑えてください。シェーダースイッチを減らすには、次のことを行ってください:

  • 可能な限り同じシェーダーを使用するようにしてください。このアプローチの欠点は、ユニフォーム送信の回数が増加する可能性があることです。

  • マテリアルタイプごとにレンダーオブジェクトをレンダリングしてパフォーマンスを向上させます。マテリアルタイプ別のノードのレンダリング を参照してください。

マテリアルタイプ別のノードのレンダリング

マテリアルタイプ別にノードをレンダリングするには:

  1. Library Alt を押しながら右クリック Rendering > Object Sources で Sorting Filter を選択します。

    ../../_images/create-sorting-filter.png
  2. Properties セット内で:

    • フィルタリングのためにノードを収集したいソースに Source します。たとえば、プロジェクト内のすべてのノードにフィルタを適用するには、Root Object Source を選択します。フィルタリングのためにノードを収集するソースとして、別のフィルタの出力を選択することもできます。

    • Sorting Type を Material type にして、ノードをマテリアルタイプごとにグループ化します。ノードをマテリアルタイプごとにグループ化することで、Kanzi アプリケーションを最適化できます。なぜなら、その方法で Kanzi がシェーダースイッチの数を減らすことができるからです。

    • Reverse Order プロパティを有効または無効にします。

      • 有効にすると、現在のノード順序が反転されます。

      • 無効にすると、現在のノード順序が維持されます。

  3. Library > Rendering > Render Pass Prefabs で Group レンダーパスを作成し、その中に以下を作成します。

    • Clear レンダーパス

    • Gather Lights レンダーパスと、その中の Draw Objects レンダーパス

    ../../_images/render-passes-for-filters.png
  4. Library で、作成した Draw Objects レンダーパスを選択し、Properties で Object Source プロパティを、作成したフィルタまたはフィルタを収集するオブジェクトソースに設定します。

  5. Node Tree で、フィルタを適用する Viewport 2D ノードを選択し、Properties で Render Pass Prefab プロパティを、作成したフィルタをオブジェクトソースとして使用する Draw Objects レンダーパスを子孫に持つ Group レンダーパスに設定します。

    ../../_images/render-pass-prefab-set-to-group-render-pass.png

    Kanzi Studio は、フィルタによって収集されたノードをレンダリングします。

関連項目

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

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

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