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 来复制误用的卷纹理。
 
注意仅适用于功能级别9_x 使用 D3D11_BIND_DEPTH_STENCIL 标志创建的子资源只能用作 CopySubresourceRegion 的源。
 
注意 如果将 CopySubresourceRegion 与深度模具缓冲区或多采样资源一起使用,则必须复制整个子资源。 在这种情况下,必须将 0 传递给 DstXDstYDstZ 参数,将 NULL 传递给 pSrcBox 参数。 此外,源和目标资源(由 pSrcResource 和 pDstResource 参数表示)应具有相同的样本计数值。
 

示例

以下代码片段将位于 (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
Library D3D11.lib

另请参阅

ID3D11DeviceContext

ID3D11Resource