ID3D11DeviceContext1::VSSetConstantBuffers1 メソッド (d3d11_1.h)

頂点シェーダー パイプライン ステージで使用される定数バッファーを設定します。

構文

void VSSetConstantBuffers1(
  [in]           UINT         StartSlot,
  [in]           UINT         NumBuffers,
  [in, optional] ID3D11Buffer * const *ppConstantBuffers,
  [in, optional] const UINT   *pFirstConstant,
  [in, optional] const UINT   *pNumConstants
);

パラメーター

[in] StartSlot

型: UINT

定数バッファーの設定を開始するには、デバイスの 0 から始まる配列にインデックスを付けます (0 から D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。

[in] NumBuffers

型: UINT

設定するバッファーの数 (0 から D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT の範囲 - StartSlot)。

[in, optional] ppConstantBuffers

種類: ID3D11Buffer*

デバイスに渡される定数バッファーの配列。

[in, optional] pFirstConstant

型: const UINT*

ppConstantBuffers が指定するバッファーへのオフセットを保持する配列。 各オフセットは、シェーダーの観点から各定数バッファーを開始する場所を指定します。 各オフセットは、16 バイト (4*32 ビット コンポーネント) であるシェーダー定数で測定されます。 したがって、オフセット 16 は、関連付けられている定数バッファーの開始が定数バッファーに 256 バイトであることを示します。 各オフセットは、16 個の定数の倍数である必要があります。

[in, optional] pNumConstants

型: const UINT*

ppConstantBuffers が指定するバッファー内の定数の数を保持する配列。 各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を指定します。 定数の各数は、 pFirstConstant 配列で指定されたそれぞれのオフセットから開始されます。 各定数の数は、[0...4096] の範囲内の 16 個の定数の倍数である必要があります。

戻り値

なし

解説

pNumConstants がポイントする定数の数が、シェーダーでサポートされている最大定数バッファー サイズ (4096 定数) を超える場合、ランタイムは VSSetConstantBuffers1 の呼び出しを削除します。 pFirstConstant 配列と pFirstConstant + pNumConstants 配列の要素内の値は、各バッファーの長さを超える場合があります。シェーダーの観点からは、定数バッファーは、バッファーの実際のメモリ割り当てとウィンドウ [pFirstConstant の要素内の値、pFirstConstant の要素内の値 + pNumConstants の要素内の値] の積集合です。 ランタイムは、このオフセットをサポートしていない既存のドライバーの VSSetConstantBuffers1 の呼び出しも削除します。

ランタイムは、 機能レベル 9.1、9.2、および 9.3 に対してこの機能をエミュレートします。そのため、この機能は機能レベル 9.1、9.2、および 9.3 でサポートされています。 この機能は、機能レベル 10 以降の新しいドライバーで常に使用できます。

シェーダーの観点から、定数バッファー配列の要素 [0] は pFirstConstant の定数です。

シェーダーから pFirstConstant および pNumConstants によって定義されている範囲までの定数バッファーへの範囲外アクセスは 0 を返します。

pFirstConstant 配列と pNumConstants 配列が NULL の場合、バッファー全体をビューにバインドする場合と同じ結果が得られます。 VSSetConstantBuffers メソッドを呼び出すと、同じ結果が得られます。 バッファーがシェーダーでサポートされている最大定数バッファー サイズ (4096 要素) より大きい場合、シェーダーは最初の 4096 定数にのみアクセスできます。

pFirstConstant または pNumConstants のいずれかが NULL の場合、他のパラメーターも NULL である必要があります。

コマンド リスト エミュレーションを使用して VSSetConstantBuffers1 を呼び出す

VSSetConstantBuffers1 のランタイムのコマンド リスト エミュレーションでは、定数バッファーの配列のオフセットまたはサイズが実際に変更されない場合があります。 この動作は、次の場合に発生します。

VSSetConstantBuffers1 は、更新するように設定したスロットの範囲の先頭と末尾の定数バッファーを効果的に変更しません。 このセクションでは、この問題を回避する方法について説明します

動作です。

ランタイムがコマンド リストをエミュレートするか、ドライバーがコマンド リストをサポートするかをチェックするコードを次に示します。


     HRESULT hr = S_OK;
     bool needWorkaround = false;
     D3D11_DEVICE_CONTEXT_TYPE contextType = pDeviceContext->GetType();

     if( D3D11_DEVICE_CONTEXT_DEFERRED == contextType)
     {
          D3D11_FEATURE_DATA_THREADING threadingCaps = { FALSE, FALSE };

          hr = pDevice->CheckFeatureSupport( D3D11_FEATURE_THREADING, &threadingCaps, sizeof(threadingCaps) );
          if( SUCCEEDED(hr) && !threadingCaps.DriverCommandLists )
          {
               needWorkaround = true; // the runtime emulates command lists.
          }
     }

ランタイムがコマンド リストをエミュレートする場合は、次のいずれかのコード スニペットを使用する必要があります。

1 つの定数バッファーでのみオフセットとサイズを変更する場合は、最初に定数バッファーを NULL に設定します。


     pDeviceContext->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->VSSetConstantBuffers(0, 1, &NullCBuf);
     }
     pDeviceContext->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);

複数の定数バッファーを変更する場合は、範囲の最初と最後の定数バッファーを 最初に NULL に設定します。


     pDeviceContext->VSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->VSSetConstantBuffers(0, 1, &NullCBuf);
          pDeviceContext->VSSetConstantBuffers(3, 1, &NullCBuf);
     }
     pDeviceContext->VSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);

要件

   
サポートされている最小のクライアント Windows 8 および Windows 7 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2012 および Windows Server 2008 R2 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー d3d11_1.h
Library D3D11.lib

関連項目

ID3D11DeviceContext1