다음을 통해 공유


ID3D10Device::UpdateSubresource 메서드(d3d10.h)

CPU는 메모리의 데이터를 매핑할 수 없는 메모리에서 만든 하위 리소스 로 복사합니다. 설명을 참조하세요.

구문

void UpdateSubresource(
  [in] ID3D10Resource  *pDstResource,
  [in] UINT            DstSubresource,
  [in] const D3D10_BOX *pDstBox,
  [in] const void      *pSrcData,
  [in] UINT            SrcRowPitch,
  [in] UINT            SrcDepthPitch
);

매개 변수

[in] pDstResource

형식: ID3D10Resource*

대상 리소스에 대한 포인터입니다( ID3D10Resource 인터페이스 참조).

[in] DstSubresource

형식: UINT

대상 하위 리소스를 식별하는 인덱스(0부터 시작)입니다. 자세한 내용은 D3D10CalcSubresource 를 참조하세요.

[in] pDstBox

형식: const D3D10_BOX*

리소스 데이터를 복사할 대상 하위 리소스의 부분을 정의하는 상자입니다. 좌표는 버퍼의 경우 바이트 단위이고 텍스처의 경우 텍셀 단위입니다. NULL인 경우 데이터는 오프셋 없이 대상 하위 리소스에 기록됩니다. 원본의 차원이 대상에 맞아야 합니다( D3D10_BOX 참조).

빈 상자는 no-op을 생성합니다. 위쪽 값이 아래쪽 값보다 크거나 같거나 왼쪽 값이 오른쪽 값보다 크거나 같거나 앞 값이 뒤 값보다 크거나 같으면 상자가 비어 있습니다. 상자가 비어 있으면 UpdateSubresource 는 업데이트 작업을 수행하지 않습니다.

[in] pSrcData

형식: const void*

메모리의 원본 데이터에 대한 포인터입니다.

[in] SrcRowPitch

형식: UINT

원본 데이터의 한 행 크기입니다.

[in] SrcDepthPitch

형식: UINT

원본 데이터의 깊이 조각 1개 크기입니다.

반환 값

없음

설명

셰이더 상수 버퍼의 경우 pDstBox를 NULL로 설정합니다. 이 메서드를 사용하여 셰이더 상수 버퍼를 부분적으로 업데이트할 수 없습니다.

다음과 같은 경우 리소스를 대상으로 사용할 수 없습니다.

UpdateSubresource가 반환되면 메서드가 원래 콘텐츠를 이미 복사/스냅했기 때문에 애플리케이션은 pSrcData가 가리키는 데이터를 자유롭게 변경하거나 해제할 수 있습니다.

UpdateSubresource의 성능은 대상 리소스에 대한 경합이 있는지 여부에 따라 달라집니다. 예를 들어 꼭짓점 버퍼 리소스에 대한 경합은 애플리케이션이 그리기 호출을 실행하고 나중에 그리기 호출이 GPU에 의해 실제로 실행되기 전에 동일한 꼭짓점 버퍼에서 UpdateSubresource를 호출할 때 발생합니다.

  • 리소스에 대한 경합이 있는 경우 UpdateSubresource는 원본 데이터의 복사본을 2개 수행합니다. 먼저 CPU에서 명령 버퍼에서 액세스할 수 있는 임시 스토리지 공간으로 데이터를 복사합니다. 이 복사는 메서드가 반환되기 전에 발생합니다. 그런 다음 GPU에서 두 번째 복사를 수행하여 원본 데이터를 mappable이 아닌 메모리에 복사합니다. 이 두 번째 복사는 명령 버퍼가 플러시될 때 GPU에서 실행되기 때문에 비동기적으로 발생합니다.
  • 리소스 경합이 없는 경우 UpdateSubresource의 동작은 CPU의 관점에서 데이터를 명령 버퍼에 복사한 다음 명령 버퍼가 플러시될 때 두 번째 복사를 실행하거나 CPU가 데이터를 최종 리소스 위치에 복사하도록 하는 등 더 빠른 동작에 따라 달라집니다. 이는 기본 시스템의 아키텍처에 따라 달라집니다.
원본 행 피치 및 원본 깊이 피치 매개 변수를 더 잘 이해하려면 3D 볼륨 텍스처에 대한 다음 그림을 고려합니다. 3D 볼륨 텍스처 그림

이 시각적 개체의 각 블록은 데이터의 요소를 나타내며 각 요소의 크기는 리소스의 형식에 따라 달라집니다. 예를 들어 리소스 형식이 DXGI_FORMAT_R32G32B32A32_FLOAT 경우 각 요소의 크기는 128비트 또는 16바이트입니다. 이 3D 볼륨 텍스처의 너비는 2, 높이는 3, 깊이는 4입니다.

지정된 리소스에 대한 원본 행 피치 및 원본 깊이 피치를 계산하려면 다음 수식을 사용합니다.

  • 원본 행 피치 = [한 요소의 크기(바이트)] * [한 행의 요소 수]
  • 원본 깊이 피치 = [원본 행 피치] * [행 수(높이)]
각 요소의 크기가 16바이트인 이 예제 3D 볼륨 텍스처의 경우 수식은 다음과 같습니다.
  • 원본 행 피치 = 16 * 2 = 32
  • 원본 깊이 피치 = 16 * 2 * 3 = 96
다음 그림에서는 리소스가 메모리에 배치되는 것을 보여 줍니다. 메모리의 3D 볼륨 텍스처 그림

예를 들어 다음 코드 조각은 2D 텍스처에서 대상 영역을 지정하는 방법을 보여줍니다. 대상 텍스처가 512x512이고 작업이 pData가 가리키는 데이터를 [(120,100)에 복사합니다. 대상 텍스처의 (200,220)] 또한 rowPitch가 적절한 값(위에서 설명한 대로)으로 초기화되었다고 가정합니다. 앞면과 후면은 각각 0과 1로 설정됩니다. 앞면이 뒤로 같으면 상자가 기술적으로 비어 있기 때문입니다.


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

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

1D 사례도 비슷합니다. 다음 코드 조각은 1D 텍스처에서 대상 영역을 지정하는 방법을 보여줍니다. 텍스처 길이가 512임을 제외하고 위와 동일한 가정을 사용합니다.


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 0;
destRegion.bottom = 1;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

Direct3D 10과 Direct3D 10.1 간의 차이점:

Direct3D 10.1을 사용하면 깊이 스텐실 리소스를 원본 또는 대상으로 사용할 수 있습니다.

요구 사항

   
대상 플랫폼 Windows
헤더 d3d10.h
라이브러리 D3D10.lib

추가 정보

ID3D10Device

ID3D10Resource 인터페이스