シェーダースイッチの削減¶
Kanzi は、レンダリングされたバッチが前のバッチと異なるシェーダーを持つたびにシェーダーを切り替える必要があります。マテリアルは独自の頂点シェーダーとフラグメントシェーダーを持つことができるため、場合によってはシーンのレンダリング中にアプリケーションが何度もシェーダーを切り替える必要があります。
OpenGLでは、頂点シェーダーとフラグメントシェーダーはそれぞれシェーダープログラムにコンパイルされ、使用する必要があるときにGPUに送信されます。GPUは一度に1つのプログラムしか保存しません。シーン内の各マテリアルに対して少なくとも1回のシェーダースイッチが必要です。オブジェクトがシェーダープログラム間の過度な切り替えを必要とする順序で提示されると、レンダリングが遅くなる可能性があります。
Kanzi Studio Preview Performance HUD、または Kanzi Engine APIで Renderer::getShaderSwitchCount を呼び出すことにより、シェーダースイッチの数を確認できます。アプリケーションのパフォーマンスのトラブルシューティング を参照してください。
シェーダースイッチによってアプリケーションのパフォーマンスが低下するので、シェーダースイッチは最小限に抑えてください。シェーダースイッチを減らすには、次のことを行ってください:
可能な限り同じシェーダーを使用するようにしてください。このアプローチの欠点は、ユニフォーム送信の回数が増加する可能性があることです。
マテリアルタイプごとにレンダーオブジェクトをレンダリングしてパフォーマンスを向上させます。マテリアルタイプ別のノードのレンダリング を参照してください。
マテリアルタイプ別のノードのレンダリング¶
マテリアルタイプ別にノードをレンダリングするには:
Library Alt を押しながら右クリック Rendering > Object Sources で Sorting Filter を選択します。
Properties セット内で:
フィルタリングのためにノードを収集したいソースに Source します。たとえば、プロジェクト内のすべてのノードにフィルタを適用するには、Root Object Source を選択します。フィルタリングのためにノードを収集するソースとして、別のフィルタの出力を選択することもできます。
Sorting Type を Material type にして、ノードをマテリアルタイプごとにグループ化します。ノードをマテリアルタイプごとにグループ化することで、Kanzi アプリケーションを最適化できます。なぜなら、その方法で Kanzi がシェーダースイッチの数を減らすことができるからです。
Reverse Order プロパティを有効または無効にします。
有効にすると、現在のノード順序が反転されます。
無効にすると、現在のノード順序が維持されます。
Library > Rendering > Render Pass Prefabs の中に Group Render Pass を作成し、その中に以下を作成します:
Clear Render Pass
Gather Lights Render Pass とその中の Draw Objects Render Pass
Library で作成した Draw Objects Render Pass を選択し、Properties で Object Source プロパティを作成したフィルタ、またはフィルタを収集するオブジェクトソースに設定します。
Node Tree で、フィルタを適用したい Viewport 2D ノードを選択し、Properties で Render Pass Prefab プロパティを、子孫の Draw Objects Render Pass がオブジェクトソースとして使用するフィルタを作成した Group Render Pass に設定します。
Kanzi Studio は、フィルタによって収集されたノードをレンダリングします。