新增資源類型
Direct3D 11 中已新增數個新的資源類型。
讀取/寫入緩衝區和紋理
著色器模型 4 資源是唯讀的。 著色器模型 5 會實作一組新的對應讀取/寫入資源:
這些資源需要資源變數,才能透過索引編制) 來存取記憶體 (,因為沒有直接存取記憶體的方法。 資源變數可以在方程式的左邊和右邊使用;如果在右側使用,範本類型必須是單一元件 (float、int 或 uint) 。
結構化緩衝區
結構化緩衝區是包含相同大小的元素的緩衝區。 使用結構搭配一或多個成員類型來定義專案。 以下是具有三個成員的結構。
struct MyStruct
{
float4 Color;
float4 Normal;
bool isAwesome;
};
使用此結構來宣告結構化緩衝區,如下所示:
StructuredBuffer<MyStruct> mySB;
除了編制索引之外,結構化緩衝區還支援存取單一成員,如下所示:
float4 myColor = mySb[27].Color;
使用下列物件類型來存取結構化緩衝區:
- StructuredBuffer 是唯讀結構化緩衝區。
- RWStructuredBuffer 是讀取/寫入結構化緩衝區。
在 RWStructuredBuffer的 int 和 uint 元素上,允許實作連結作業的不可部分完成函式。
位元組位址緩衝區
位元組位址緩衝區是緩衝區,其內容可由位元組位移定址。 一般而言, 緩衝區 的內容會針對每個元素編制索引,針對每個元素使用 (S) ,以及 S*N 所指定 (N) 的專案編號。 也可以稱為原始緩衝區的位元組位址緩衝區,會使用緩衝區開頭的位元組值位移來存取資料。 位元組值必須是四個的倍數,才能對齊 DWORD。 如果提供任何其他值,則行為是未定義的。
著色器模型 5 引進物件來存取 唯讀位元組位址緩衝區 以及 讀寫位元組位址緩衝區。 位元組位址緩衝區的內容設計為 32 位不帶正負號的整數;如果緩衝區中的值不是不帶正負號的整數,請使用 例如 asfloat 的函式來讀取它。
未排序的存取緩衝區或紋理
未排序的存取資源 (包括緩衝區、紋理和紋理陣列 - 沒有多重取樣) ,允許從多個執行緒進行暫時未排序的讀取/寫入存取。 這表示此資源類型可由多個執行緒同時讀取/寫入,而不需透過使用 Atomic Functions產生記憶體衝突。
呼叫 ID3D11Device::CreateBuffer 或 ID3D11Device::CreateTexture2D 等函式,然後從 D3D11_BIND_FLAG 列舉傳入 D3D11_BIND_UNORDERED_ACCESS 旗標,以建立未排序的存取緩衝區或紋理。
未排序的存取資源只能系結至圖元著色器和計算著色器。 在執行期間,以平行方式執行的圖元著色器或計算著色器會系結相同的未排序存取資源。
附加和取用緩衝區
附加和取用緩衝區是非排序資源的特殊類型,可支援新增和移除緩衝區結尾的值,類似于堆疊的運作方式。
附加和取用緩衝區必須是結構化緩衝區:
透過這些資源的方法使用這些資源,這些資源不會使用資源變數。
相關主題