packoffset (DirectX HLSL)
オプションのシェーダー定数パッキング キーワードです。使用する構文は次のとおりです。
: packoffset( c[Subcomponent][.component] ) |
---|
パラメーター
- packoffset
必須キーワードです。 - c
定数レジスタ (c) のみにパッキングを適用します。 - [Subcomponent][.component]
オプションのサブコンポーネントとコンポーネントです。サブコンポーネントは、レジスタ番号を示す整数で指定します。コンポーネントは [.xyzw] という形式をとります。
解説
このキーワードを使用して、変数型の宣言時にシェーダー定数を手動でパックします。
定数をパックする際は、複数の定数型を混在して使用することはできません。
グローバル定数と均一定数とでは、コンパイラの動作が多少異なります。
- グローバル定数の場合: コンパイラで、グローバル変数がグローバル定数として $Global cbuffer に追加されます。自動的にパックされた要素 (packoffset を指定せずに宣言した要素) は、手動でパックした最後の変数の後に配置されます。グローバル定数のパック時には、複数の型を混在して使用できます。
- 均一定数の場合: エフェクト フレームワークの外部でシェーダーをコンパイルする場合は、関数のパラメーター リストにある均一パラメーターがコンパイラで $Param 定数バッファーに追加されます。エフェクト フレームワークの内部でコンパイルする場合、均一定数はグローバル スコープで定義した均一変数に解決される必要があります。均一定数を手動でオフセットすることはできません。均一定数は、アプリケーション データをシェーダーに渡すための手段ではなく、グローバルに対してエイリアス化したシェーダーとする場合にのみ使用することをお勧めします。
次に、シェーダー モデル 4 を使用して定数をパックする例をいくつか示します。
例
次に、シェーダー定数を手動でパックする例をいくつか示します。
レジスタの境界を越えないように十分に大きいサイズとしたベクトルおよびスカラのサブコンポーネントコンポーネントをパックします。たとえば、下記はすべて有効です。
cbuffer MyBuffer { float4 Element1 : packoffset(c0); float1 Element2 : packoffset(c1); float1 Element3 : packoffset(c1.y); }