DirectX 12 ์žฅ์น˜ ์ดˆ๊ธฐํ™” ์ดํ•ดํ•˜๊ธฐ (5) - part 2

2020. 7. 27. 21:23ใ†PROGRAMMING/DirectX 12

 

 

 

 

 

[ DirectX 12 ์žฅ์น˜ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ ]

 

1 ๋‹จ๊ณ„ Device(๊ทธ๋ž˜ํ”ฝ ๋””๋ฐ”์ด์Šค) ์ƒ์„ฑ.

2 ๋‹จ๊ณ„ CommandQueue์™€ CommandList ์ƒ์„ฑ.

3 ๋‹จ๊ณ„ SwapChain ์ƒ์„ฑ.

4 ๋‹จ๊ณ„ FenceObject ์ƒ์„ฑ.

5 ๋‹จ๊ณ„ ๋ Œ๋”ํƒ€๊ฒŸ(RenderTarget)๊ณผ ๊นŠ์ด/์Šคํ…์‹ค(Depth/Stencil) ๋ฒ„ํผ ์ƒ์„ฑ.

 


 

[ ๋ Œ๋”ํƒ€๊ฒŸ & ๊นŠ์ด/์Šคํ…์‹ค ๋ฒ„ํผ ์„œ์ˆ ์ž ํž™ ์ƒ์„ฑ ]

 

Create RenderTarget DescriptorHeap

์„œ์ˆ ์ž ํž™(Descriptor Heap)์€ ์„œ์ˆ ์ž๋“ค์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด์ด๋ผ๊ณ  ์•ž์—์„œ ์„ค๋ช…ํ–ˆ๋‹ค.

์„œ์ˆ ์ž ํž™์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ID3D12DescriptorHeap* ๋ฅผ ์„ ์–ธํ•˜๊ณ ,

ID3D12Device์˜ CreateDescriptorHeap() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

D3D12_DESCRIPTOR_HEAP_DESC์˜ NumDescriptors๋Š” ์„œ์ˆ ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค.

์ „๋ฉด ๋ฒ„ํผ, ํ›„๋ฉด ๋ฒ„ํผ ๋‘ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ 2๋ฅผ ์„ค์ •ํ•œ๋‹ค.

Type์˜ ๊ฒฝ์šฐ ๋ Œ๋” ํƒ€๊ฒŸ ๋ทฐ๋ฅผ ๋‹ด์„ ์„œ์ˆ ์ž ํž™์ด๋ฏ€๋กœ D3D12_DESCRIPTOR_HEAP_TYPE_RTV๋ฅผ ์„ค์ •ํ•œ๋‹ค.

Flags๋Š” ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ FLAG_NONE์„ ์„ค์ •ํ•œ๋‹ค.

 

Create DepthStencil DescriptorHeap

๊นŠ์ด/์Šคํ…์‹ค ๋ฒ„ํผ์˜ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฒ„ํผ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ NumDescriptors๋Š” 1๋กœ ์„ค์ •ํ•œ๋‹ค.

Type์€ ๊นŠ์ด/์Šคํ…์‹ค ๋ทฐ๋ฅผ ๋‹ด์„ ์„œ์ˆ ์ž ํž™์ด๋ฏ€๋กœ D3D12_DESCRIPTOR_HEAP_TYPE_DSV๋ฅผ ์„ค์ •ํ•œ๋‹ค.

 

 

 

 

[ ๋ Œ๋”ํƒ€๊ฒŸ ๋ฒ„ํผ ๋ทฐ(View) ์ƒ์„ฑ ]

 

๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ทฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด, CreateOOOView() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

๋ Œ๋”ํƒ€๊ฒŸ ๋ทฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด? CreateRenderTargetView() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•˜๊ณ ,

๊นŠ์ด/์Šคํ…์‹ค ๋ทฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด? CreateDepthStencilView()๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

๋จผ์ € ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ทฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ Œ๋”ํƒ€๊ฒŸ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค.

IDXGISwapChain์„ ํ†ตํ•ด์„œ ์Šค์™‘ ์ฒด์ธ์„ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋ฏธ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ํ›„๋ฉด ๋ฒ„ํผ๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ Œ๋”ํƒ€๊ฒŸ์˜ ๊ฒฝ์šฐ ๋ฐ”๋กœ ๋ Œ๋”ํƒ€๊ฒŸ ๋ทฐ๋ฅผ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

 

CreateRenderTargetView

