Direct x 12 초기화

31
DirectX 12 초기화 쿠재아이 김재경

Transcript of Direct x 12 초기화

Page 1: Direct x 12 초기화

DirectX 12 초기화쿠재아이

김재경

Page 2: Direct x 12 초기화

COM(Component Object Model)

• 프로그래밍언어독립성과하위호환성을가능하게하는기술

• C++ 클래스로간주하고사용해도무방

• new, delete 키워드를사용하지않고특정함수호출로생성, 해제

• 참조카운팅기법을사용하며사용횟수가 0이되면메모리에서해제

• COM 객체의수명관리를돕기위해, Windows Runtime Library(WRL)는Microsoft::WRL::ComPtr라는클래스(스마트포인터)를제공

• 방대한내용이지만자세히알필요는없는듯

Page 3: Direct x 12 초기화

COM(Component Object Model)

ID3D12Device COM 객체

ComPtr COM 객체의스마트포인터

D3D12CreateDevice COM 객체생성함수

Page 4: Direct x 12 초기화

ComPtr

템플릿인자포인터타입의멤버변수를가짐

Page 5: Direct x 12 초기화

ComPtr

소멸자에서호출되는함수

Page 6: Direct x 12 초기화

Swap Chain

• 프레임을표시하는데사용되는버퍼모음(Direct3D 9)

• 더블버퍼링을하기위해서는후면버퍼와전면버퍼가필요하다

• 버퍼내용을변경하는것이아니라버퍼의포인터를변경

• IDXGISwapChain이해당인터페이스. 전면버퍼텍스처와후면버퍼텍스처를담으며버퍼크기변경을위한함수와버퍼의제시(presenting, 전환)를위한메소드등을제공

Page 7: Direct x 12 초기화

Swap Chain

• D3D12의 Swap Chain은이전버전과다름

• automatic resource rotation을지원하지않음

• Automatic resource rotation enabled apps to render the same API object while the actual surface being rendered changes each frame(자동리소스순환은앱이렌더링된실제표면이각프레임을변경하는동안동일한 API 객체를렌더링할수있게했습니다)

• D3D12에서는다른기능이낮은 CPU 오버헤드를가질수있게한다고함

• https://msdn.microsoft.com/en-us/library/windows/desktop/dn903945(v=vs.85).aspx

Page 8: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

• 깊이문제를해결하기위한방법중하나는먼것부터가까운것순서로그리는것

• 그러나이방법에는두가지문제가발생

1. 물체들을정렬해야한다

2. 맞물린형태의물체들을제대로처리하지못함

• 깊이버퍼링을사용하면이문제를해결할수있다

Page 9: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

• 한물체가다른물체보다앞에있는지판정하기위한기법

• 텍스처에각픽셀의깊이정보를담는다

• 깊이는 0.0에서 1.0

• 깊이버퍼의원소들과후면버퍼의픽셀들은일대일도대응(후면버퍼가 1280 × 1024라면깊이버퍼도 1280 × 1024)

• 그리는순서와무관하게물체들이제대로가려진다

Page 10: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

Page 11: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

연산 픽셀 깊이 설명

지우기 검은색 1.0 초기화

원기둥그리기 𝑃3 𝑑3 깊이갱신 O

구그리기 𝑃1 𝑑1 깊이갱신 O

원뿔그리기 𝑃1 𝑑1 깊이갱신 X

Page 12: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

• 앞에서보듯깊이버퍼링을사용하면정렬유무에상관없이물체를제대로가릴수있다

• 하지만뒤에가려질물체를먼저그릴경우렌더링이비효율적으로된다

• 따라서깊이버퍼링을사용하더라도물체를정렬하는것이좋다

• 이것을 Z-order라고부른다

• https://en.wikipedia.org/wiki/Z-order

Page 13: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

• 하지만깊이버퍼링도완전하지않음

• 알파블렌딩이들어가면문제가생김

• 예)

이런나뭇잎이있다고하자

Page 14: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

• 나뭇잎과구의위치가사진과같을때나뭇잎이먼저그려지고구가먼저그려진다면?

Page 15: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

• Z-order로인해앞에서부터그려진다

Page 16: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

• 일반적으로는먼저불투명한걸모두모아서그리고나중에반투명한것을모아그린다고함

Q. 그럼다해결된건가요?

A. 아뇨ㅋ

Page 17: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

• 반투명끼리그릴때앞의것이먼저그려지면문제발생

• 반투명인것들만따로모아서정렬을해야한다

Page 18: Direct x 12 초기화

깊이버퍼링(Z-버퍼링)

Q. 그럼다해결된건가요?

A. 아뇨ㅋ

• 자세한것은아래링크에…http://chulin28ho.egloos.com/5267860http://chulin28ho.egloos.com/5268685http://chulin28ho.egloos.com/5269434http://chulin28ho.egloos.com/5270691http://chulin28ho.egloos.com/5271687http://chulin28ho.egloos.com/5272883http://chulin28ho.egloos.com/5284164

