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 ブロックに関連付けられているステートメント ブロックが処理されます。