ID3D12GraphicsCommandList::CopyTextureRegion メソッド (d3d12.h)
この方法では、GPU を使用して 2 つの場所間でテクスチャ データをコピーします。 ソースとターゲットの両方で、バッファー リソースまたはテクスチャ リソース内にあるテクスチャ データを参照できます。
構文
void CopyTextureRegion(
[in] const D3D12_TEXTURE_COPY_LOCATION *pDst,
UINT DstX,
UINT DstY,
UINT DstZ,
[in] const D3D12_TEXTURE_COPY_LOCATION *pSrc,
[in, optional] const D3D12_BOX *pSrcBox
);
パラメーター
[in] pDst
型: const D3D12_TEXTURE_COPY_LOCATION*
変換先の D3D12_TEXTURE_COPY_LOCATIONを指定します。 参照されるサブリソースは、D3D12_RESOURCE_STATE_COPY_DEST状態である必要があります。
DstX
型: UINT
コピー先領域の左上隅の x 座標。
DstY
型: UINT
宛先領域の左上隅の y 座標。 1D サブリソースの場合、これは 0 である必要があります。
DstZ
型: UINT
ターゲット領域の左上隅の z 座標。 1D または 2D サブリソースの場合、これは 0 である必要があります。
[in] pSrc
型: const D3D12_TEXTURE_COPY_LOCATION*
ソース D3D12_TEXTURE_COPY_LOCATIONを指定します。 参照されるサブリソースは、D3D12_RESOURCE_STATE_COPY_SOURCE状態である必要があります。
[in, optional] pSrcBox
型: const D3D12_BOX*
コピーするソース テクスチャのサイズを設定するオプションのD3D12_BOXを指定します。
戻り値
なし
解説
ソース ボックスは、ソース リソースのサイズ内である必要があります。 変換先のオフセット (x、y、z) を使用すると、コピー先リソースに書き込むときにソース ボックスをオフセットできます。ただし、ソース ボックスのディメンションとオフセットは、リソースのサイズ内である必要があります。 コピー先のリソースの外部にコピーしようとしたり、ソース リソースよりも大きいソース ボックスを指定したりすると、 CopyTextureRegion の動作は未定義になります。 デバッグ レイヤーをサポートするデバイスを作成した場合、この無効な CopyTextureRegion 呼び出しでデバッグ出力からエラーが報告されます。 CopyTextureRegion に無効なパラメーターを指定すると、未定義の動作が発生し、レンダリング、クリッピング、コピーなし、さらにはレンダリング デバイスの削除が発生する可能性があります。
リソースがバッファーの場合、すべての座標はバイト単位です。リソースがテクスチャの場合、すべての座標はテクセル内にあります。
CopyTextureRegion は GPU でコピーを実行します (CPU による と同様 memcpy
)。 その結果、移行元と移行先のリソースは次のようになります。
- 異なるサブリソースである必要があります (ただし、同じリソースから取得できます)。
- (同一または同じ型グループから) DXGI_FORMAT互換性がある必要があります。 たとえば、DXGI_FORMAT_R32G32B32_FLOAT テクスチャは、両方の形式が DXGI_FORMAT_R32G32B32_TYPELESS グループに含まれるため、DXGI_FORMAT_R32G32B32_UINT テクスチャにコピーできます。 CopyTextureRegion は、いくつかの形式の種類間でコピーできます。 詳細については、「 Direct3D 10.1 を使用した変換の書式設定」を参照してください。
深度ステンシル バッファーの場合、深度とステンシルの平面はバッファー内の 個別のサブリソース であることに注意してください。
サブリソースのリージョンではなく、リソース全体をコピーするには、代わりに CopyResource を使用することをお勧めします。
例
次のコード スニペットは、(120,100),(200,220)) のボックスをソース テクスチャからコピー先テクスチャの領域 (10,20),(90,140) にコピーします。D3D12_BOX sourceRegion;
sourceRegion.left = 120;
sourceRegion.top = 100;
sourceRegion.right = 200;
sourceRegion.bottom = 220;
sourceRegion.front = 0;
sourceRegion.back = 1;
pCmdList -> CopyTextureRegion(pDestTexture, 10, 20, 0, pSourceTexture, &sourceRegion);
2D テクスチャの場合、前面と背面はそれぞれ 0 と 1 に設定されていることに注意してください。
例
HelloTriangle サンプルでは、次のように ID3D12GraphicsCommandList::CopyTextureRegion を使用します。
inline UINT64 UpdateSubresources(
_In_ ID3D12GraphicsCommandList* pCmdList,
_In_ ID3D12Resource* pDestinationResource,
_In_ ID3D12Resource* pIntermediate,
_In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
_In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
UINT64 RequiredSize,
_In_reads_(NumSubresources) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts,
_In_reads_(NumSubresources) const UINT* pNumRows,
_In_reads_(NumSubresources) const UINT64* pRowSizesInBytes,
_In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData)
{
// Minor validation
D3D12_RESOURCE_DESC IntermediateDesc = pIntermediate->GetDesc();
D3D12_RESOURCE_DESC DestinationDesc = pDestinationResource->GetDesc();
if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER ||
IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset ||
RequiredSize > (SIZE_T)-1 ||
(DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER &&
(FirstSubresource != 0 || NumSubresources != 1)))
{
return 0;
}
BYTE* pData;
HRESULT hr = pIntermediate->Map(0, NULL, reinterpret_cast<void**>(&pData));
if (FAILED(hr))
{
return 0;
}
for (UINT i = 0; i < NumSubresources; ++i)
{
if (pRowSizesInBytes[i] > (SIZE_T)-1) return 0;
D3D12_MEMCPY_DEST DestData = { pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, pLayouts[i].Footprint.RowPitch * pNumRows[i] };
MemcpySubresource(&DestData, &pSrcData[i], (SIZE_T)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth);
}
pIntermediate->Unmap(0, NULL);
if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
{
CD3DX12_BOX SrcBox( UINT( pLayouts[0].Offset ), UINT( pLayouts[0].Offset + pLayouts[0].Footprint.Width ) );
pCmdList->CopyBufferRegion(
pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width);
}
else
{
for (UINT i = 0; i < NumSubresources; ++i)
{
CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource);
CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]);
pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr);
}
}
return RequiredSize;
}
要件
要件 | 値 |
---|---|
対象プラットフォーム | Windows |
ヘッダー | d3d12.h |
Library | D3d12.lib |
[DLL] | D3d12.dll |