関数宣言の構文
HLSL 関数は、次の構文で宣言されます。
[StorageClass][clipplanes()][precise]Return_Value 名 ( [ArgumentList] ) [: Semantic] { [StatementBlock] };
パラメーター
-
StorageClass
-
関数宣言を再定義する修飾子。 現在、inline は唯一の修飾子値です。 修飾子の値も既定値であるため、 インライン である必要があります。 したがって、関数はインラインで指定するかどうかに関係なく インラインであり、HLSL 内のすべての関数はインラインです。 インライン関数は、関数呼び出しごとに関数本体のコピーを生成します (コンパイル時)。 これは、関数を呼び出すオーバーヘッドを減らすために行われます。
-
クリッププレーン
-
クリップ プレーンのオプションリスト。ユーザー指定のクリップ プレーンは最大 6 個です。 これは、機能レベル9_x 以上で動作するSV_ClipDistanceの代替メカニズムです。
-
名前
-
シェーダー関数の名前を一意に識別する ASCII 文字列。
-
ArgumentList
-
省略可能な引数リスト。関数に渡される 引数 のコンマ区切りのリストです。
-
セマンティック
-
戻りデータの目的の使用法を識別する省略可能な文字列 ( 「セマンティクス (DirectX HLSL)」を参照)。
-
StatementBlock
-
関数の本体を構成する省略可能な ステートメント 。 本体なしで定義された関数は、関数プロトタイプと呼ばれます。プロトタイプ関数の本体は、関数を呼び出す前に他の場所で定義する必要があります。
戻り値
戻り値の型には、これらの HLSL 型のいずれかを指定できます。
解説
このページの構文では、ほぼすべての種類の HLSL 関数について説明します。これには頂点シェーダー、ピクセル シェーダー、ヘルパー関数が含まれます。 ジオメトリ シェーダーも関数と共に実装されますが、その構文はもう少し複雑なので、ジオメトリ シェーダー関数宣言を定義する別のページがあります ( 「Geometry-Shader Object (DirectX HLSL)」を参照してください)。
関数は、パラメーター型やパラメーターの順序の一意の組み合わせが指定されている限り、オーバーロードできます。 HLSL には、組み込み関数または 組み込み関数も多数実装されています。
clipplanes 属性を使用して、ユーザー固有のクリップ プレーンを指定できます。 Windows は、描画されたすべてのプリミティブにこれらのクリップ プレーンを適用します。 clipplanes 属性はSV_ClipDistanceと同様に機能しますが、9_x以降のすべてのハードウェア機能レベルで動作します。 詳細については、「 機能レベル 9 ハードウェアのユーザー クリップ プレーン」を参照してください。
例
この例は、BasicHLSL10 サンプルの BasicHLSL10.fx のものです。
struct VS_OUTPUT
{
float4 Position : SV_POSITION;
float4 Diffuse : COLOR0;
float2 TextureUV : TEXCOORD0;
};
VS_OUTPUT RenderSceneVS( float4 vPos : POSITION,
float3 vNormal : NORMAL,
float2 vTexCoord0 : TEXCOORD,
uniform int nNumLights,
uniform bool bTexture,
uniform bool bAnimate )
{
VS_OUTPUT Output;
...
return Output;
}
AdvancedParticles サンプルの AdvancedParticles.fx のこの例は、戻り値の型にセマンティックを使用する方法を示しています。
//
// PS for particles
//
float4 PSPointSprite(PSSceneIn input) : SV_Target
{
return g_txDiffuse.Sample( g_samLinear, input.tex ) * input.color;
}
関連トピック