티스토리 뷰
랜더링 과정에서 GPU는 자원들에 자료를 기록하거나 (이를 테면 후면 버퍼나 깊이 스텐실 버퍼가 그런종류의 자원이다.)자원들에서 자료를 읽어 들인다. (이를 테면 표면이 모습을 서술하는 텍스처나 장면 안의 기하구조의 3차원 위치들을 담은 버퍼가 그런 종류의 자원이다.) 그리기 명령을 제출하기 전에, 먼저 해당 그리기 호출이 참조할 자원들을 렌더링 파이프라인에 묶어야 (blind)한다. 이를 가리켜 자원을 파이프라인에 연결한다(link) " 또는 " 바인딩한다"라고 말하기도 한다. 그리기 호출마다 달라지는 자원들도 있으며, 따라서 필요하다면 그리기 호출마다 그런자원들의 바인딩을 갱신해야 한다.
그런데 GPU 자원들이 파이프라인에 직접 묶이는 것은 아니다. 실제로 파이프라인에 묶이는 것은 해당 자원을 참조하는 서술자(descriptor) 객체이다. 서술자 객체는 자원을 GPU에게 서술해주는 경량의 자료구조라고 할 수 있다. 본질적으로 이는 하나의 간접층 ( level of indirection )이다. GPU는 자원 서술자를 통해서 자원의 실제 자료에 접근하며, 그 자료를 사용하는 데 필요한 정보 역시 자원 서술자로부터 얻는다. 그리기 호출이 참조할 서술자들을 명시하면 해당 자원들이 렌더링 파이프라인에 묶인다.
이처럼 서술자들을 거치는 추가적인 간접층을 두는 이유는, GPU자원이라는 것이 사실상 범용적인 메모리조각이기 때문이다. 자원은 범용적이므로, 같은 자원을 렌더링 파이프라인의 서로 다른 단계들에게 사용할 수 있다. 흔한 예는 텍스처를 랜더 대상으로도 사용하고 (즉, Direct3D가 장면을 텍스처에 그린다.) 그 이후 단계에서 셰이더 자원으로도 사용하는 (즉, 텍스처에서 표본들을 추출해서 셰이더의 입력자료도 사용한다)것이다. 자원 자체는 자신이 랜더 대상으로 쓰여야 하는지 아니면 깊이 스텐실 버퍼나 셰이더 자원으로 쓰여야 하는데에 대해 아무 말도 하지 않는다. 또한, 자원의 일부 영역만 렌더링 파이프라인에 묶고 싶은 때가 있는데, 자원 자체에는 그런 부분 영역에 대한 정보가 없다. 더 나아가서 애초에 자원을 무형식으로 생성할 수도 있다. 그런 경우 GPU는 자원의 형식을 알수 없다. 이런 문제를 해결해 주는 것이 바로 서술자이다 . 서술자는 자원 자료를 지정하는 수단일 뿐만 아니다 . 자원을 GPU에 서술하는 수단이기도 하다. 서술자는 Direct3D에게 자원의 사용법을 (다시 말하면 자원을 파이프라인의 어떤 단계에 묶어야 하는지를)말해준다. 또한, 가능한 경우에는 파이프라인에 묶을 자원의 부분 영역을 서술자로 지정할 수 있다. 그리고 무형식으로 생성된 자원의 경우에는, 그 자원울 참조하는 서술자를 생성할 때 그 자원의 구체적인 형식을 명시할 수 있다.
참고 : 뷰는 서술자와 동의어이다. '뷰'라는 용어는 Direct3D의 이전 버전들에 쓰였으며, Direct3D 12 의 일부에도 여전히 쓰이고 있다. 이책에서는 두 용어를 함께 사용한다. 예를 들어 상수 버퍼 뷰와 상수 버퍼 서술자는 같은것이다.
서술자는 자원의 사용법에 따라 여러 종류 (형식 ) 가 있다. 이책에서는 다음과 같은 종류의 세슬자들은 사용한다 .
1 . CBV /SRV / UAV 서술자들은 각각 상수버퍼 ( constant buffer ), 셰이더 자원 ( Shader resource ), 순서 없는 접근 ( unordered access View )을 서술한다.
2. 표본추출기 서술자는 텍스처 작용에 쓰이는 표본 추출기 ( sampler ) 자원을 서술한다.
3. RTV 서술자는 랜더 대상 ( render target ) 자원을 서술한다.
4 . DSV 서술자는 깊이-스텐실 ( depth / stencil ) 자원을 서술한다.
서술자 힙 ( descriptor heap )은 서술자들의 배열이다. 응용 프로그램이 사용하는 서울자들이 저장되는곳이 바로 서술자 힙이다. 서술자 종류마다 개별적인 서술자 힙이 필요하다. 같은 종류의 서술자들은 같은 서술자 힙에 저장된다.
또한, 한 종류의 서술자에 대해 여러 개의 힙을 들 수도있다. 하나의 자원을 참조하는 서술자가 하나뿐이어야 하는 것은 아니다. 예를 들어 한 자원의 여러 부분 영역을 여러 서술자가 참조할 수 있다. 또한, 앞에서 언급했듯이 하나의 자원를 렌더링 파이프라인의 여러 단계에 묶을 수 있는데, 단계마다 개별적인 서술자가 필요하다. 하나의 텍스처를 렌더 대상이자 셰이더 자원으로 사용하는 예의 경우에는 두개의 서술자, 즉 RTV형식의 서술자와 SRV형식의 서술자를 만들어야 한다. 마찬가지로, 무형식 자원을 만든 경은에는 텍스처의 원소를 이를테면 부동소수점 값으로 사용할 수도 있고 정수로 사용할 수도 있는데, 그러려면 두 개의 서술자, 즉 부동소수점 형식을 지정하는 서술자와 정수형식을 지정하는 서술자가 필요하다.
서술자들은 응용 프로그램의 초기화 시점에서 생성해야 한다. 이는 그때 일정 정도의 형식 점검과 유효성 검증이 일어나기 때문이며, 또한 초기화 시점에서 생성하는 것이 실제 실행 시절에서 생성하는 것이 실제 실행 시점에서 생성하는 것보다 낫기 때문이기도하다.
참고 : Direct SDK 문서화에는 "형식이 완전히 지정된 자원은 해당 형식으로만 사몽할 수 있다. 그러면 런타임은 자원에 대한 접근을 최적화 할 수 있게 된다"라는 뜻의 문구가 나온다. 따라서 무형식 자원은 그런 자원이 제공하는 유연성 (자료를 여러 뷰들을 통해서 다양한 방식으로 해석할 수 있는 능력)이 꼭 필요할 때에만 만들어야한다. 그렇치 않는 경우에는 형식을 완전히 지정해서 자원을 만들어야 한다.
'DirectX12 > Direct3D' 카테고리의 다른 글
Direct3D의 다중표본화과 기능 수준. (0) | 2023.06.06 |
---|---|
다중표본화의 이론. (0) | 2023.06.04 |
깊이 버퍼링(Depth Buffering). (0) | 2023.05.25 |
교환 사슬과 페이지 전환. (0) | 2023.05.20 |
텍스처 (0) | 2023.05.16 |
- Total
- Today
- Yesterday
- DirectX
- ReplicatedUsing
- Replicated
- DirectX12
- 게임프로그래밍
- 게임
- 언리얼#게임
- Direct12
- 1993
- UnReal
- 언리얼#c++#기능
- 언리얼#c++#Interface
- 4.27
- ubuntu
- ActorComponent
- html5
- 시애틀의 잠 못 이루는 밤
- LockonSystem
- 언리얼#프로그래밍#c++#포트폴리오준비#블루프린트->c++전환
- Multipalyer
- c++
- Direct3D
- ros2
- 영화리뷰
- 언리얼엔진#FPS
- 언리얼
- directx3d
- Multiplayer
- ros
- Linux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |