HLSL シェーダーの最適化

ここでは、シェーダーの最適化に関して使用できる汎用的な戦略について説明します。これらの戦略は、任意の言語で書かれた任意のプラットフォーム上のシェーダーに対して適用できます。

  • シェーダー計算を実行する場所を知る
  • 不必要な命令をスキップする
  • 変数および補間値をパックする
  • シェーダーを単純にする
  • 関連トピック

シェーダー計算を実行する場所を知る

頂点シェーダーは、頂点のフェッチと頂点データの行列変換を含む処理を実行します。通常、頂点シェーダーは、頂点ごとに 1 回実行されます。

ピクセル シェーダーは、テクスチャー データのフェッチとライティングの計算を含む処理を実行します。通常、ピクセル シェーダーは、特定のジオメトリに対してピクセルごとに 1 回実行されます。

通常、シーン内の頂点の数よりもピクセルの数の方が多いので、頂点シェーダーよりもピクセル シェーダーの方が実行回数が多くなります。

シェーダー アルゴリズムをデザインする場合は、次の点に注意する必要があります。

  • 可能な限り、頂点シェーダーで計算を行います。ピクセル シェーダーで実行される計算は、頂点シェーダーで実行される計算よりもコストが高くなります。
  • 大量のメッシュなどの状況では、パフォーマンスを向上させるために頂点単位の計算の使用を検討してください。大量のメッシュの場合は、ピクセル単位の計算の結果と視覚的に見分けのつかない結果を頂点単位の計算で生成できる場合があります。

不必要な命令をスキップする

HLSL では、動的分岐を使用して、実行される命令の数を制限できます。したがって、動的分岐は、シェーダーの実行を高速化するのに役立ちます。ジオメトリまたはピクセルが表示されない状況では、動的分岐を使用して、シェーダーを終了したり命令を制限したりする必要があります。たとえば、ピクセルがライティングされない場合は、ライティング アルゴリズムを実行するポイントはありません。

次の表に、シェーダーの状況をテストし、動的分岐を使用して不必要な命令をスキップできるようないくつかのケースを示します。この表は包括的なものではありません。この表は、コードを最適化するためのアイデアを示しています。

チェックする状態 シェーダーでの対応
アルファ チェックにより、ピクセルが表示されないことがわかった。 シェーダーの残りの部分をスキップします。
ピクセルまたはジオメトリに完全にフォグが適用される。 シェーダーの残りの部分をスキップします。
スキンの重みが 0 である。 ボーンをスキップします。
ライトの減衰が 0 である。 ライティングをスキップします。
正でないランベルト項。 ライティングをスキップします。

変数および補間値をパックする

シェーダー データに必要な空間に注意してください。できるだけ多くの情報を変数または補間値にパックしてください。場合によっては、2 つの変数の情報を単独の変数のメモリー空間にパックすることができます。

シェーダーを単純にする

シェーダーを小さく単純に保つ。一般に、命令数の少ないシェーダーの方が、命令数の多いシェーダーよりも高速で実行されます。また、小さくて複雑でないシェーダーの方が、デバッグや最適化が容易です。

関連トピック

HLSL のプログラミング ガイド