다음을 통해 공유


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

리소스를 하위 리소스로 나누는 방법과 하위 리소스의 단일, 다중 또는 조각을 참조하는 방법을 설명합니다.

하위 리소스 예제

리소스에 버퍼가 포함된 경우 인덱스가 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 인덱스를 포함합니다.

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

다음 구조체에는 MipSlice 인덱스가 포함되지만 arraySlice PlaneSlice 인덱스도 없습니다.

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

방법:

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

리소스 바인딩