하위 리소스(Direct3D 12 그래픽)
리소스를 하위 리소스로 나누는 방법과 하위 리소스의 단일, 다중 또는 조각을 참조하는 방법을 설명합니다.
-
하위 리소스 예제
- 하위 리소스 인덱싱
- 밉 조각
- 배열 조각
- 평면 조각
- 여러 하위 리소스
- 하위 리소스 API
- 관련 항목
하위 리소스 예제
리소스에 버퍼가 포함된 경우 인덱스가 0인 하위 리소스가 하나만 포함됩니다. 리소스에 텍스처(또는 텍스처 배열)가 포함된 경우 하위 리소스를 참조하는 것이 더 복잡합니다.
일부 API는 전체 리소스(예: ID3D12GraphicsCommandList::CopyResource 메서드)에 액세스하고, 다른 API는 리소스의 일부(예: ID3D12Resource::ReadFromSubresource 메서드)에 액세스합니다. 리소스의 일부에 액세스하는 메서드는 일반적으로 뷰 설명(예: D3D12_TEX2D_ARRAY_SRV 구조)을 사용하여 액세스할 하위 리소스를 지정합니다. 전체 목록은 하위 리소스 API 섹션을 참조하세요.
하위 리소스 인덱싱
특정 하위 리소스를 인덱싱하기 위해 각 배열 항목이 인덱싱될 때 mip 수준이 먼저 인덱싱됩니다.
하위 리소스 인덱싱
밉 조각
밉 조각은 다음 이미지와 같이 배열의 모든 텍스처에 대해 하나의 Mipmap 수준을 포함합니다.
하위 리소스 밉 조각
배열 조각
텍스처 배열, 밉맵이 있는 각 텍스처가 지정된 배열 조각에는 다음 이미지와 같이 하나의 텍스처와 모든 밉 수준이 포함됩니다.
하위 리소스 배열 조각
평면 조각
일반적으로 평면 형식은 RGBA 데이터를 저장하는 데 사용되지 않지만(아마도 24bpp RGB 데이터인 경우) 한 평면은 빨간색 이미지, 녹색 및 파란색 이미지를 나타낼 수 있습니다. 하나의 평면이 반드시 하나의 색은 아니지만 두 개 이상의 색을 하나의 평면으로 결합할 수 있습니다. 일반적으로 평면 데이터는 하위 샘플링된 YCbCr 및 Depth-Stencil 데이터에 사용됩니다. Depth-Stencil mipmap, 배열 및 여러 평면을 완벽하게 지원하는 유일한 형식입니다(깊이의 경우 평면 0, 스텐실의 경우 평면 1).
밉 수준이 각각 3개인 두 개의 Depth-Stencil 이미지 배열에 대한 하위 리소스 인덱싱은 다음과 같습니다.
하위 샘플링된 YCbCr은 배열을 지원하고 평면을 사용하지만 mipmap은 지원하지 않습니다. YCbCr 이미지에는 인간의 눈이 가장 민감하게 하는 광도(Y)와 사람의 눈이 덜 민감하게 하는 크로미니즘(Cb 및 Cr, 인터리브)에 대한 평면이 두 개 있습니다. 이 형식을 사용하면 광도에 영향을 주지 않고 이미지를 압축하기 위해 색분 값을 압축할 수 있으며, 스틸 이미지를 압축하는 데 사용되지만 이러한 이유로 일반적인 비디오 압축 형식입니다. 아래 이미지는 NV12 형식을 보여 하며, 분광이 광도 해상도의 1/4로 압축되었음을 나타내며, 이는 각 평면의 너비가 동일하고 색광면이 광도 평면의 절반 높이임을 의미합니다. 평면은 위의 Depth-Stencil 예제와 동일한 방식으로 하위 리소스로 인덱싱됩니다.
nv12 형식
평면 형식은 Direct3D 11에 있었지만 복사 또는 매핑 작업과 같이 개별 평면을 개별적으로 처리할 수 없습니다. Direct3D 12에서 각 평면이 자체 하위 리소스 ID를 받도록 변경되었습니다. 하위 리소스 ID를 계산하기 위해 다음 두 가지 방법을 비교합니다.
Direct3D 11
inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
{
return MipSlice + (ArraySlice * MipLevels);
}
Direct3D 12
inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
{
return MipSlice + (ArraySlice * MipLevels) + (PlaneSlice * MipLevels * ArraySize);
}
대부분의 하드웨어에서는 평면 N의 메모리가 항상 평면 N-1 이후에 즉시 할당된다고 가정합니다.
하위 리소스를 사용하는 대신 앱은 평면당 완전히 별도의 리소스를 할당할 수 있습니다. 이 경우 애플리케이션은 데이터가 평면임을 이해하고 여러 리소스를 사용하여 데이터를 나타냅니다.
여러 하위 리소스
셰이더 리소스 뷰는 이미지에 표시된 것처럼 위에서 설명한 조각 중 하나와 뷰 구조의 필드(예: D3D12_TEX2D_ARRAY_SRV)를 신중하게 사용하여 하위 리소스의 사각형 영역을 선택할 수 있습니다.
여러 하위 리소스 선택
렌더링 대상 보기는 단일 하위 리소스 또는 밉 조각만 사용할 수 있으며 둘 이상의 밉 조각의 하위 리소스를 포함할 수 없습니다. 즉, 렌더링 대상 보기의 모든 질감은 동일한 크기여야 합니다. 셰이더-리소스 뷰는 이미지에 표시된 것처럼 하위 리소스의 사각형 영역을 선택할 수 있습니다.
하위 리소스 API
다음 API는 하위 리소스를 참조하고 작동합니다.
열거형:
다음 구조체에는 PlaneSlice 인덱스가 포함되며, 대부분은 MipSlice 인덱스를 포함합니다.
- D3D12_TEX2D_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2D_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2D_UAV
- D3D12_TEX2D_ARRAY_UAV
다음 구조체에는 ArraySlice 인덱스가 포함되며, 대부분은 MipSlice 인덱스를 포함합니다.
- D3D12_TEX1D_ARRAY_DSV
- D3D12_TEX2D_ARRAY_DSV
- D3D12_TEX2DMS_ARRAY_DSV
- D3D12_TEX1D_ARRAY_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2DMS_ARRAY_RTV
- D3D12_TEX1D_ARRAY_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2DMS_ARRAY_SRV
- D3D12_TEX1D_ARRAY_UAV
- D3D12_TEX2D_ARRAY_UAV
다음 구조체에는 MipSlice 인덱스가 포함되지만 arraySlice PlaneSlice 인덱스도 없습니다.
다음 구조는 하위 리소스도 참조합니다.
- D3D12_DISCARD_REGION: 리소스 삭제를 준비하는 데 사용되는 구조체입니다.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT: 기본 공간의 리소스에 오프셋을 추가합니다.
- D3D12_RESOURCE_TRANSITION_BARRIER: 다양한 사용(셰이더 리소스, 렌더링 대상 등) 간의 하위 리소스 전환에 대해 설명합니다.
- D3D12_SUBRESOURCE_DATA: 하위 리소스 데이터에는 데이터 자체와 행 및 조각 피치가 포함됩니다.
- D3D12_SUBRESOURCE_FOOTPRINT: 공간은 하위 리소스의 형식, 너비, 높이, 깊이 및 행 피치를 포함합니다.
- D3D12_SUBRESOURCE_INFO : 하위 리소스의 오프셋, 행 피치 및 깊이 피치를 포함합니다.
- D3D12_SUBRESOURCE_TILING: 타일식 하위 리소스 볼륨을 설명합니다(볼륨 타일식 리소스참조).
- D3D12_TEXTURE_COPY_LOCATION: 복사를 위해 텍스처의 일부를 설명합니다.
- D3D12_TILED_RESOURCE_COORDINATE: 타일형 리소스의 좌표를 설명합니다.
방법:
- ID3D12Device::GetCopyableFootprints : 복사본을 만들 수 있도록 리소스에 대한 정보를 가져옵니다.
- ID3D12Device::GetResourceTiling : 바둑판형 리소스가 타일로 분할되는 방법에 대한 정보를 가져옵니다.
- ID3D12GraphicsCommandList::ResolveSubresource: 다중 샘플링된 하위 리소스를 다중 샘플링이 아닌 하위 리소스에 복사합니다.
- ID3D12Resource::Map : 리소스의 지정된 데이터에 대한 포인터를 반환하고 하위 리소스에 대한 GPU 액세스를 거부합니다.
- ID3D12Resource::ReadFromSubresource: 하위 리소스 또는 하위 리소스의 사각형 영역에서 데이터를 복사합니다.
- ID3D12Resource::unmap : 지정된 메모리 범위의 매핑을 해제하고 리소스에 대한 포인터를 무효화합니다. 하위 리소스에 대한 GPU 액세스를 복원합니다.
- ID3D12Resource::WriteToSubresource: 하위 리소스 또는 하위 리소스의 사각형 영역에 데이터를 복사합니다.
텍스처는 writeToSubresource통해 CPU 액세스를 위해 D3D12_RESOURCE_STATE_COMMON 상태여야 하며 ReadFromSubresource. 그러나 버퍼는 그렇지 않습니다. 리소스에 대한 CPU 액세스는 일반적으로 매핑/매핑 해제통해 수행됩니다.
관련 항목