하위 리소스(Direct3D 12 그래픽)

리소스를 하위 리소스로 분할하는 방법 및 단일 또는 여러 하위 리소스나 하위 리소스 조각을 참조하는 방법을 설명합니다.

예제 하위 리소스

리소스가 버퍼를 포함하는 경우 단순히 인덱스가 0인 하나의 하위 리소스를 포함합니다. 리소스가 텍스처(또는 텍스처 배열)를 포함하는 경우 하위 리소스를 참조하는 것이 좀 더 복잡합니다.

전체 리소스에 액세스하는 API도 있고(예: ID3D12GraphicsCommandList::CopyResource 메서드), 리소스의 부분에 액세스하는 API도 있습니다(예: ID3D12Resource::ReadFromSubresource 메서드). 리소스의 일부에 액세스하는 메서드는 일반적으로 뷰 설명(예: D3D12_TEX2D_ARRAY_SRV 구조)을 사용하여 액세스할 하위 리소스를 지정합니다. 전체 목록에 대해서는 하위 리소스 API 섹션을 참조하세요.

하위 리소스 인덱싱

특정 하위 리소스를 인덱싱하기 위해 각 배열 항목이 인덱싱될 때 먼저 MIP 수준이 인덱싱됩니다.

하위 리소스 인덱싱

MIP 슬라이스

MIP 슬라이스에는 다음 그림과 같이 배열의 모든 텍스처에 대해 하나의 MIP 맵 수준이 포함됩니다.

하위 리소스 MIP 슬라이스

배열 슬라이스

다음 그림에서 보듯 주어진 텍스처 배열에서 MIP 맵이 포함된 각 텍스처, 배열 슬라이스에는 하나의 텍스처와 모든 해당 MIP 수준이 포함됩니다.

하위 리소스 배열 슬라이스

평면 슬라이스

일반적으로 평면 형식은 RGBA 데이터를 저장하는 데 사용되지 않지만, 이러한 용도로 사용될 경우(24bpp RGB 데이터일 수 있음) 각 평면은 빨간색 이미지, 녹색 이미지 및 파란색 이미지를 나타낼 수 있습니다. 그렇지만 한 평면이 반드시 하나의 색상은 아니며, 둘 이상의 색상이 조합해서 하나의 평면을 나타낼 수도 있습니다. 일반적으로 평면 데이터는 하위 샘플링 YCbCr 및 깊이 스텐실 데이터에 사용됩니다. 깊이 스텐실은 MIP 맵, 배열 및 여러 평면을 완전하게 지원하는 유일한 형식입니다(주로 깊이에 대해 평면 0, 스텐실에 대해 평면 1 사용).

각각 3개의 MIP 수준이 있는 두 깊이 스텐실 이미지의 배열에 대한 하위 리소스 인덱싱은 아래와 같습니다.

깊이 스텐실 인덱싱

하위 샘플링 YCbCr은 배열을 지원하고 평면을 포함하지만 MIP 맵은 지원하지 않습니다. YCbCr 이미지는 2개의 평면을 포함합니다. 하나는 육안으로 가장 민감하게 느껴지는 광도(Y)용 평면이고, 다른 하나는 육안으로 덜 민감하게 느껴지는 색차(Cb 및 Cr, 인터리브)용 평면입니다. 이 형식은 광도에 영향을 주지 않으면서 이미지를 압축하기 위해 색차 값을 압축할 수 있도록 하며, 정지 이미지를 압축하는 데 사용되지만 이러한 이유로 일반적인 비디오 압축 형식으로 사용됩니다. 아래 그림은 NV12 형식을 보여 줍니다. 여기서는 색차가 광도 해상도의 1/4로 압축되었습니다. 즉, 각 평면의 너비는 동일하며 색차 평면이 광도 평면 높이의 절반이 됩니다. 평면은 위의 깊이-스텐실 예제와 동일한 방식으로 하위 리소스로 인덱싱될 수 있습니다.

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)를 신중하게 사용하여 하위 리소스의 사각형 영역을 선택할 수 있습니다.

여러 하위 리소스 선택

렌더링-대상 뷰는 단일 하위 리소스 또는 MIP 슬라이스만 포함할 수 있으며 둘 이상의 MIP 슬라이스에 있는 하위 리소스는 포함할 수 없습니다. 즉, 렌더링-대상 뷰의 모든 텍스처 크기가 같아야 합니다. 셰이더-리소스 뷰는 그림과 같이 하위 리소스의 사각형 영역을 선택할 수 있습니다.

하위 리소스 API

다음 API는 하위 리소스를 참조하고 사용합니다.

열거형:

다음 구조는 PlaneSlice 인덱스를 포함하며, 대부분은 MipSlice 인덱스를 포함합니다.

다음 구조는 ArraySlice 인덱스를 포함하며, 대부분은 MipSlice 인덱스를 포함합니다.

다음 구조는 MipSlice 인덱스를 포함하지만 ArraySlicePlaneSlice 인덱스는 둘 다 포함하지 않습니다.

다음 구조도 하위 리소스를 참조합니다.

메서드:

텍스처는 WriteToSubresourceReadFromSubresource를 통한 CPU 액세스를 위해 D3D12_RESOURCE_STATE_COMMON 상태여야 합니다. 그러나 버퍼는 그렇지 않습니다. 리소스에 대한 CPU 액세스는 일반적으로 매핑/해제를 통해 수행됩니다.

리소스 바인딩