ID3D11DeviceContext1::D SSetConstantBuffers1 方法 (d3d11_1.h)
設定網域著色器階段所使用的常數緩衝區。
語法
void DSSetConstantBuffers1(
[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
提供給裝置的常數緩衝區陣列。
[in, optional] pFirstConstant
陣列,保存 ppConstantBuffers 所指定之緩衝區的位移。 每個位移會指定從著色器的觀點開始每個常數緩衝區的位置。 每個位移都是以著色器常數來測量,其為 16 個字節, (4*32 位元件) 。 因此,16 的位移表示相關聯常數緩衝區的開頭是常數緩衝區的 256 個字節。 每個位移都必須是16個常數的倍數。
[in, optional] pNumConstants
陣列,保存 ppConstantBuffers 所指定緩衝區中的常數數目。 每個數位都會指定著色器所使用的常數緩衝區中包含的常數數目。 每個常數數目都會從 pFirstConstant 陣列中指定的個別位移開始。 每個常數數目都必須是範圍 [0..4096] 中的 16 個常數倍數。
傳回值
無
備註
如果 pNumConstants 點數大於著色器所支援的最大常數緩衝區大小,則運行時間會卸除對 DSSetConstantBuffers1 的呼叫, (4096 常數) 。 pFirstConstant 和 pFirstConstant + pNumConstants 陣組元素中的值可以超過每個緩衝區的長度;從著色器的觀點來看,常數緩衝區是緩衝區的實際記憶體配置交集,以及 pFirstConstant 元素中的視窗 [value,pFirstConstant + value 的專案中的值]。 運行時間也會在不支援此位移的現有驅動程式上卸除 DSSetConstantBuffers1 的呼叫。
運行時間會模擬 功能層級 9.1、9.2 和 9.3 的這項功能;因此,此功能支援功能層級 9.1、9.2 和 9.3。 此功能一律適用於功能層級 10 和更新版本的新驅動程式。
從著色器的觀點來看,常數緩衝區陣列中的元素 [0] 是 pFirstConstant 的常數。
從著色器存取常數緩衝區到 pFirstConstant 所定義的範圍,而 pNumConstants 會傳回 0。
如果 pFirstConstant 和 pNumConstants 陣列是 NULL,您會收到與將整個緩衝區系結至檢視時相同的結果。 如果您呼叫 DSSetConstantBuffers 方法,就會得到相同的結果。 如果緩衝區大於著色器所支援的最大常數緩衝區大小 (4096 個元素) ,著色器只能存取前 4096 個常數。
如果 pFirstConstant 或 pNumConstants 為 NULL,則另一個參數也必須是 NULL。
使用命令清單模擬呼叫 DSSetConstantBuffers1
運行時間的 命令清單 模擬 DSSetConstantBuffers1 有時不會實際變更常數緩衝區陣列的位移或大小。 發生此行為時DSSetConstantBuffers1 不會有效地變更您設定要更新之位置範圍的開頭和結尾的常數緩衝區。 本節說明如何解決此問題
早期模式
以下是用來檢查執行時間模擬命令清單或驅動程式是否支援命令清單的程式代碼:
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->DSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->DSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->DSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
如果您變更多個常數緩衝區,請先將範圍的第一個和最後一個常數緩衝區設定為 NULL :
pDeviceContext->DSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->DSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->DSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->DSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 適用於 Windows 7 的 Windows 8 和平臺更新 [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | 適用於 Windows Server 2008 R2 的 Windows Server 2012 和平臺更新 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | d3d11_1.h |
程式庫 | D3D11.lib |