Direct3D 11의 리소스 소개

리소스는 장면의 구성 요소입니다. 여기에는 Direct3D가 장면을 해석하고 렌더링하는 데 사용하는 대부분의 데이터가 포함됩니다. 리소스는 Direct3D 파이프라인에서 액세스할 수 있는 메모리 영역입니다. 리소스에는 기하 도형, 텍스처, 셰이더 데이터와 같은 유형의 데이터가 포함됩니다. 이 항목에서는 버퍼 및 텍스처와 같은 Direct3D 리소스를 소개합니다.

강력한 형식 또는 무형식 리소스를 만들 수 있습니다. 리소스에 읽기 및 쓰기 액세스 권한이 모두 있는지 여부를 제어할 수 있습니다. CPU, GPU 또는 둘 다에서만 리소스에 액세스할 수 있도록 할 수 있습니다. 각 파이프라인 단계마다 최대 128개의 리소스를 활성화할 수 있습니다.

Direct3D는 범위를 벗어나 액세스되는 모든 리소스에 대해 0을 반환하도록 보장합니다.

Direct3D 리소스의 수명 주기는 다음과 같습니다.

  • ID3D11Device 인터페이스의 create 메서드 중 하나를 사용하여 리소스를 만듭니다.
  • 컨텍스트 및 ID3D11DeviceContext 인터페이스의 집합 메서드 중 하나를 사용하여 파이프라인에 리소스를 바인딩합니다.
  • 리소스 인터페이스의 Release 메서드를 호출하여 리소스 할당을 취소합니다.

이 섹션에서는 다음 항목을 다룹니다.

강력한 입력과 약한 입력

리소스의 레이아웃(또는 메모리 공간)을 완전히 지정할 수 있는 방법은 다음 두 가지입니다.

  • 형식화됨 - 리소스를 만들 때 형식을 완전히 지정합니다.
  • 무형식 - 리소스가 파이프라인에 바인딩된 경우 형식을 완전히 지정합니다.

완전히 형식이 지정된 리소스를 만들면 리소스는 생성된 형식으로 제한됩니다. 이로써 특히 애플리케이션에 매핑될 수 없음을 나타내는 플래그를 사용하여 리소스가 생성된 경우, 런타임이 액세스를 최적화할 수 있습니다. D3D10_DDI_BIND_PRESENT 플래그를 사용하여 리소스를 만들지 않는 한 특정 형식으로 만든 리소스는 뷰 메커니즘을 사용하여 재해석할 수 없습니다. D3D10_DDI_BIND_PRESENT 설정된 경우 원래 리소스가 완전히 형식화된 것으로 만들어진 경우에도 적절한 패밀리의 완전히 형식화된 멤버를 사용하여 이러한 리소스에 렌더링 대상 또는 셰이더 리소스 뷰를 만들 수 있습니다.

리소스가 적은 형식에서는 리소스를 처음 만들 때 데이터 형식을 알 수 없습니다. 애플리케이션은 사용 가능한 형식 중에서 더 적은 형식을 선택해야 합니다( DXGI_FORMAT 참조). 할당할 메모리 크기 및 런타임이 Mipmap에서 하위 텍스처를 생성해야 하는지 여부를 지정해야 합니다. 그러나 리소스 가 리소스 뷰를 사용하여 파이프라인에 바인딩될 때까지 정확한 데이터 형식(메모리가 정수, 부동 소수점 값, 부호 없는 정수 등으로 해석되는지 여부)은 결정되지 않습니다. 텍스처가 파이프라인에 바인딩될 때까지 텍스처 형식이 유동적이므로 해당 리소스를 약한 형식의 스토리지라고 합니다. 약한 형식의 스토리지는 구성 요소 수와 각 구성 요소의 비트 수가 두 형식 모두에서 동일하기만 하면 다른 형식으로 재사용하거나 재해석할 수 있다는 장점이 있습니다.

각 리소스에 각 위치에서 형식을 완전히 한정하는 고유의 보기가 있으면 단일 리소스를 여러 파이프라인 단계에 바인딩할 수 있습니다. 예를 들어 DXGI_FORMAT_R32G32B32A32_TYPELESS 형식으로 만든 리소스를 파이프라인의 다른 위치에서 동시에 DXGI_FORMAT_R32G32B32A32_FLOAT 및 DXGI_FORMAT_R32G32B32A32_UINT 사용할 수 있습니다.