m_arrSwapChainBuffer๋Š” ID3D12Resource* ๋ฐฐ์—ด์ด๋‹ค. ๋ฒ„ํผ 2๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 2์ด๋‹ค.

IDXGISwapChain์˜ GetBuffer()ํ†ตํ•ด์„œ ๋ฒ„ํผ์˜ ์ •๋ณด๋ฅผ ์–ป์–ด์™€ ๋‹ด์•„์ค€๋‹ค.

์„œ์ˆ ์ž ํž™์˜ ์‹œ์ž‘ ์ง€์ ๋ถ€ํ„ฐ ํ›„๋ฉด ๋ฒ„ํผ์— ๋Œ€ํ•œ ๋ทฐ(View)๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

IncrementSize๋งŒํผ Offset์„ ํ†ตํ•ด ์„œ์ˆ ์ž ํž™์˜ ๋‹ค์Œ Index๋กœ ์ด๋™ํ•˜์—ฌ ์ด 2๊ฐœ์˜ ๋ทฐ(View)๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž.

๋ Œ๋”ํƒ€๊ฒŸ ๋ทฐ๋Š” ๋ณ„๋„์˜ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ธ์ž์— nullptr์„ ๋„ฃ์œผ๋ฉด ๋ฆฌ์†Œ์Šค ํ˜•์‹๊ณผ ๋˜‘๊ฐ™์€ ๋ทฐ(View)๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

 

 

 

[ ๊นŠ์ด/์Šคํ…์‹ค ๋ฒ„ํผ ๋ทฐ(View) ์ƒ์„ฑ ]

 

๊นŠ์ด/์Šคํ…์‹ค ๋ทฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ณ„๋„๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.

CreateCommittedResource() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š”

D3D12_HEAP_PROPERTIES ๊ตฌ์กฐ์ฒด์™€ D3D12_RESOURCE_DESC ๊ตฌ์กฐ์ฒด,

D3D12_CLEAR_VALUE ๊ตฌ์กฐ์ฒด ์ •๋ณด๋ฅผ ์ฑ„์›Œ์•ผ ํ•œ๋‹ค.

 

D3D12_HEAP_PROPERTIES 

Heap์˜ Type์€ D3D12_HEAP_TYPE_DEFAULT์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

 

D3D12_HEAP_TYPE_DEFAULT์— ๋Œ€ํ•ด์„œ ๋ถ€๊ฐ€์ ์ธ ์„ค๋ช…์„ ํ•˜์ž๋ฉด,

D3D12_HEAP_TYPE_DEFAULT๋Š” CPU๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ  GPU๋Š” ์ฝ๊ณ  ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์ด๋‹ค.

๋”ฐ๋ผ์„œ ํƒ€์ž… ์ค‘ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํž™์— ๋งŒ๋“ค์–ด์ง„๋‹ค.

๋ชจ๋“  ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค ๋ฐ์ดํ„ฐ๋Š” DEFAULT_HEAP์— ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด ๋งž๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋Š” ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋Š” CPU๊ฐ€ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ

CPU๋Š” DEFAULT_HEAP์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ DEFAULT_HEAP์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ ค๊ณ  ํ•˜๋ฉด, ์ค‘๊ฐ„์— ์ถ”๊ฐ€์ ์ธ ๋ฆฌ์†Œ์Šค ํž™์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ด๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ UploadHeap์ด๋‹ค.

UploadHeap์—๋Š” CPU๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , GPU๋„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ DEFAULT_HEAP์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด CPU๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” UploadHeap์ด ํ•„์š”ํ•˜๋‹ค.

CPU๊ฐ€ UploadHeap์— ๋ฆฌ์†Œ์Šค๋ฅผ WRITE ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ UploadHeap์€ GPU ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๊ณ , ๋ฆฌ์†Œ์Šค๋„ GPU ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์œผ๋ฏ€๋กœ

GPU ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ COPY ํ•˜๋ฉด ๋œ๋‹ค. (CommandList์˜ CopyResource() ํ•จ์ˆ˜)

Copy๋ฅผ ํ•˜๊ณ  ๋‚˜๋ฉด UploadHeap์˜ ๋‚ด์šฉ์ด GPU DefaultHeap์— ๋ณต์‚ฌ๋œ๋‹ค.

