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

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

OpenGLでは、頂点シェーダーとフラグメントシェーダーはそれぞれシェーダープログラムにコンパイルされ、使用する必要があるときにGPUに送信されます。GPUは一度に1つのプログラムしか保存しません。シーン内の各マテリアルに対して少なくとも1回のシェーダースイッチが必要です。オブジェクトがシェーダープログラム間の過度な切り替えを必要とする順序で提示されると、レンダリングが遅くなる可能性があります。

Kanzi Studio Preview Performance HUD、または Kanzi Engine APIで Renderer::getShaderSwitchCount を呼び出すことにより、シェーダースイッチの数を確認できます。アプリケーションのパフォーマンスのトラブルシューティング を参照してください。

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

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

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

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

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

  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 Render Pass を作成し、その中に以下を作成します:

    • Clear Render Pass

    • Gather Lights Render Pass とその中の Draw Objects Render Pass

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

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

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

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

関連項目

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

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

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

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