packoffset
次の構文を使用する省略可能なシェーダー定数パッキング キーワード (keyword)。
: packoffset( c[Subcomponent][.component] )
パラメーター
Item | 説明 |
---|---|
packoffset |
必須のキーワード (keyword)。 |
C |
パッキングは定数レジスタ (c) にのみ適用されます。 |
[サブコンポーネント][.component] |
オプションのサブコンポーネントとコンポーネント。 サブコンポーネントは、レジスタ番号 (整数) です。 コンポーネントは [.xyzw] の形式です。 |
注釈
このキーワード (keyword)を使用して、変数型を宣言するときにシェーダー定数を手動でパックします。
定数をパックする場合、定数型を混在させることはできません。
グローバル定数と均一定数では、コンパイラの動作が若干異なります。
- グローバル定数。 グローバル変数は、コンパイラによって $Global cbuffer にグローバル定数として追加されます。 自動的にパックされた要素 (packoffset なしで宣言されたもの) は、最後に手動でパックされた変数の後に表示されます。 グローバル定数をパックする場合は、型を混在させる場合があります。
- 均一定数。 シェーダーがエフェクト フレームワークの外部でコンパイルされると、コンパイラによって、関数のパラメーター リスト内の統一パラメーターが $Param 定数バッファーに追加されます。 効果フレームワーク内でコンパイルする場合、均一定数はグローバル スコープで定義された均一変数に解決する必要があります。 均一定数を手動でオフセットすることはできません。推奨される使用は、シェーダーにアプリケーション データを渡す手段としてではなく、グローバルに別名を返すシェーダーの特殊化にのみ使用されます。
シェーダー モデル 4 を使用した定数のパッキングのその他の例を次に示します。
例
シェーダー定数を手動でパッキングする例をいくつか次に示します。
レジスタ境界を越えないようにサイズが十分に大きいベクトルとスカラーのサブコンポーネントをパックします。 たとえば、これらはすべて有効です。
cbuffer MyBuffer
{
float4 Element1 : packoffset(c0);
float1 Element2 : packoffset(c1);
float1 Element3 : packoffset(c1.y);
}