構造体の型
HLSL を使用して構造体を宣言するには、次の構文を使用します。
struct Name{ [InterpolationModifier] Type[RxC] MemberName; ... };
パラメーター
-
名前
-
構造体名を一意に識別する ASCII 文字列。
-
[InterpolationModifier]
-
補間の種類を指定する省略可能な修飾子。 詳細については、「解説」を参照してください。
-
Type[RxC]
-
オプションの行 (R) x 列 (C) 配列サイズを持つメンバー型。 構造体には、少なくとも 1 つの要素が含まれています。複数の要素が含まれている場合、要素はすべて同じ型になります。 行と列の数は、1 から 4 までの符号なし整数です。
-
Membername
-
メンバー名を一意に識別する ASCII 文字列。
解説
補間修飾子は、任意の構造体メンバーまたはピクセル シェーダー関数の引数で指定できます。 両方の場所に修飾子が表示される場合、外側の修飾子 (ピクセル シェーダー引数修飾子) は内部修飾子 (構造体修飾子) を覆います。
シェーダーまたは効果をコンパイルする場合、シェーダー コンパイラは HLSL パッキング 規則に従って構造体メンバーをパックします。
シェーダー モデル 4 で導入された補間修飾子
ピクセル シェーダー入力に使用される頂点シェーダー出力は、ラスター化時にピクセル単位の値を取得するために線形補間されます。 補間の方法を設定するには、 シェーダー モデル 4 以降でサポートされている次のいずれかの値を使用します。 この修飾子は、ピクセル シェーダー入力として使用されていない頂点シェーダー出力では無視されます。
補間修飾子 | 説明 |
---|---|
線形 | シェーダー入力間の補間。 補間 修飾子が指定されていない場合、linear は既定値です。 |
centroid | ピクセルの覆われた領域内のどこかにあるサンプル間を補間します (ピクセルの中心からエンドポイントを外挿する必要がある場合があります)。 重心サンプリングは、ピクセルが部分的に覆われている場合 (ピクセルの中心がカバーされていない場合でも) アンチエイリアシングを改善する可能性があります。 重心修飾子は、線形修飾子または noperspective 修飾子と組み合わせる必要があります。 |
nointerpolation | を補間しないでください。 |
noperspective | 補間中にパースペクティブ補正を実行しないでください。 noperspective 修飾子は、重心修飾子と組み合わせることができます。 |
sample |
シェーダー モデル 4.1 以降で使用可能ピクセルの中心ではなく、サンプルの位置で補間します。 これにより、ピクセル ごとのシェーダーは、ピクセル単位ではなくサンプルごとに実行されます。 サンプルごとの実行を引き起こすもう 1 つの方法は、 セマンティック SV_SampleIndexを持つ入力を持つことです。これは、現在のサンプルを示します。 指定された サンプル (または入力SV_SampleIndex) を持つ入力のみがピクセル内のシェーダー呼び出しで異なりますが、修飾子を指定しない他の入力 (たとえば、異なる入力に修飾子を混在させる場合) は、ピクセルの中心で補間されます。 ピクセル シェーダー呼び出しと深度/ステンシル テストの両方が、ピクセル内のすべての対象サンプルに対して行われます。 これは スーパーサンプリングと呼ばれることもあります。 これに対し、 マルチサンプリングと呼ばれるサンプル頻度の呼び出しがない場合、ピクセル シェーダーは、カバーされるサンプルの数に関係なくピクセルごとに 1 回呼び出されますが、深度/ステンシル テストはサンプルの頻度で行われます。 どちらのモードでも、同等のエッジ アンチエイリアシングが提供されます。 ただし、スーパーサンプリングでは、ピクセル シェーダーをより頻繁に呼び出すことで、シェーディング品質が向上します。 |
- 1. int/uint 型を使用する場合、有効なオプションは **nointerpolation** だけです。
補間修飾子は、構造体メンバーまたは 関数引数、またはその両方に適用できます。
例
構造体宣言の例を次に示します。
struct struct1
{
int a;
}
この宣言には配列が含まれます。
struct struct2
{
int a;
float b;
int4x4 iMatrix;
}
この宣言には補間修飾子が含まれます。
struct In
{
centroid float2 Texcoord;
};