ID3D10Device::CopySubresourceRegion 方法 (d3d10.h)

将区域从源资源复制到目标资源。

语法

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

参数

[in] pDstResource

类型: ID3D10Resource*

指向目标资源的指针 (请参阅 ID3D10Resource) 。

[in] DstSubresource

类型: UINT

目标的子资源索引。

[in] DstX

类型: UINT

目标区域的左上角的 x 坐标。

[in] DstY

类型: UINT

目标区域的左上角的 y 坐标。

[in] DstZ

类型: UINT

目标区域的左上角的 z 坐标。 对于 1D 或 2D 子资源,这必须为零。

[in] pSrcResource

类型: ID3D10Resource*

指向源资源的指针 (请参阅 ID3D10Resource) 。

[in] SrcSubresource

类型: UINT

源的子资源索引。

[in] pSrcBox

类型: const D3D10_BOX*

三维框 (会看到 D3D10_BOX) ,用于定义可复制的源子资源。 如果 为 NULL,则复制整个源子资源。 该框必须适合源资源。

空框会导致无操作。 如果顶部值大于或等于底部值,或者左值大于或等于右值,或者前值大于或等于后部值,则框为空。 当框为空时, CopySubresourceRegion 不会执行复制操作。

返回值

备注

源框必须位于源资源的大小内。 目标位置是绝对值 (不是相对值) 。 目标位置可以偏移源位置;但是,要复制 (的区域大小,包括目标位置) 必须适合目标资源。

如果资源是缓冲区,则所有坐标都以字节为单位;如果资源是纹理,则所有坐标都采用纹素。

D3D10CalcSubresource 是用于计算子资源索引的帮助程序函数。

CopySubresourceRegion 在 GPU (上执行复制,类似于 CPU) 的 memcpy。 因此,源和目标资源必须满足以下条件:

  • 必须是不同的子资源 (,尽管它们可能来自同一资源) 。
  • 必须是同一 类型
  • 必须具有兼容的 格式 (格式必须相同,或者来自同一类型组) 。 例如,DXGI_FORMAT_R32G32B32_FLOAT纹理可以复制到DXGI_FORMAT_R32G32B32_UINT纹理,因为这两种格式都位于DXGI_FORMAT_R32G32B32_TYPELESS组中。 从 Direct3D 10.1 开始, CopySubresourceRegion 可以在几种格式类型之间复制。 有关详细信息,请参阅 使用 Direct3D 10.1 进行格式转换
  • 当前可能未 映射
CopySubresourceRegion 仅支持复制;它不支持任何拉伸、颜色键、混合或格式转换。 从 Direct3D 10.1 开始, CopySubresourceRegion 可以在几种格式类型之间重新解释资源数据。 有关详细信息,请参阅 使用 Direct3D 10.1 进行格式转换

如果你的应用需要复制整个资源,我们建议改用 ID3D10Device::CopyResource

CopySubresourceRegion 是运行时可以添加到命令缓冲区队列的异步调用。 此异步行为尝试删除复制数据时可能发生的管道停止。 有关更多详细信息,请参阅 性能注意事项

Direct3D 10 和 Direct3D 10.1 之间的差异:

Direct3D 10 具有以下限制:

  • 不能将深度模具资源用作目标。
  • 不能将不可变资源用作目标。
  • 不能将多重采样纹理用作源或目标
Direct3D 10.1 添加了对以下功能的支持:
  • 可以将深度模具缓冲区用作源或目标。
  • 仅当源和目标具有相同的多重采样计数和质量时,才能使用多重采样资源作为源和目标。 如果源和目标在多重采样计数和质量上不同,或者源是多重采样,并且目标不是多采样 (,反之亦然) ,则调用 ID3D10Device::CopySubresourceRegion 失败。
  • 可以在未压缩和压缩的资源之间复制。 在复制期间,将自动支持 使用 Direct3D 10.1 进行格式转换中指定的格式转换 。 未压缩的资源必须至少具有预结构化,并且必须键入。 还必须考虑虚拟大小与 mipmap 级别的物理大小之间的差异。
 
注意 如果将 CopySubresourceRegion 用于深度模具缓冲区或多重采样资源,则必须复制整个子资源。 还必须将 0 传递给 DstXDstYDstZ 参数,并将 NULL 传递给 pSrcBox 参数。 此外,分别由 pSrcResourcepDstResource 参数表示的源和目标资源必须具有相同的示例计数值。
 

示例

以下代码片段将源纹理中的框 (复制到 (120,100) , (200,220) ) (130,120) , (目标纹理中的 210,240) 。

D3D10_BOX sourceRegion;
sourceRegion.left = 120;
sourceRegion.right = 200;
sourceRegion.top = 100;
sourceRegion.bottom = 220;
sourceRegion.front = 0;
sourceRegion.back = 1;

pd3dDevice->CopySubresourceRegion( pDestTexture, 0, 130, 120, 0, pSourceTexture, 0, &sourceRegion );

请注意,对于二维纹理,正面和后部始终分别设置为 0 和 1。

要求

   
目标平台 Windows
标头 d3d10.h
Library D3D10.lib

请参阅

ID3D10Device

ID3D10Resource 接口