シェーダーのベストプラクティス

アプリケーションは、シェーダープログラムの実行にかなりの時間を費やします。特にモバイルや組み込みハードウェアでは、シェーダーはパフォーマンスのボトルネックやグラフィックのアーティファクトなど、多くの問題の原因となり得ます。シェーダーを適切に使用すれば、CPU と GPU の間で計算を分散させることで、優れたグラフィック品質とパフォーマンスを実現できます。計算をフラグメントシェーダーで行うか、バーテックスシェーダーで行うかを決める必要があります。

シェーダープログラムの頂点シェーダーは各頂点ごとに一度実行され、フラグメントシェーダーは各ピクセルごとに一度実行されます。通常、ピクセルの数は頂点の数よりも桁違いに多いです。このため、ベストプラクティスとしては、頂点シェーダーで可能な限り多くの計算を行い、その結果をフラグメントシェーダーで使用することです。

ジオメトリシェーダーとテッセレーションシェーダーを使用するには、Kanzi アプリケーションを実行するハードウェアが OpenGL ES 3.2 または Vulkan 1.1 をサポートしている必要があります。ジオメトリシェーダーとテッセレーションシェーダーは、タイルベースのレンダリングアーキテクチャではパフォーマンスを低下させる可能性があることに注意してください。そのため、モバイルや組み込みハードウェアではジオメトリシェーダーとテッセレーションシェーダーの使用を避けることをお勧めします。

最もよく発生するシェーダーのボトルネックには以下のとおりです。

  • フラグメントシェーダーでの不必要な計算と、負荷が高いフラグメントシェーダー。フラグメントシェーダーの最適化 を参照してください。

  • 長い頂点シェーダーを持つ3Dモデル。頂点シェーダーがボトルネックである場合、パフォーマンスを向上させるために命令の数を減らしてください。フラグメントシェーダーがボトルネックである場合、頂点シェーダーでの最適化はパフォーマンスに影響を与えません。

  • 多数のピクセルをフィルする必要がある多数のフラグメントを使用した表示。

  • GPUに送信され、頂点シェーダーによって処理される頂点。三角形の数は、フレームごとに描画される頂点数のヒントを提供します。アプリケーションのパフォーマンスのトラブルシューティング を参照してください。

Kanzi Studio は、異なるシェーダープロファイル用のこれらのテンプレートを提供します。

  • High performance vertex shaders テンプレートは、低精度で高パフォーマンスのアプリケーション向けです。このテンプレートには頂点ベースのシェーダーが含まれています。Phong 反射モデルを使用したライトの適用を含め、GPU 固有の計算のほとんどはバーテックスシェーダーで行われます。ほとんどのデバイスにとって、これは良い出発点となります。

    High performance vertex shaders マテリアルタイプで提供される頂点ベースのシェーディングは、頂点ベースのシェーディングのコストが低いため、モバイルGPUにとって良い選択です。

  • High quality fragment shaders テンプレートは、高精度のアプリケーション向けです。このテンプレートにはピクセルシェーダーベースのマテリアルが含まれています。Phong 反射モデルを使用したライトの適用を含め、GPU 固有の計算のほとんどはフラグメントシェーダーで行われます。これにより、多くの場合パフォーマンスと引き換えに、より高い画質が得られます。

  • Physically based rendering テンプレートは、最新のアプリケーション向けです。このテンプレートには、物理ベースレンダリング (PBR) の原則を実装したシェーダーに基づくマテリアルが含まれています。これらのマテリアルのプロパティはメタルネスなどの物理的特性を表すため、直感的に操作できます。物理ベースのライティングモデルを使用したライトの適用を含め、GPU 固有の計算のほとんどはフラグメントシェーダーで行われます。これにより、多くのライティング条件でよりリアルなレンダリング結果が得られます。

グラフィックスハードウェアとシーンの複雑さによって、シェーダーはアプリケーションのパフォーマンスに大きな影響を与えることがあります。

../../_images/use-appropriate-project-template.png

シェーダー内のユニフォーム、およびシェーダーの入力と出力の精度を下げることで、パフォーマンスを最適化できます。シェーダーの精度は OpenGL ES と Vulkan に固有のものです。

モバイルおよび組み込みデバイスの場合、使用します:

  • [-2..2] の範囲のすべての変数に対して低精度。

  • 32ビット浮動小数点の完全な精度を必要としない他の変数には中精度を使用します。

シェーダーはマテリアル固有です。Kanzi Studio でシェーダーを直接変更できます。シェーダーを編集する を参照してください。

Kanzi アプリケーションでシェーダーを使用するためのベストプラクティスは次のとおりです。

  • 精度を減らし、計算をフラグメントからバーテックスに移すことで、フラグメントシェーダーを最適化します。フラグメントシェーダーの最適化 を参照してください。

  • シェーダープログラム間の過剰なスイッチングが必要になるような順序でノードが提示されると、レンダリング速度が低下する可能性があります。シェーダースイッチの削減 を参照してください。

  • ユーザーがマルチコアプロセッサを備えた環境で Kanzi アプリケーションを実行すると、Kanzi は自動的に複数のCPUコアを使用して、kzbファイル内のGPUリソースをRAMにロードします。

    Kanzi は、アプリケーションで使用するコアの数を設定することができます。リソースを並列でロードする を参照してください。

  • シェーダーが使用するライトの量のみを計算するようにしてください。アプリケーション内の Scene ノードのライトの数を、シェーダーが計算する量に制限してください。

  • PVRShaderEditor などのシェーダーツールを使って、シェーダーのパフォーマンスコストに関する包括的な情報を得ます。

  • シェーダーでエラーや警告がないことを確認します。

  • 複数のシェーダーで使用する機能は別のシェーダーにまとめ、そのシェーダーコードを再利用します。シェーダーコードの再利用 を参照してください。ファイルをコピーせずにプロジェクト間でシェーダーコードを再利用するには、Kanzi のシェーダーインクルードライブラリを使用します。シェーダーインクルードライブラリを使用する を参照してください。

関連項目

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

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

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

Kanzi Engine が未使用のリソースをどのように処理するかを設定する

シェーダーを編集する

Sorting Filter でオーバードローを防ぐ

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