METODE ID3D12GraphicsCommandList::CopyTextureRegion (d3d12.h)
Metode ini menggunakan GPU untuk menyalin data tekstur di antara dua lokasi. Sumber dan tujuan dapat mereferensikan data tekstur yang terletak di dalam sumber daya buffer atau sumber daya tekstur.
Sintaks
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
);
Parameter
[in] pDst
Jenis: const D3D12_TEXTURE_COPY_LOCATION*
Menentukan D3D12_TEXTURE_COPY_LOCATION tujuan. Subsumber daya yang dimaksud harus dalam status D3D12_RESOURCE_STATE_COPY_DEST.
DstX
Jenis: UINT
Koordinat x sudut kiri atas wilayah tujuan.
DstY
Jenis: UINT
Koordinat y dari sudut kiri atas wilayah tujuan. Untuk subsumber daya 1D, ini harus nol.
DstZ
Jenis: UINT
Koordinat z dari sudut kiri atas wilayah tujuan. Untuk sub sumber daya 1D atau 2D, ini harus nol.
[in] pSrc
Jenis: const D3D12_TEXTURE_COPY_LOCATION*
Menentukan D3D12_TEXTURE_COPY_LOCATION sumber. Subsumber daya yang dimaksud harus dalam status D3D12_RESOURCE_STATE_COPY_SOURCE.
[in, optional] pSrcBox
Jenis: const D3D12_BOX*
Menentukan D3D12_BOX opsional yang mengatur ukuran tekstur sumber untuk disalin.
Nilai kembali
Tidak ada
Keterangan
Kotak sumber harus dalam ukuran sumber daya sumber. Offset tujuan, (x, y, dan z), memungkinkan kotak sumber diimbangi saat menulis ke sumber daya tujuan; namun, dimensi kotak sumber dan offset harus berada dalam ukuran sumber daya. Jika Anda mencoba dan menyalin di luar sumber daya tujuan atau menentukan kotak sumber yang lebih besar dari sumber daya sumber, perilaku CopyTextureRegion tidak terdefinisi. Jika Anda membuat perangkat yang mendukung lapisan debug, output debug melaporkan kesalahan pada panggilan CopyTextureRegion yang tidak valid ini. Parameter yang tidak valid ke CopyTextureRegion menyebabkan perilaku yang tidak terdefinisi dan dapat mengakibatkan penyajian, pengklipan, tidak ada salinan, atau bahkan penghapusan perangkat penyajian yang salah.
Jika sumber daya adalah buffer, semua koordinat berada dalam byte; jika sumber daya adalah tekstur, semua koordinat berada dalam texel.
CopyTextureRegion melakukan salinan pada GPU (mirip memcpy
dengan CPU). Sebagai konsekuensinya, sumber daya sumber dan tujuan:
- Harus subsumber daya yang berbeda (meskipun dapat berasal dari sumber daya yang sama).
- Harus memiliki DXGI_FORMATyang kompatibel (identik atau dari grup jenis yang sama). Misalnya, tekstur DXGI_FORMAT_R32G32B32_FLOAT dapat disalin ke tekstur DXGI_FORMAT_R32G32B32_UINT karena kedua format ini berada dalam grup DXGI_FORMAT_R32G32B32_TYPELESS. CopyTextureRegion dapat menyalin antara beberapa jenis format. Untuk informasi selengkapnya, lihat Konversi Format menggunakan Direct3D 10.1.
Perhatikan bahwa untuk buffer stensil kedalaman, bidang kedalaman dan stensil adalah subsumber daya terpisah dalam buffer.
Untuk menyalin seluruh sumber daya, bukan hanya wilayah subsumber daya, sebaiknya gunakan CopyResource sebagai gantinya.
Contoh
Cuplikan kode berikut menyalin kotak (terletak di (120.100),(200.220)) dari tekstur sumber ke wilayah (10.20),(90.140) dalam tekstur tujuan.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);
Perhatikan, bahwa untuk tekstur 2D, depan dan belakang masing-masing diatur ke 0 dan 1.
Contoh
Sampel HelloTriangle menggunakan ID3D12GraphicsCommandList::CopyTextureRegion sebagai berikut:
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;
}
Lihat Contoh Kode dalam Referensi D3D12.
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Windows |
Header | d3d12.h |
Pustaka | D3d12.lib |
DLL | D3d12.dll |