기록공간

[DirectX 12] 기본지식 - 자원과 서술자 본문

DirectX/기초

[DirectX 12] 기본지식 - 자원과 서술자

입코딩 2020. 2. 3. 14:51
반응형

랜더링 과정에서 GPU는 자원들에 자료를 기록하거나 (예를들어 후면버퍼나 깊이 스텐실 버퍼와 같은 자원들) 자원들에서 자료를 읽어 들인다(예를들어 표면의 모습을 서술하는 텍스처나 장면 안의 기하구조의 3차원 위치들을 담은 버퍼). 

 

그리기 명령을 제출하기 전에, 먼저 해당 그리기 호출이 참조할 자원들을 렌더링 파이프라인에 묶어야(Bind)한다. 이를 가리켜 자원을 파이프라인에 "연결(Link)한다" 또는 "바인딩(Binding)한다"라고 말하기도 한다. 그리기 호출마다 달라지는 자원도 있으며, 필요에 따라 그리기 호출마다 그런 자원들의 바인딩을 갱신해주어야 한다. 

 

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

 

서술자 객체는 자원을 GPU에게 서술해주는 경량의 자료구조라고 할 수 있다.(간접층이라고 할 수도 있다) GPU는 자원 서술자를 통해서 자원의 실제 자료에 접근하며, 그 자료를 사용하는 데 필요한 정보 역시 자원 서술자로 부터 얻는다. 그리기 호출이 참조할 서술자들을 명시하면 해당 자원들이 렌더링 파이프라인에 묶인다.

 

이처럼 서술자들을 거치는 추가적인 간접층을 두는 이유는, GPU 자원이라는 것이 사실상 범용적인 메모리 조각이기 때문이다. 자원은 범용적이므로, 같은 자원을 렌더링 파이프라인의 서로 다른 단계들에서 사용할 수 있다. 예를 들어 텍스처를 렌더 대상으로도 사용하고 그 이후 단계에서는 셰이더 자원으로도 사용하는 것이다. 하지만 자원 자체는 자신이 렌더 대상으로 쓰여야 하는지 아니면 깊이 스텐실 버퍼나 셰이더 자원으로 쓰여야 하는지에 대해 아무 말도 하지 않는다.

 

또한, 자원의 일부 영역만 렌더링 파이프라인에 묶고 싶은 때가 있는데, 자원 자체에는 그런 부분 영역에 대한 정보가 없다. 심지어는 자원을 무형식으로 생성할 수도 있다. 이 경우에 GPU는 자원의 형식을 알 수 없다.

 

이러한 문제점들을 해결해 주는 것이 바로 서술자이다. 서술자는 자원 자료를 지정하는 수단일 뿐만 아니라, 자원을 GPU에 서술하는 수단이기도 하다. 서술자는 Direct3D에게 자원의 사용법(자원을 파이프라인 어떤 단계에 묶을지)을 말해준다.

 

서술자는 자원의 사용법에 따라 여러 종류(형식)가 있으며, 주로 어떤 서술자들을 쓰는지를 말해줄것이다.

 

  1. 상수버퍼(CBV), 셰이더 자원(SRV), 순서없는 접근(UAV)을 서술한다.

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

  3. RTV 서술자는 렌더 대상 자원을 서술한다.

  4. DSV 서술자는 깊이 스텐실(Descriptor Heap) 자원을 서술한다.

서술자 힙(Desciptor Heap)은 서술자들의 배열이다. 응용 프로그램이 사용하는 서술자들이 저장되는 곳이 바로 서술자 힙이다. 서술자 동류마다 개별적인 서술자 힙이 필요하다. 같은 종류의 서술자들은 같은 서술자 힙에 저장된다. 또한 한 종류에 대해 여러 개의 힙을 둘 수도 있다.

 

서술자들은 응용 프로그램의 초기화 시점에서 생성해야 한다. 이는 그때 일정 정도의 형식 점검과 유효성 검증이 일어나기 때문이며, 초기화 시점에서 생성하는 것이 실제 실행 시점에서 생성하는 것보다 낫기 때문이다.

 

DirectX SDK 문서에는 "형식이 완전히 지정된 자원은 해당 형식으로만 사용될 수 있다. 그러면 런타임은 자원 대한 접근을 최적화 할 수 있게 된다"라는 문구가 나온다. 따라서 무형식 자원은 그런 자원이 제공하는 유연성이 꼭 필요할 때에만 만들어야 한다. 그렇지 않은 경우에는 완전히 형식을 지정해서 자원을 만들어야 한다

 

반응형
Comments