다음을 통해 공유


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에 대한 호출을 삭제합니다. pFirstConstantpFirstConstantpNumConstants + 배열의 요소에 있는 값은 각 버퍼의 길이를 초과할 수 있습니다. 셰이더의 관점에서 상수 버퍼는 버퍼의 실제 메모리 할당과 창 [pFirstConstant 요소의 값, pNumConstants 요소의 pFirstConstant + 값 요소에 있는 값]의 교차점입니다. 또한 런타임은 이 오프셋을 지원하지 않는 기존 드라이버에서 VSSetConstantBuffers1 에 대한 호출을 삭제합니다.

런타임은 기능 수준 9.1, 9.2 및 9.3에 대해 이 기능을 에뮬레이트합니다. 따라서 이 기능은 기능 수준 9.1, 9.2 및 9.3에서 지원됩니다. 이 기능은 기능 수준 10 이상의 새 드라이버에서 항상 사용할 수 있습니다.

셰이더의 관점에서 상수 버퍼 배열의 요소 [0]은 pFirstConstant의 상수입니다.

범위를 벗어나 셰이더에서 pFirstConstant 및 pNumConstants 로 정의된 범위까지 상수 버퍼에 대한 액세스는 0을 반환 합니다 .

pFirstConstantpNumConstants 배열이 NULL인 경우 전체 버퍼를 보기에 바인딩한 것과 동일한 결과를 얻게 됩니다. VSSetConstantBuffers 메서드를 호출하면 동일한 결과를 얻을 수 있습니다. 버퍼가 셰이더에서 지원하는 최대 상수 버퍼 크기(4096개 요소)보다 큰 경우 셰이더는 처음 4096개 상수에만 액세스할 수 있습니다.

pFirstConstant 또는 pNumConstantsNULL인 경우 다른 매개 변수도 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.
          }
     }

런타임이 명령 목록을 에뮬레이트하는 경우 다음 코드 조각 중 하나를 사용해야 합니다.

단일 상수 버퍼에서만 오프셋 및 크기를 변경하는 경우 먼저 상수 버퍼를 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
라이브러리 D3D11.lib

추가 정보

ID3D11DeviceContext1