๋ณต์‚ฌ๊ฐ€ ๋œ ํ›„์—๋Š” UploadHeap์ด ํ•„์š” ์—†์–ด์ง€๋ฏ€๋กœ ํ•ด์ œํ•ด์ค˜๋„ ๋œ๋‹ค.

 

์ฆ‰, ์ •๋ฆฌํ•˜์ž๋ฉด DEFAULT_HEAP์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋ ค๋ฉด ์ค‘๊ฐ„์— ๋ฐ˜๋“œ์‹œ UploadHeap์ด ํ•„์š”ํ•˜๋‹ค.

(CPU์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ฒจ์ฃผ๊ณ , Copy ๋ช…๋ น์„ ํ†ตํ•ด DefaultHeap์— ๋ณต์‚ฌ ํ›„ UploadHeap ํ•ด์ œ)

 

๊ทธ๋Ÿฐ๋ฐ, Copy ๋ช…๋ น์„ ํ•œ ์ˆœ๊ฐ„ ๋ฐ”๋กœ ๋‚ด์šฉ์ด ์˜ฎ๊ฒจ์งˆ๊นŒ? NO

์‹คํ–‰์€ GPU Queue์—์„œ ์‹คํ–‰์ด ๋  ๋•Œ์ด๊ณ  ์–ธ์ œ์ธ์ง€๋Š” ์ •ํ™•ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์•Œ ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ Copy๊ฐ€ ๊ณง๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜์ž.

 

๊นŠ์ด/์Šคํ…์‹ค ๋ฆฌ์†Œ์Šค์˜ ๊ฒฝ์šฐ CPU์—์„œ ๋”ฐ๋กœ WRITE ํ•  ๋‚ด์šฉ์ด ์—†์œผ๋ฏ€๋กœ UplaodHeap์„ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ Vertex/Index ๋ฒ„ํผ๋‚˜ ํ…์Šค์ฒ˜์˜ ๊ฒฝ์šฐ UploadHeap์ด ํ•„์š”ํ•˜๋‹ค.

 

D3D12_RESOURCE_DESC

Dimension์€ 2D ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋ฏ€๋กœ D3D12_RESOURCE_DIMENSION_TEXTURE2D๋ฅผ ์„ค์ •ํ•œ๋‹ค.

Width์™€ Height๋Š” ์ƒ์„ฑํ•˜๋ ค๋Š” ์œˆ๋„์šฐ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

Flags๋Š” ๊นŠ์ด/์Šคํ…์‹ค ๊ฐ’์„ ๊ธฐ๋กํ•  ๊ฒƒ์ด๋ฏ€๋กœ D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL๋ฅผ ์„ค์ •ํ•œ๋‹ค.

 

 

D3D12_CLEAR_VALUE

Format์€ D3D12_RESOURCE_DESC์˜ ํ˜•์‹๊ณผ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•œ๋‹ค.

Depth์™€ Stencil ๊ฐ’์€ Clear์‹œ์— ์–ด๋–ค ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•˜๋Š” ๊ฐ’์ด๋‹ค.

๋ณดํ†ต ์ผ๋ฐ˜์ ์œผ๋กœ 1๊ณผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

 

 

๊นŠ์ด/์Šคํ…์‹ค ๋ฆฌ์†Œ์Šค

์œ„์˜ ๊ตฌ์กฐ์ฒด๋“ค์˜ ์ •๋ณด๋ฅผ ์„ค์ •ํ–ˆ๋‹ค๋ฉด ์ด์ œ ๊นŠ์ด/์Šคํ…์‹ค ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.

ID3D12Resource* ๋ฒ„ํผ ๋‚ด์šฉ์„ ์ƒ์„ฑํ•ด์ฃผ๋„๋ก ํ•˜์ž.

 

 

Create DepthStencil View

๊นŠ์ด/์Šคํ…์‹ค ๋ฒ„ํผ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฉด ์„œ์ˆ ์ž ํž™์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๋‹ค.๊นŠ์ด/์Šคํ…์‹ค ์„œ์ˆ ์ž ํž™์˜ ์‹œ์ž‘ ๋ฒˆ์ง€๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , ๊นŠ์ด/์Šคํ…์‹ค ๋ฒ„ํผ์— ๋Œ€ํ•œ ๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.๋‘ ๋ฒˆ์งธ ์ธ์ž์— nullptr์„ ๋„ฃ์œผ๋ฉด ๋ฆฌ์†Œ์Šค ํ˜•์‹๊ณผ ๋˜‘๊ฐ™์€ ๋ทฐ(View)๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.