DirectX 12 ์žฅ์น˜ ์ดˆ๊ธฐํ™” ์ดํ•ดํ•˜๊ธฐ (3)

2020. 7. 15. 01:00ใ†PROGRAMMING/DirectX 12

 

 

 

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

 

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

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

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

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

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

 


 

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

 

SwapChain Presentation

 

[ Direct3D Double Buffering ]

 

์Šค์™‘ ์ฒด์ธ(SwapChain)์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค.

- ์ „๋ฉด ๋ฒ„ํผ(FrontBuffer) : ๋””์Šคํ”Œ๋ ˆ์ด(๋ชจ๋‹ˆํ„ฐ)์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์˜์—ญ์ด๋‹ค.

- ํ›„๋ฉด๋ฒ„ํผ(BackBuffer) : ์‘์šฉ ํ”„๋ž˜๊ทธ๋žจ์ด ๊ทธ๋ž˜ํ”ฝ ์ž‘์—…์„ ํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

 

ํ”„๋ฆฌ์  ํ…Œ์ด์…˜(Presentation)์€ ํ›„๋ฉด ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ์ „๋ฉด ๋ฒ„ํผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ๋งํ•œ๋‹ค.

ํ”„๋ฆฌ์  ํ…Œ์ด์…˜์˜ ๋ฐฉ๋ฒ•์€ ํ”Œ๋ฆฌํ•‘(Flipping)๊ณผ ๋ธ”๋ฆฌํŠธ(Blit) ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

ํ”Œ๋ฆฌํ•‘์€ ํ•˜๋“œ์›จ์–ด์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ „๋ฉด ๋ฒ„ํผ์™€ ํ›„๋ฉด ๋ฒ„ํผ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Direct3D๋Š” ํ”Œ๋ฆฌํ•‘์„ ํ†ตํ•ด ํ”„๋ฆฌ์  ํ…Œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋ธ”๋ฆฌํŠธ๋Š” ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. Win32 API์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

 

 

[ ๋‹ค์ค‘ ์ƒ˜ํ”Œ๋ง (Multi-Sampling) ]

๊ณ„๋‹จ ํ˜„์ƒ (Aliasing)

์Šค์™‘ ์ฒด์ธ(SwapChain)์„ ๋งŒ๋“ค๊ธฐ ์ „์— ์žฅ์ฐฉ๋œ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋‹ค์ค‘ ์ƒ˜ํ”Œ๋ง์„ ์ง€์›ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•œ๋‹ค.

๋‹ค์ค‘ ์ƒ˜ํ”Œ๋ง์ด๋ž€ ๊ณ„๋‹จ ํ˜„์ƒ ์ œ๊ฑฐ ๊ธฐ๋ฒ•(Antialiasing Technique)์„ ๋งํ•œ๋‹ค.

๊ณ„๋‹จ ํ˜„์ƒ(Aliasing)์ด๋ž€ ๋ชจ๋‹ˆํ„ฐ์˜ ํ”ฝ์…€ ํฌ๊ธฐ๊ฐ€ ๋ฌดํ•œํžˆ ์ž‘์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ์ด๋‹ค.

๋ชจ๋‹ˆํ„ฐ์˜ ํ•ด์ƒ๋„๋ฅผ ๋Š˜๋ฆฌ๋ฉด(ํ”ฝ์…€ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ํ•œ๋‹ค๋ฉด) ๊ณ„๋‹จ ํ˜„์ƒ์ด ์ค„์–ด๋“ค์ง€๋งŒ,

๋ชจ๋‹ˆํ„ฐ์˜ ํ•ด์ƒ๋„๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์—†๋‹ค๋ฉด? ๋‹ค์ค‘ ์ƒ˜ํ”Œ๋ง ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ชจ๋“  Direct3D 12 ๋””๋ฐ”์ด์Šค๋Š” ๋ชจ๋“  DXGI ํ˜•์‹์— ๋Œ€ํ•œ 4X ๋‹ค์ค‘ ์ƒ˜ํ”Œ๋ง์„ ์ง€์›ํ•œ๋‹ค.

๋‹ค์ค‘ ์ƒ˜ํ”Œ๋ง์€ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์—ฐ์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

 

4X ๋‹ค์ค‘ ์ƒ˜ํ”Œ๋ง์˜ ๊ฒฝ์šฐ ๋จผ์ € ์Šค์™‘ ์ฒด์ธ ๋ฒ„ํผ์˜ ๊ฐ€๋กœ, ์„ธ๋กœ ํฌ๊ธฐ๋ฅผ

๊ฐ๊ฐ 2๋ฐฐ์”ฉ ํ‚ค์šด ํ›„์— ๊ทธ๋ž˜ํ”ฝ ์ž‘์—…์„ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ํ”ฝ์…€์˜ ํฌ๊ธฐ๋“ค์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์•„์ง€๊ฒŒ ๋œ๋‹ค.

ํ™”๋ฉด์— ์ถœ๋ ฅ๋  ์ตœ์ข… ํ”ฝ์…€์˜ ์ƒ‰์ƒ์€ 4๊ฐœ์˜ ์„œ๋ธŒ ํ”ฝ์…€๋“ค์„ ๊ฐ๊ฐ ์ƒ˜ํ”Œ๋งํ•˜์—ฌ ๊ฒฐ์ •ํ•œ๋‹ค.

DirectX 12๋Š” MSAA(Multi-Sample Anti-Aliasing) ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์ƒ˜ํ”Œ๋ง ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

 

 

[ 4X MSAA ํ’ˆ์งˆ ์ง€์› ์ ๊ฒ€ ]

