Direct3D 11 中的資源簡介
資源是您場景的建置組塊。 它們包含 Direct3D 用來解譯和轉譯場景的大部分資料。 資源是記憶體中可由 Direct3D 管線存取的區域。 資源包含下列資料類型:幾何、紋理、著色器資料。 本主題介紹 Direct3D 資源,例如緩衝區和紋理。
您可以建立強型別或無型別的資源;您可以控制資源是否同時具有讀取和寫入權限;您可以讓資源只能存取 CPU、GPU 或兩者。 每個管線階段可使用多達 128 種資源。
Direct3D 保證會針對超出界限存取的任何資源傳回零。
Direct3D 資源的生命週期為:
- 使用 ID3D11Device 介面的其中一個 create 方法建立資源。
- 使用內容和 ID3D11DeviceCoNtext 介面的其中一個集合方法,將資源系結至管線。
- 藉由呼叫資源介面的 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) 緩衝區,請使用旗標D3D11_BUFFEREX_SRV_FLAG_RAW呼叫ID3D11Device::CreateShaderResourceView。 您可以在D3D11_BUFFEREX_SRV結構的Flags成員中指定此旗標。 您可以在id3D11Device::CreateShaderResourceView點的pDesc參數的BufferEx成員中設定D3D11_SHADER_RESOURCE_VIEW_DESC D3D11_BUFFEREX_SRV。 您也可以在D3D11_SHADER_RESOURCE_VIEW_DESC的ViewDimension成員中設定D3D11_SRV_DIMENSION_BUFFEREX值,以指出 SRV 是原始檢視。
- 若要 (UAV) 建立未排序的存取檢視,請使用旗標D3D11_BUFFER_UAV_FLAG_RAW呼叫ID3D11Device::CreateUnorderedAccessView。 您可以在D3D11_BUFFER_UAV結構的Flags成員中指定此旗標。 您可以在id3D11Device::CreateUnorderedAccessView的pDesc參數的buffer成員中設定D3D11_UNORDERED_ACCESS_VIEW_DESC D3D11_BUFFER_UAV。 您也可以在D3D11_UNORDERED_ACCESS_VIEW_DESC的ViewDimension成員中設定D3D11_UAV_DIMENSION_BUFFER值,以指出 UAV 是原始檢視。
當您使用原始緩衝區時,可以使用 HLSL ByteAddressBuffer 和 RWByteAddressBuffer 物件類型。
若要建立緩衝區的原始檢視,您必須先使用D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS旗標呼叫ID3D11Device::CreateBuffer,才能建立基礎緩衝區資源。 您可以在id3D11Device::CreateBuffer點的pDesc參數的D3D11_BUFFER_DESC結構MiscFlags成員中指定這個旗標。 您無法將 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 旗標與 D3D11_RESOURCE_MISC_BUFFER_STRUCTURED結合。 此外,如果您在D3D11_BUFFER_DESC的BindFlags中指定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 旗標,則只會增加可用的功能。
相關主題