Page 19: Direct x 12 초기화

자원과서술자(Descriptor)

• 위와같은함수가있을때배열의길이를알수없다. 길이인자를하나더만들어야한다

• 즉, 배열에대한정보(서술)가필요하다

• 자원은자원자체에대한정보를가지고있지않다

Page 20: Direct x 12 초기화

자원과서술자(Descriptor)

서술자를이용하면자원의여러정보를알수있다

Page 21: Direct x 12 초기화

자원과서술자(Descriptor)

• 렌더링파이프라인에바인딩되는것은자원이아니라서술자이다

• 책에서는다음과같은서술자를사용한다

1. CBV(constant buffer), SRV(shader resource), UAV(unordered access)2. Sampler3. RTV(render target view)4. DSV(depth/stencil view)

• 한자원의여러부분을여러서술자가참조할수있다(하나의텍스처를 RTV와 SRV가참조할수있다)

• 서술자들은응용프로그램의초기화시점에서생성해야한다

Page 22: Direct x 12 초기화

서술자힙(Descriptor Heap)

• 서술자들의배열. 서술자들이저장되는곳이다

• 같은종류의서술자들은같은서술자힙에저장된다

• 한종류의서술자에대해여러개의힙을둘수있다

• CPU로만관리할수있다

Page 23: Direct x 12 초기화

DXGI(DirectX Graphics Infrastructure)

• Direct3D와함께쓰이는 API

• 3D에한정되지않는공통적인그래픽기능들이포함

• 예) IDXGISwapChain, 전체화면모드전환, 지원되는디스플레이모드(해상도, 갱신율등)

Page 24: Direct x 12 초기화

Command Queue

• 비동기랜더링을위한디자인

• CPU는 Command List를큐에제출한다

• GPU는명령을처리할준비가되면큐에서명령어를꺼내실행한다

• 큐를비우거나꽉채우지않고계속사용하도록하는것이관건

Page 25: Direct x 12 초기화

Command List, Command Allocator

• Command List – GPU가실행하는명령집합

• Command Allocator –실제로명령이할당되는공간

• 1개의 Command List로도처리는가능하나성능이제대로나오지않음

• 멀티스레드로여러개의 Command List를동시에기록하고각각의스레드가독립적으로실행하는것을권장

• GPU가 Command Allocator에담긴모든명령을실행한것이확실해지기전까지는Command Allocator를재설정하지말아야한다

Page 26: Direct x 12 초기화

Command List, Command Allocator

Command List 0

Clear RTVSetRTVSetPSODraw

Command Queue

Command List 1

Clear RTVSetRTVSetPSODraw

Clear RTVSetRTVSetPSODraw

Clear RTVSetRTVSetPSODraw

Execute()

Execute()

Thread 1

Thread 0

GPU Hardware queue

Page 27: Direct x 12 초기화

CPU/GPU 동기화

• 𝐶가 𝑝2를이용하거나 R이갱신되는도중에R을사용하는것의의도한행동이아니다

• GPU가명령을모두처리할때까지기다려야한다

• 이때필요한것이울타리(Fence) 객체

Page 28: Direct x 12 초기화

CPU/GPU 동기화

Page 29: Direct x 12 초기화

자원상태전이

• GPU가자원에자료를다기록하지않았거나기록을아예시작하지도않은상태에서자원에자료를읽으려하면문제가생긴다.(Resource hazard)

• 이문제를해결하기위해자원들에상태를부여

• 임의의상태전이를 Direct3D에게보고하는것은프로그램의몫

• 예) 텍스처를 write 할때에는 Render Target 상태로설정하고 read 할때가되면상태를 Shader Resource 상태로변경(전이)한다

• GPU는자원위험을피하는데필요한조처를할수있다(모든쓰기연산이완료되길기다린후에읽기를시도하는등)

Page 30: Direct x 12 초기화

멀티스레드활용

• Direct3D 12는멀티스레드를효율적으로활용할수있도록설계됨

• Command List를멀티스레드로생성할때주의해야할점

1. 같은 Command List를여러스레드가공유하지않는다

2. Command Allocator 또한여러스레드가공유하지않는다

3. Command Queue는여러스레드가공유할수있다

4. 성능상의이유로동시에기록할수있는 Command List의최대개수를반드시초기화시점에서설정해야한다

Page 31: Direct x 12 초기화

출처

• Swap Chain• https://msdn.microsoft.com/en-us/library/windows/desktop/dn903945(v=vs.85).aspx• https://msdn.microsoft.com/ko-kr/library/windows/desktop/bb206356(v=vs.85).aspx

• Command Queue, List, Allocator• https://goo.gl/PrMwFN