if ステートメント

条件式の評価に基づいて、一連のステートメントを条件付きで実行します。

[Attribute] if ( Conditional ) { Statement Block; }

パラメーター

属性

ステートメントのコンパイル方法を制御する省略可能なパラメーター。

属性 説明
分岐 指定された条件に応じて、if ステートメントの 1 つの側のみを評価します。 メモ:シェーダー モデル 2.x またはシェーダー モデル 3.0 を使用する場合、動的分岐を使用するたびにリソースが消費されます。 そのため、これらのプロファイルをターゲットにしたときに動的分岐を過剰に使用すると、コンパイル エラーが発生する可能性があります。
フラット化 (flatten) if ステートメントの両側を評価し、結果の 2 つの値のいずれかを選択します。

条件 付き

条件 。 式が評価され、true の場合はステートメント ブロックが実行されます。

ステートメント ブロック

1 つ以上 の HLSL ステートメント

注釈

コンパイラが if ステートメントをコンパイルするために分岐メソッドを使用すると、指定された条件に応じて if ステートメントの 1 つの側のみを評価するコードが生成されます。 たとえば、if ステートメントでは次のようになります。

[branch] if(x)
{
    x = sqrt(x);
}

if ステートメントには暗黙的な else ブロックがあり、これは x = x と同じです。 前の分岐属性で分岐メソッドを使用するようにコンパイラに伝えたため、コンパイルされたコードは x を評価し、実行する必要がある側のみを実行します。x が 0 の場合は else 側が 実行され、0 以外の場合は then 側が実行されます。

逆に、 flatten 属性が使用されている場合、コンパイルされたコードは if ステートメントの両側を評価し、元の値 x を使用して結果の 2 つの値を選択します。 フラット化属性の使用例を次に示します。

[flatten] if(x)
{
    x = sqrt(x);
}

ブランチ属性またはフラット化属性を使用するとコンパイル エラーが発生する場合があります。 if ステートメントの両側に tex2D などのグラデーション関数が含まれている場合、分岐属性は失敗する可能性があります。 if ステートメントのいずれかの側にストリーム追加ステートメントが含まれている場合、または副作用がある他のステートメントが含まれている場合、flatten 属性は失敗する可能性があります。

if ステートメントでは、オプションの else ブロックを使用することもできます。 if 式が true の場合、if ステートメントに関連付けられているステートメント ブロック内のコードが処理されます。 それ以外の場合は、オプションの else ブロックに関連付けられているステートメント ブロックが処理されます。

関連項目

フロー制御