비타Cpp

Resource & Descriptor(자원과 서술자) 본문

DirectX12/메모

Resource & Descriptor(자원과 서술자)

멍C 2021. 7. 18. 10:18

렌더링 과정에서 GPU는 자원들에 자료를 기록하거나 자원들에서 자료를 읽어 들인다.

 

Draw() 명령을 호출하기 전에, 먼저 참조할 자원들을 렌더링 파이프라인에 묶어야(Bind) 한다. 이를 가리켜 자원을 파이프라인에 "연결한다(link)" 또는 "바인딩한다"라고 말한다.

 

하지만 GPU자원들이 파이프 라인에 직접 묶이는 것은 아니다. 실제로 파이프라인에 묶이는 것은 해당 자원을 참조하는 서술자(Descriptor) 객체이다.

 

서술자 객체는자원을 GPU에게 서술해주는 경량의 자료구조라고 할 수 있다. 이는 하나의 간접층(level of indirection)이다.

 

이처럼 간접층을 두는 이유는, GPU자원이라는 것이 사실상 범용적이므로, 같은 자원을 렌더링 파이프라인의 다른 단계(Stage) 에서 사용할수 있게 하기위함이다. 예를 들어 텍스처를 렌더 대상으로도 사용하고 그 이후 단계에서 셰이더 자원으로 쓰여야 하는것이다.

 

자원 자체는 자신이 렌더 대상으로 쓰여야 하는지 아니면 깊이/스텐실 버퍼나 셰이더 자원으로 쓰여야 하는지에 대헤 아무 말도 하지 않는다. 또한, 자원의 일부 영역만 렌더링 파이프 라인에 묶고 싶은때가 있는데, 자원 자체에는 그런 부분 영역에 대한 정보가 없다. 더나아가서, 애초에 자원을 무형식으로 생성할 수도 있다. 그런 격우 GPU는 자원의 형식을 알 수 없다.

 

이런 문제를 해결해 주는것이 바로 서술자(Descriptor)이다. 서술자는 자원 자료를 지정하는 수단일 뿐만 아니라, 자원을 GPU에 서술하는 수단이기도 하다. 서술자는 Direct3D에게 자원의 사용법을 말해준다. 또한, 가능한 경우에는 파이프 라인에 묶을 자원의 부분 영역을 서술자로 지정할 수 있다. 그리고 무형식으로 생성된 자원의 경우에는, 그 자원을 참조하는 서술자를 생성할 때 그 자원의 구체적인 형식을 명시할 수 있다.


참고: 뷰(View)는 서술자와 동의어이다. '뷰'라는 용어는 Direct3D의 이전 버전들에 쓰였으며, Direct3D12의 일부에도 여전히 쓰이고 있다.


 

서술자는 자원의 사용법에 따라 여러 종류가 있다.

 

1. CBV/SRV/UAV 서술자들은 각각 상수 버퍼(Contant Buffer) , 셰이더 자원(Shader Resource), 순서 없는 접근(unordered Access View)을 서술한다.

2. 표본 추출기 서술자는 텍스처 적용에 쓰이는 표본추출기(Sampler) 자원을 서술한다.

3. RTV 서술자는 렌더 대상(Render Target) 자원을 서술한다.

4. DSV 서술자는 깊이/스텐실(Depth/Stencil) 자원을 서술한다.

 

서술자 힙(Descriptor heap)은 서술자들의 배열이다. 응용 프로그램이 사용하는 서술자들이 저장되는 곳이 서술자 힙이다. 서술자의 종류에 따라 서로 다른 힙에 저장된다. 또한, 한 종류의 서술자에 대해 여러 개의 힙을 둘 수도 있다.

 

 

 

'DirectX12 > 메모' 카테고리의 다른 글

기능 지원 점검(CheckFeatureSupport)  (0) 2021.07.26
다중 표본화의 이론  (0) 2021.07.18
깊이 버퍼링(Depth Buffer)  (0) 2021.07.09
SwapChain 과 페이지 전환  (0) 2021.07.09
텍스처 형식(Texture Format)  (0) 2021.07.09
Comments