리소스 뷰

리소스는 여러 파이프라인 단계에서 공유할 수 있도록 범용 메모리 형식으로 저장할 수 있습니다. 파이프라인 단계는 뷰를 사용하여 리소스 데이터를 해석합니다. 리소스 뷰는 특정 컨텍스트에서 사용할 수 있도록 리소스 데이터를 캐스팅하는 것과 개념적으로 비슷합니다.

보기는 무형식 리소스와 함께 사용할 수 있습니다. 즉, 컴파일 시간에 리소스를 만들고 리소스가 파이프라인에 바인딩된 경우 데이터 형식을 선언할 수 있습니다. 무형식 리소스에 대해 만들어진 뷰는 항상 구성 요소당 동일한 비트 수를 줍니다. 데이터가 해석되는 방식은 지정된 형식에 따라 달라집니다. 지정된 형식은 리소스를 만들 때 사용되는 무형식 형식과 동일한 패밀리에 있어야 합니다. 예를 들어 R8G8B8A8_TYPELESS 형식으로 만든 리소스는 두 형식의 메모리 크기가 같더라도 R32_FLOAT 리소스로 볼 수 없습니다.

또한 뷰는 셰이더에서 깊이/스텐실 표면을 다시 읽고, 단일 패스로 동적 큐브맵을 생성하고, 볼륨의 여러 조각에 동시에 렌더링하는 기능과 같은 다른 기능을 노출합니다.

리소스 인터페이스 설명
ID3D11DepthStencilView 깊이 스텐실 테스트 중에 텍스처 리소스에 액세스합니다.
ID3D11RenderTargetView 렌더링 대상으로 사용되는 텍스처 리소스에 액세스합니다.
ID3D11ShaderResourceView 상수 버퍼, 텍스처 버퍼, 텍스처 또는 샘플러와 같은 셰이더 리소스에 액세스합니다.
ID3D11UnorderedAccessView 픽셀 셰이더 또는 컴퓨팅 셰이더를 사용하여 순서가 지정되지 않은 리소스에 액세스합니다.

 

버퍼의 원시 뷰

원시 버퍼를 바이트 주소 버퍼라고도 할 수 있습니다. 즉, 원시 액세스를 원하는 비트 모음, 즉 1~4개의 32비트 무형식 주소 값 청크를 통해 편리하게 액세스할 수 있는 버퍼라고 할 수 있습니다. 다음 방법 중 하나를 호출하여 버퍼에 대한 뷰를 만들 때 버퍼(또는 버퍼의 원시 뷰)에 원시 액세스하려고 함을 나타냅니다.

원시 버퍼로 작업할 때 HLSL ByteAddressBufferRWByteAddressBuffer 개체 형식을 사용할 수 있습니다.

버퍼에 대한 원시 뷰를 만들려면 먼저 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 플래그를 사용하여 ID3D11Device::CreateBuffer를 호출하여 기본 버퍼 리소스를 만들어야 합니다. ID3D11Device::CreateBufferpDesc 매개 변수가 가리키는 D3D11_BUFFER_DESC 구조체의 MiscFlags 멤버에 이 플래그를 지정합니다. D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 플래그를 D3D11_RESOURCE_MISC_BUFFER_STRUCTURED 결합할 수 없습니다. 또한 D3D11_BUFFER_DESCBindFlags에서 D3D11_BIND_CONSTANT_BUFFER 지정하는 경우 MiscFlags에서 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 지정할 수도 없습니다. 상수 버퍼에는 다른 뷰와 결합할 수 없는 제약 조건이 이미 있기 때문에 원시 뷰만 제한되는 것은 아닙니다.

이전의 잘못된 경우 외에 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 사용하여 버퍼를 만들 때 기능과 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 설정하지 않는 것이 제한되지 않습니다. 즉, Direct3D에서 가능한 여러 가지 방법으로 원시가 아닌 액세스에 이러한 버퍼를 사용할 수 있습니다. D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 플래그를 지정하는 경우 사용 가능한 기능만 증가합니다.

리소스

새 리소스 종류