ID3D11DeviceContext1::GSSetConstantBuffers1 方法 (d3d11_1.h)

设置几何着色器管道阶段使用的常量缓冲区。

语法

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

参数

[in] StartSlot

索引到设备的从零开始的数组中,开始将常量缓冲区设置为 0 到 D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) (范围。

[in] NumBuffers

要设置 (范围(从 0 到 D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)的缓冲区数 - StartSlot) 。

[in, optional] ppConstantBuffers

常量缓冲区的数组 (将 ID3D11Buffer) 提供给设备。

[in, optional] pFirstConstant

一个数组,用于保存 ppConstantBuffers 指定的缓冲区中的偏移量。 每个偏移量指定从着色器的角度来看,每个常量缓冲区的开始位置。 每个偏移量以着色器常量度量,这些常量是 16 字节 (4*32 位组件) 。 因此,偏移量为 16 表示关联常量缓冲区的开头为常量缓冲区的 256 个字节。 每个偏移量必须是 16 个常量的倍数。

[in, optional] pNumConstants

一个数组,用于保存 ppConstantBuffers 指定的缓冲区中的常量数。 每个数字指定着色器使用的常量缓冲区中包含的常量数。 每个常量数从 pFirstConstant 数组中指定的相应偏移量开始。 每个常量数必须是 [0..4096] 范围内的 16 个常量数的倍数。

返回值

备注

如果 pNumConstants 指向的常量数大于着色器支持的最大常量缓冲区大小,则运行时将删除对 GSSetConstantBuffers1 的调用 (4096 常量) 。 pFirstConstantpFirstConstantpNumConstants + 数组的元素中的值可以超过每个缓冲区的长度;从着色器的角度来看,常量缓冲区是缓冲区与窗口 [pFirstConstant 元素中的值,pFirstConstant 元素中的值 + pNumConstants 元素中的值 + 值] 的交集。 运行时还会在不支持此偏移的现有驱动程序上删除对 GSSetConstantBuffers1 的调用。

运行时将针对 功能级别 9.1、9.2 和 9.3 模拟此功能;因此,功能级别 9.1、9.2 和 9.3 支持此功能。 此功能始终可用于功能级别 10 及更高级别的新驱动程序。

从着色器的角度来看,常量缓冲区数组中的元素 [0] 是 pFirstConstant 处的常量

从着色器到 pFirstConstant 定义的范围的常量缓冲区的边界外访问, pNumConstants 返回 0。

如果 pFirstConstantpNumConstants 数组为 NULL,则得到的结果与将整个缓冲区绑定到视图中的结果相同。 如果调用 GSSetConstantBuffers 方法,将得到相同的结果。 如果缓冲区大于着色器 (4096 个元素) 支持的最大常量缓冲区大小,则着色器只能访问前 4096 个常量。

如果 pFirstConstantpNumConstantsNULL,则另一个参数也必须为 NULL

使用命令列表仿真调用 GSSetConstantBuffers1

运行时的 GSSetConstantBuffers1的命令列表模拟有时实际上不会更改常量缓冲区数组的偏移量或大小。 当

GSSetConstantBuffers1 不会有效地更改你设置为更新的槽范围的开头和末尾的常量缓冲区。 本部分介绍如何解决此问题

初期模式。

下面是用于检查运行时是模拟命令列表还是驱动程序支持命令列表的代码:


     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->GSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->GSSetConstantBuffers(0, 1, &NullCBuf);
     }
     pDeviceContext->GSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);

如果更改多个常量缓冲区,请先将范围的第一个和最后一个常量缓冲区设置为 NULL


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

要求

要求
最低受支持的客户端 适用于 Windows 7 的Windows 8和平台更新 [桌面应用 |UWP 应用]
最低受支持的服务器 适用于 Windows Server 2008 R2 的Windows Server 2012和平台更新 [桌面应用 |UWP 应用]
目标平台 Windows
标头 d3d11_1.h
Library D3D11.lib

另请参阅

ID3D11DeviceContext1