4X MSAA ํ’ˆ์งˆ ์„œ์ „ ์ง€์› ์ ๊ฒ€

ํ˜„์žฌ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋‹ค์ค‘ ์ƒ˜ํ”Œ๋ง์„ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š”

ID3D12Device์˜ CheckFeatureSupport() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

SampleCount๋Š” 4(2x2), 16(4x4) ๋“ฑ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,

์ƒ˜ํ”Œ๋งํ•  ํ”ฝ์…€์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋ฏ€๋กœ 4๋กœ ์„ค์ •ํ•œ๋‹ค.

 

 

[ CreateSwapChain ]

CreateSwapChain

IDXGISwapChain* ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•œ ํ›„,

๋””๋ฐ”์ด์Šค์˜ CreateSwapChain() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

DXGI_SWAP_CHAIN_DESC

DXGI_SWAP_CHAIN_DESC ๊ตฌ์กฐ์ฒด๋ฅผ ํ†ตํ•ด ์Šค์™‘ ์ฒด์ธ์˜ ์„ฑ์งˆ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

- DXGI_MODE_DESC๋Š” ์Šค์™‘ ์ฒด์ธ ๋ฒ„ํผ์˜ ์„ฑ์งˆ์„ ์„ค์ •ํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ด๋‹ค.

์Šค์™‘์ฒด์ธ ๋ฒ„ํผ์˜ WIDTH, HEIGHT, ํ™”๋ฉด ๊ฐฑ์‹  ํšŸ์ˆ˜(RefreshRate).. ๋“ฑ๋“ฑ ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

RefreshRate๋Š” ํ™”๋ฉด ๊ฐฑ์‹  ๋น„์œจ์„ ํ—ค๋ฅด์ธ  ๋‹จ์œ„๋กœ ์ง€์ •ํ•œ๋‹ค.

Numoerator = 60, Denominator = 1 ---> 1์ดˆ์— 60Hz๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

Format์€ ํ›„๋ฉด ๋ฒ„ํผ(ํ”ฝ์…€) ํ˜•์‹์ด๋‹ค. DXGI_FORMAT_R8G8B8A8_UNORM(32๋น„ํŠธ)์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

ScanlineOrdering์€ ์Šค์บ” ๋ผ์ธ ๊ทธ๋ฆฌ๊ธฐ ๋ชจ๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED๋ฅผ ์„ค์ •ํ•˜์—ฌ ์Šค์บ” ๋ผ์ธ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Scaling์€ ๋ชจ๋‹ˆํ„ฐ ํ•ด์ƒ๋„์— ๋งž๊ฒŒ ํ™•๋Œ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.

DXGI_MODE_SCALING_UNSPECIFIED๋ฅผ ์„ค์ •ํ•˜์—ฌ ์Šค์ผ€์ผ๋ง์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

- DXGI_SAMPLE_DESC๋Š” ๋‹ค์ค‘ ์ƒ˜ํ”Œ๋ง์˜ ํ’ˆ์งˆ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด์ด๋‹ค.

4X MSAA ํ’ˆ์งˆ ์ง€์› ์ ๊ฒ€์—์„œ ์–ป์€ ๊ฐ’์„ ์„ค์ • ํ•ด์ค€๋‹ค.

 

- BufferUsage๋Š” ํ›„๋ฉด ๋ฒ„ํผ์— ๋Œ€ํ•œ ํ‘œ๋ฉด ์‚ฌ์šฉ ๋ฐฉ์‹๊ณผ CPU์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•˜๋Š” ๊ฐ’์ด๋‹ค.

๋ Œ๋” ํƒ€๊ฒŸ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— DXGI_USAGE_RENDER_TARGET_OUTPUT์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

 

- BufferCount๋Š” ์Šค์™‘ ์ฒด์ธ ๋ฒ„ํผ์˜ ๊ฐœ์ˆ˜์ด๋‹ค. ์ „๋ฉด ๋ฒ„ํผ, ํ›„๋ฉด ๋ฒ„ํผ 2๊ฐœ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

 

- Windowed๋Š” ์ฐฝ ๋ชจ๋“œ, ์ „์ฒด ํ™”๋ฉด ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฐ’์ด๋‹ค. TRUE๋ฉด ์ฐฝ, FALSE๋ฉด ์ „์ฒด ๋ชจ๋“œ์ด๋‹ค.

 

- SwapEffect๋Š” ์Šค์™€ํ•‘์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„ ํƒ์‚ฌํ•ญ์„ ์ง€์ •ํ•˜๋Š” ๊ฐ’์ด๋‹ค. 

๋ฒ„ํผ ๋‚ด์šฉ์„ ํ๊ธฐํ•˜๋Š” DXGI_SWAP_EFFECT_FLIP_DISCARD ๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

(๋ฒ„ํผ๋ฅผ ์œ ์ง€ํ•˜๋ฉด ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค.)

 

- Flags๋Š” ์Šค์™‘ ์ฒด์ธ์˜ ๋™์ž‘์— ๋Œ€ํ•œ ์„ ํƒ์‚ฌํ•ญ์„ ์ง€์ •ํ•œ๋‹ค.

DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด

๋””์Šคํ”Œ๋ ˆ์ด ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ๋‹ค.

 

 

IDXGISwapChain ์ธํ„ฐํŽ˜์ด์Šค

IDXGISwapChain์€ ๋ Œ๋”๋ง ๋œ ์˜์ƒ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฒ„ํผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

IDXGISwapChain์˜ Present๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ›„๋ฉด ๋ฒ„ํผ์™€ ์ „๋ฉด ๋ฒ„ํผ์˜ ๊ต์ฒด๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.