ID3D12GraphicsCommandList::CopyTextureRegion 메서드(d3d12.h)

이 메서드는 GPU를 사용하여 두 위치 간에 텍스처 데이터를 복사합니다. 원본과 대상 모두 버퍼 리소스 또는 텍스처 리소스 내에 있는 텍스처 데이터를 참조할 수 있습니다.

구문

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_TYPELESS 그룹에 있으므로 DXGI_FORMAT_R32G32B32_FLOAT 텍스처를 DXGI_FORMAT_R32G32B32_UINT 텍스처에 복사할 수 있습니다. CopyTextureRegion 은 몇 가지 형식 형식 간에 복사할 수 있습니다. 자세한 내용은 Direct3D 10.1을 사용하여 형식 변환을 참조하세요.
CopyTextureRegion 은 복사만 지원합니다. 스트레치, 색 키 또는 혼합을 지원하지 않습니다. CopyTextureRegion 은 몇 가지 형식 형식 간에 리소스 데이터를 재해석할 수 있습니다.

깊이 스텐실 버퍼의 경우 깊이 및 스텐실 평면은 버퍼 내에서 별도의 하위 리소스 입니다.

하위 리소스의 영역이 아닌 전체 리소스를 복사하려면 CopyResource 를 대신 사용하는 것이 좋습니다.

참고 깊이 스텐실 버퍼 또는 다중 샘플링된 리소스와 함께 CopyTextureRegion 을 사용하는 경우 전체 하위 리소스 사각형을 복사해야 합니다. 이 경우 0을 DstX, DstYDstZ 매개 변수에 전달하고 NULLpSrcBox 매개 변수에 전달해야 합니다. 또한 pSrcResourcepDstResource 매개 변수로 표현되는 원본 및 대상 리소스에는 동일한 샘플 개수 값이 있어야 합니다.
 
CopyTextureRegion 을 사용하여 동일한 힙 메모리를 별칭으로 지정하는 리소스를 초기화할 수 있습니다. 자세한 내용은 CreatePlacedResource 를 참조하세요.

예제

다음 코드 조각은 원본 텍스처의 상자((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;
}

D3D12 참조의 예제 코드를 참조하세요.

요구 사항

요구 사항
대상 플랫폼 Windows
헤더 d3d12.h
라이브러리 D3d12.lib
DLL D3d12.dll

추가 정보

CopyBufferRegion

ID3D12GraphicsCommandList