Share via


if ステートメント (DirectX HLSL)

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

[Attribute] if ( Conditional )

{

  Statement Block;

}

パラメーター

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

    属性 説明
    branch 指定された条件に応じて、if ステートメントの片側のみを評価します。
    flatten if ステートメントの両側を評価し、2 つの結果の値のどちらかを選択します。
  • Conditional
    条件。式の評価を評価し、結果が TRUE の場合はステートメント ブロックを実行します。

  • Statement Block
    1 つまたは複数の HLSL ステートメント

解説 

if ステートメントのコンパイルに分岐メソッドを使用する場合、コンパイラは、指定された条件に応じて if ステートメントの片側のみを評価するコードを生成します。次は、if ステートメントでの例です。

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

この if ステートメントには、x = x と同じ意味を持つ暗黙的な else ブロックが存在します。前述の branch 属性によって、分岐メソッドの使用をコンパイラに指定しているので、コンパイルされたコードは x を評価して、実行が必要な側のみを実行します。つまり、x が 0 の場合は、else 側を実行し、x が 0 以外の場合は、then 側を実行します。

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

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

branch または flatten 属性を使用することで、エラーが発生する場合があります。branch 属性は、tex2D などのグラデーション関数が if ステートメントの片側に指定された場合に、失敗する可能性があります。また、flatten 属性は、ストリーム追加ステートメントや副作用があるその他のステートメントが if ステートメントの片側に指定された場合に、失敗する可能性があります。

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

関連項目

フロー制御