Bagikan melalui


Metode ID3D11DeviceContext1::VSSetConstantBuffers1 (d3d11_1.h)

Mengatur buffer konstanta yang digunakan tahap alur shader vertex.

Sintaks

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

Parameter

[in] StartSlot

Jenis: UINT

Indeks ke dalam array berbasis nol perangkat untuk mulai mengatur buffer konstan ke (berkisar dari 0 hingga D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).

[in] NumBuffers

Jenis: UINT

Jumlah buffer yang akan diatur (berkisar dari 0 hingga D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot).

[in, optional] ppConstantBuffers

Jenis: ID3D11Buffer*

Array buffer konstan diberikan ke perangkat.

[in, optional] pFirstConstant

Jenis: const UINT*

Array yang menyimpan offset ke dalam buffer yang ditentukan ppConstantBuffers . Setiap offset menentukan di mana, dari sudut pandang shader, setiap buffer konstanta dimulai. Setiap offset diukur dalam konstanta shader, yaitu 16 byte (komponen 4*32-bit). Oleh karena itu, offset 16 menunjukkan bahwa awal buffer konstanta terkait adalah 256 byte ke dalam buffer konstanta. Setiap offset harus kelipatan 16 konstanta.

[in, optional] pNumConstants

Jenis: const UINT*

Array yang menyimpan jumlah konstanta dalam buffer yang ditentukan ppConstantBuffers . Setiap angka menentukan jumlah konstanta yang terkandung dalam buffer konstanta yang digunakan shader. Setiap jumlah konstanta dimulai dari offset masing-masing yang ditentukan dalam array pFirstConstant . Setiap jumlah konstanta harus kelipatan 16 konstanta, dalam rentang [0..4096].

Mengembalikan nilai

Tidak ada

Keterangan

Runtime menghilangkan panggilan ke VSSetConstantBuffers1 jika jumlah konstanta yang titik pNumConstants lebih besar dari ukuran buffer konstanta maksimum yang didukung oleh shader (4096 konstanta). Nilai dalam elemen array pFirstConstant dan pFirstConstant + pNumConstants dapat melebihi panjang setiap buffer; dari sudut pandang shader, buffer konstan adalah persimpangan alokasi memori aktual untuk buffer dan jendela [nilai dalam elemen pFirstConstant, nilai dalam elemen pFirstConstant + nilai dalam elemen pNumConstants]. Runtime juga menghilangkan panggilan ke VSSetConstantBuffers1 pada driver yang ada yang tidak mendukung offsetting ini.

Runtime akan meniru fitur ini untuk tingkat fitur 9.1, 9.2, dan 9.3; oleh karena itu, fitur ini didukung untuk tingkat fitur 9.1, 9.2, dan 9.3. Fitur ini selalu tersedia pada driver baru untuk tingkat fitur 10 dan yang lebih tinggi.

Dari sudut pandang shader, elemen [0] dalam array buffer konstan adalah konstanta di pFirstConstant.

Akses di luar batas ke buffer konstanta dari shader ke rentang yang ditentukan oleh pFirstConstant dan pNumConstants mengembalikan 0.

Jika array pFirstConstant dan pNumConstantsadalah NULL, Anda mendapatkan hasil yang sama seolah-olah Anda mengikat seluruh buffer ke tampilan. Anda mendapatkan hasil yang sama ini jika Anda memanggil metode VSSetConstantBuffers . Jika buffer lebih besar dari ukuran buffer konstanta maksimum yang didukung oleh shader (4096 elemen), shader hanya dapat mengakses 4096 konstanta pertama.

Jika pFirstConstant atau pNumConstants adalah NULL, parameter lainnya juga harus NULL.

Memanggil VSSetConstantBuffers1 dengan emulasi daftar perintah

Daftar perintah runtime vsSetConstantBuffers1 terkadang tidak benar-benar mengubah offset atau ukuran untuk array buffer konstan. Perilaku ini terjadi ketika

VSSetConstantBuffers1 tidak secara efektif mengubah buffer konstanta di awal dan akhir rentang slot yang Anda atur untuk diperbarui. Bagian ini memperlihatkan cara mengatasi hal ini

Perilaku.

Berikut adalah kode untuk memeriksa apakah runtime menimulasi daftar perintah atau driver mendukung daftar perintah:


     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.
          }
     }

Jika runtime menimulasi daftar perintah, Anda perlu menggunakan salah satu cuplikan kode ini:

Jika Anda mengubah offset dan ukuran hanya pada satu buffer konstanta, atur buffer konstanta ke NULL terlebih dahulu:


     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);

Jika Anda mengubah beberapa buffer konstanta, atur buffer konstanta pertama dan terakhir dari rentang ke NULL terlebih dahulu:


     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);

Persyaratan

   
Klien minimum yang didukung Pembaruan Windows 8 dan Platform untuk Windows 7 [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2012 dan Platform Update untuk Windows Server 2008 R2 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header d3d11_1.h
Pustaka D3D11.lib

Lihat juga

ID3D11DeviceContext1