ID3D11DeviceContext::CopySubresourceRegion 方法 (d3d11.h)

將區域從來源資源複製到目的地資源。

語法

void CopySubresourceRegion(
  [in]           ID3D11Resource  *pDstResource,
  [in]           UINT            DstSubresource,
  [in]           UINT            DstX,
  [in]           UINT            DstY,
  [in]           UINT            DstZ,
  [in]           ID3D11Resource  *pSrcResource,
  [in]           UINT            SrcSubresource,
  [in, optional] const D3D11_BOX *pSrcBox
);

參數

[in] pDstResource

類型: ID3D11Resource*

目的地資源的指標 (請參閱 ID3D11Resource) 。

[in] DstSubresource

類型: UINT

目的地子資源索引。

[in] DstX

類型: UINT

目的地區域左上角的 X 座標。

[in] DstY

類型: UINT

目的地區域左上角的 Y 座標。 如果是 1D 子資源,這必須是零。

[in] DstZ

類型: UINT

目的地區域左上角的 z 座標。 如果是 1D 或 2D 子資源,這必須是零。

[in] pSrcResource

類型: ID3D11Resource*

來源資源的指標 (請參閱 ID3D11Resource) 。

[in] SrcSubresource

類型: UINT

來源子資源索引。

[in, optional] pSrcBox

類型: const D3D11_BOX*

3D 方塊的指標 (請參閱定義可複製的來源子資源 D3D11_BOX) 。 如果 為 NULL,則會複製整個來源子資源。 方塊必須符合來源資源。

空的方塊會產生無作業。 如果頂端值大於或等於底部值,或左值大於或等於右值,或前端值大於或等於上一個值,則方塊是空的。 當方塊是空的時, CopySubresourceRegion 不會執行複製作業。

傳回值

備註

來源方塊必須位於來源資源的大小內。 目的地位移、 (x、y 和 z) ,可讓來源方塊在寫入目的地資源時位移;不過,來源方塊和位移的維度必須位於資源的大小內。 如果您嘗試並複製目的地資源外部,或指定大於來源資源的來源方塊, 則 CopySubresourceRegion 的行為是未定義的。 如果您建立了支持 偵錯層的裝置,偵錯輸出會報告這個無效 CopySubresourceRegion 呼叫的錯誤。 CopySubresourceRegion 的參數無效會導致未定義的行為,而且可能會導致不正確的轉譯、裁剪、沒有複製,或甚至移除轉譯裝置。

如果資源是緩衝區,則所有座標都是位元組;如果資源是紋理,則所有座標都是材質。 D3D11CalcSubresource 是用來計算子資源索引的協助程式函式。

CopySubresourceRegion 會在 GPU (上執行複本,類似於 CPU) 的 memcpy。 因此,來源和目的地資源:

  • 雖然子資源可以來自相同的資源) ,但必須是不同的子資源 (。
  • 必須是相同的類型。
  • 必須有相容的 DXGI 格式 (相同或來自相同類型群組) 。 例如,DXGI_FORMAT_R32G32B32_FLOAT紋理可以複製到DXGI_FORMAT_R32G32B32_UINT紋理,因為這兩種格式都位於DXGI_FORMAT_R32G32B32_TYPELESS群組中。 CopySubresourceRegion 可以在幾個格式類型之間複製。 如需詳細資訊,請參閱 使用 Direct3D 10.1 的格式轉換
  • 目前可能未對應。
**CopySubresourceRegion** 僅支持複製;它不支援任何延展、色彩索引鍵或混合。 **CopySubresourceRegion** 可以在幾個格式類型之間重新解譯資源數據。 如需詳細資訊,請參閱 [使用 Direct3D 10.1 格式轉換] (/windows/win32/direct3d10/d3d10-graphics-programming-guide-resources-block-compression#format-conversion-using-direct3d-101) 。

如果您的應用程式需要複製整個資源,建議您改用 ID3D11DeviceContext::CopyResource

CopySubresourceRegion 是異步呼叫,可能會新增至命令緩衝區佇列,這會嘗試移除複製數據時可能發生的管線停止。 如需管線停止的詳細資訊,請參閱 效能考慮

注意僅適用於功能層級9_x硬體 如果您使用 ID3D11DeviceContext::UpdateSubresourceCopySubresourceRegion 從預備資源複製到默認資源,則可以損毀目的地內容。 如果您傳遞 NULL 來源方塊,而且來源資源與目的地資源的維度不同,或如果您使用目的地位移、 (x、y 和 z) ,就會發生這種情況。 在此情況下,請一律傳遞來源方塊,這是來源資源的完整大小。
 
注意僅適用於功能層級9_x硬體 您無法使用 CopySubresourceRegion 來複製 mipmapped 磁碟區紋理。
 
注意 僅適用於使用 D3D11_BIND_DEPTH_STENCIL 旗標建立9_x子資源的功能層級,只能作為 CopySubresourceRegion 的來源。
 
注意 如果您使用 CopySubresourceRegion 搭配深度樣板緩衝區或多重取樣資源,則必須複製整個子資源。 在此情況下,您必須將 0 傳遞給 DstXDstYDstZ 參數,並將 NULL 傳遞給 pSrcBox 參數。 此外,由 pSrcResourcepDstResource 參數表示的來源和目的地資源應該具有相同的樣本計數值。
 

例子

下列代碼段會將位於 (120,100) , (200,220) ) 的 (方塊複製到目的地紋理中 (10,20) , (90,140) 的區域。
D3D11_BOX sourceRegion;
sourceRegion.left = 120;
sourceRegion.right = 200;
sourceRegion.top = 100;
sourceRegion.bottom = 220;
sourceRegion.front = 0;
sourceRegion.back = 1;

pd3dDeviceContext->CopySubresourceRegion( pDestTexture, 0, 10, 20, 0, pSourceTexture, 0, &sourceRegion );

請注意,針對 2D 紋理,前面和背面分別設定為 0 和 1。

規格需求

需求
目標平台 Windows
標頭 d3d11.h
程式庫 D3D11.lib

另請參閱

ID3D11DeviceContext

ID3D11Resource