HLSL シェーダーの最適化

このセクションでは、シェーダーを最適化するために使用できる汎用戦略について説明します。 これらの戦略は、任意の言語で記述されたシェーダーに、任意のプラットフォームで適用できます。

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

頂点シェーダーは、頂点のフェッチや頂点データのマトリックス変換を実行する操作を実行します。 通常、頂点シェーダーは頂点ごとに 1 回実行されます。

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

通常、ピクセルはシーン内の頂点よりも多いため、ピクセル シェーダーは頂点シェーダーよりも頻繁に実行されます。

シェーダー アルゴリズムを設計するときは、次の点に注意してください。

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

不要な手順をスキップする

HLSL では、動的分岐によって実行される命令の数を制限する機能が提供されます。 そのため、動的分岐はシェーダーの実行時間を短縮するのに役立ちます。 ジオメトリまたはピクセルが表示されない場合は、動的分岐を使用してシェーダーを終了するか、命令を制限します。 たとえば、ピクセルが点灯していない場合、照明アルゴリズムを実行しても意味がありません。

次の表に、シェーダーで条件をテストし、動的分岐を使用して不要な手順をスキップできるケースをいくつか示します。 テーブルは包括的ではありません。 むしろ、コードを最適化するためのアイデアを提供することを目的としています。

チェックする条件 シェーダーでの応答
アルファ チェックは、ピクセルが表示されないことを決定します。 シェーダーの残りの部分をスキップします。
ピクセルまたはジオメトリは完全に曇ります。 シェーダーの残りの部分をスキップします。
スキンの重みは 0 です。 骨をスキップします。
ライト減衰は 0 です。 照明をスキップします。
非陽性ランベルティア語。 照明をスキップします。

 

パック変数とインターポラント

シェーダー データに必要な領域に注意してください。 できるだけ多くの情報を変数またはインターポラントにパックします。 場合によっては、2 つの変数の情報を 1 つの変数のメモリ空間にパックできます。

シェーダーの複雑さを軽減する

シェーダーを小さくシンプルに保ちます。 一般に、命令の数が少ないシェーダーは、より多くの命令を持つシェーダーよりも高速に実行されます。 また、より小さく、複雑ではないシェーダーをデバッグして最適化する方が簡単です。

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

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