関数引数 (DirectX HLSL)
関数は、1 つ以上の入力引数を取ります。各引数の宣言には、次の構文を使用します。
[InputModifier] Type Name [: Semantic] [InterpolationModifier] [= Initializers] |
---|
[修飾子] 型の名前 [: セマンティクス] [: 補間修飾子] [= 初期化子]
複数の関数引数を指定するときは、コンマ (,) で区切ります。
パラメーター
InputModifier
引数が入力、出力、または両方であることを示す語 (省略可能)。値 説明 in 入力のみ inout 入力および出力 out 出力のみ uniform 入力専用の定数データ パラメーターは必ず値で渡されます。in は、パラメーターの値を呼び出し元アプリケーションからコピーして入力してから、この関数を開始する必要があることを示します。out は、パラメーターの直前の値をコピーして出力し、この関数が終了するときに呼び出し元アプリケーションに返す必要があることを示します。inout は in と out の両方を指定する省略形です。
uniform 値は、定数レジスタから取得します。頂点シェーダーやピクセル シェーダーの各呼び出しでは、uniform 変数について同じ初期値を参照します。グローバル変数は、uniform として宣言されたかのように扱われます。上位レベルでない関数に対しては、uniform は in と同義です。パラメーターの使用目的が指定されなかった場合は、使用目的は in であると想定されます。
Type
引数の型。有効な HLSL の型のいずれかを指定できます。Name
シェーダー関数の名前を一意に識別する ASCII 文字列です。Semantic
データの使用目的を識別する文字列 (省略可能) (「セマンティクス (DirectX HLSL)」を参照)。InterpolationModifier
補間修飾子 (省略可能)。シェーダーはこれに基づいて補間方法を決定できます。関数引数の補間修飾子は、ピクセル シェーダー関数への入力として使用される引数にのみ適用できます。Initializers
初期化に使用される値 (省略可能)。複数の成分を持つデータ型の初期化には、複数の値を指定する必要があります。
解説
関数引数は、関数宣言でコンマ区切りの引数リストで指定します。C 関数と同様に、各引数ではパラメーターの名前および型を宣言する必要があります。またオプションとして、HLSL 関数への引数には、セマンティクス、初期値、および補間タイプが指定可能なピクセル シェーダー入力を指定することもできます。
関数引数の Type には、構造体を指定することもできます。そこで、メンバーごとの補間修飾子を指定できます。関数変数にも補間修飾子を指定した場合は、関数変数の修飾子が Type 内で宣言されている補間修飾子をオーバーライドします。
例
次の例 (「BasicHLSL10 サンプル」から抜粋) では、頂点シェーダー関数への均一入力と非均一入力を示しています。
VS_OUTPUT RenderSceneVS( float4 vPos : POSITION, float3 vNormal : NORMAL, float2 vTexCoord0 : TEXCOORD, uniform int nNumLights, uniform bool bTexture, uniform bool bAnimate ) { ... }
次の例 (「ContentStreaming サンプル」から抜粋) では、入力構造体を使用してピクセル シェーダー関数に引数を渡しています。
VSBasicIn input struct VSBasicIn { float4 Pos : POSITION; float3 Norm : NORMAL; float2 Tex : TEXCOORD0; }; PSBasicIn VSBasic(VSBasicIn input) { ... }