Direct3D 11 中的資源簡介
資源是您場景的建置組塊。 它們包含 Direct3D 用來解譯和轉譯場景的大部分數據。 資源是記憶體中可供 Direct3D 管線存取的區域。 資源包含下列數據類型:幾何、紋理、著色器數據。 本主題介紹 Direct3D 資源,例如緩衝區和紋理。
您可以建立強型別或無類型的資源;您可以控制資源是否同時具有讀取和寫入存取權;您可以只讓 CPU、GPU 或兩者存取資源。 每個管線階段最多可以有128個資源。
Direct3D 保證會針對任何超出界限存取的資源傳回零。
Direct3D 資源的生命週期為:
- 使用 ID3D11Device 介面的其中一個 create 方法來建立資源。
- 使用上下文和 ID3D11DeviceContext 介面的其中一個 set 方法,將資源系結至管線。
- 呼叫資源介面的 Release 方法,以解除分配資源。
本節包含下列主題:
強式與弱式輸入
有兩種方式可以完整指定資源的版面配置(或記憶體使用量):
- 具型別 - 在建立資源時,完整指定類型。
- 無類型 - 當資源系結至管線時,請完整指定類型。
創建全類型的資源會將資源限制於當前創建時所用的格式。 這可讓執行時期優化存取,特別是當資源是用表示無法由應用程式對應的旗標來建立時。 除非使用 D3D10_DDI_BIND_PRESENT 旗標建立資源,否則無法使用檢視機制重新解譯以特定類型建立的資源。 如果已設定D3D10_DDI_BIND_PRESENT,則可以使用適當系列的任何完全類型成員在這些資源上建立渲染目標或著色器資源檢視,即使原始資源是以完全類型建立的。
在較少類型的資源中,第一次建立資源時,數據類型是未知的。 應用程式必須從可用的類型中選擇較少格式(請參閱 DXGI_FORMAT)。 您必須指定要配置的記憶體大小,以及運行時間是否需要在 mipmap 中產生子文字。 不過,在資源系結至具有 資源檢視的管線之前,不會判斷確切的數據格式(記憶體是否會解譯為整數、浮點值、無符號整數等)。 由於紋理格式在系結至管線之前保持彈性,因此資源稱為弱類型儲存。 弱型別儲存的優點在於,只要元件的數量和每個元件的位元數在兩種格式中都是相同的,就可以將其重複使用或詮釋為另一種格式。
只要每個管線階段都有唯一的檢視,單一資源就可以系結至多個管線階段,以完整限定每個位置的格式。 例如,以格式 DXGI_FORMAT_R32G32B32A32_TYPELESS 建立的資源可以在管線中的不同位置同時用作 DXGI_FORMAT_R32G32B32A32_FLOAT 和 DXGI_FORMAT_R32G32B32A32_UINT。
資源檢視
資源可以儲存在一般用途的記憶體格式,以便由多個管線階段共用。 管線階段會使用視圖來解釋資源數據。 資源檢視在概念上類似於轉換資源數據,使其可用於特定內容。
視圖可以與無類型的資源搭配使用。 也就是說,您可以在編譯時期建立資源,並在資源系結至管線時宣告數據類型。 針對無類型資源建立的檢視一律具有每個元件的相同位數;數據解譯的方式取決於指定的格式。 指定的格式必須與建立資源時所使用的無類型格式相同系列。 例如,使用 R8G8B8A8_TYPELESS 格式建立的資源無法視為R32_FLOAT資源,即使這兩種格式在記憶體中的大小可能相同。
視圖也會公開其他功能,例如能夠讀取著色器中的深度/模版表面、在單一傳遞中生成動態 Cubemap,以及同時渲染至體積的多個切片。
資源介面 | 描述 |
---|---|
ID3D11DepthStencilView | 在深度樣板測試期間存取紋理資源。 |
ID3D11RenderTargetView | 存取做為轉譯目標的紋理資源。 |
ID3D11ShaderResourceView | 存取著色器資源,例如常數緩衝區、紋理緩衝區、紋理或取樣器。 |
ID3D11UnorderedAccessView | 使用圖元著色器或計算著色器存取未排序的資源。 |
緩衝區的原始檢視
您可以將原始 位元地址緩衝區視為您希望以原始方式存取的一袋位元,也就是說,這是一個緩衝區,您可以透過一到四個 32 位元無類型位址值的區塊來輕鬆存取。 當您呼叫下列其中一種方法來建立緩衝區檢視時,表示您想要對緩衝區進行原始存取(或緩衝區的原始檢視):
- 若要在緩衝區上建立著色器資源檢視(SRV),請呼叫 ID3D11Device::CreateShaderResourceView,並使用旗標 D3D11_BUFFEREX_SRV_FLAG_RAW。 您可以在 旗標 成員的 D3D11_BUFFEREX_SRV 結構中指定此旗標。 您將 D3D11_BUFFEREX_SRV 設定於 BufferEx 成員中,該成員屬於 D3D11_SHADER_RESOURCE_VIEW_DESC 結構,並由 ID3D11Device::CreateShaderResourceView 的 pDesc 參數指向。 您可以在 D3D11_SHADER_RESOURCE_VIEW_DESC 結構的 ViewDimension 成員中設定 D3D11_SRV_DIMENSION_BUFFEREX 值,以表示 SRV 是原始檢視。
- 若要建立緩衝區的未排序存取檢視(UAV),請呼叫 ID3D11Device::CreateUnorderedAccessView,並使用旗標 D3D11_BUFFER_UAV_FLAG_RAW。 您可以在 旗標的D3D11_BUFFER_UAV 結構成員中指定此旗標。 您設定 D3D11_BUFFER_UAV 在 D3D11_UNORDERED_ACCESS_VIEW_DESC 結構的 Buffer 成員中,而該結構為 ID3D11Device::CreateUnorderedAccessView 的 pDesc 參數所指向。 您也將 D3D11_UAV_DIMENSION_BUFFER 值設定在 ViewDimension 成員的 D3D11_UNORDERED_ACCESS_VIEW_DESC 中,以表明 UAV 是原始檢視。
當您使用原始緩衝區時,您可以使用 HLSL ByteAddressBuffer 和 RWByteAddressBuffer 物件類型。
若要建立緩衝區的原始檢視,您必須先使用 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 旗標呼叫 ID3D11Device::CreateBuffer,以建立基礎緩衝區資源。 您需要在 MiscFlags 成員中指定此旗標,這個成員是 D3D11_BUFFER_DESC 結構的一部分,而 pDesc 參數正是指向此結構,由 ID3D11Device::CreateBuffer 所使用。 您無法將 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 旗標與 D3D11_RESOURCE_MISC_BUFFER_STRUCTURED結合。 此外,如果您在 D3D11_BUFFER_DESCBindFlags 中指定 D3D11_BIND_CONSTANT_BUFFER,則無法在 MiscFlags中指定 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS。 這並非只是原始檢視的限制,因為常數緩衝區已經有條件約束,無法與任何其他檢視結合。
除了上述無效的情況外,當您建立具有 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS的緩衝區時,其功能不會因為沒有設定 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS而受到限制。 也就是說,您可以使用這類緩衝區進行非原始存取,並透過 Direct3D 的可能方式進行。 如果您指定 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 旗標,則只會增加可用的功能。
相關主題