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 ์์ฑ ]
[ Direct3D Double Buffering ]
์ค์ ์ฒด์ธ(SwapChain)์ ์์ฐจ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ํ๋ ์ ๋ฒํผ๋ค์ ์งํฉ์ด๋ค.
- ์ ๋ฉด ๋ฒํผ(FrontBuffer) : ๋์คํ๋ ์ด(๋ชจ๋ํฐ)์ ์ง์ ์ฐ๊ฒฐ๋๋ค. ๊ทธ๋ํฝ ์นด๋๋ง ์ ๊ทผ ๊ฐ๋ฅํ ์์ญ์ด๋ค.
- ํ๋ฉด๋ฒํผ(BackBuffer) : ์์ฉ ํ๋๊ทธ๋จ์ด ๊ทธ๋ํฝ ์์ ์ ํ๋ ์์ญ์ด๋ค.
ํ๋ฆฌ์ ํ ์ด์ (Presentation)์ ํ๋ฉด ๋ฒํผ์ ๋ด์ฉ์ ์ ๋ฉด ๋ฒํผ๋ก ์ฎ๊ธฐ๋ ์์ ์ ๋งํ๋ค.
ํ๋ฆฌ์ ํ ์ด์ ์ ๋ฐฉ๋ฒ์ ํ๋ฆฌํ(Flipping)๊ณผ ๋ธ๋ฆฌํธ(Blit) ๋ ๊ฐ์ง๊ฐ ์๋ค.
ํ๋ฆฌํ์ ํ๋์จ์ด์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฉด ๋ฒํผ์ ํ๋ฉด ๋ฒํผ๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ด๋ค.
Direct3D๋ ํ๋ฆฌํ์ ํตํด ํ๋ฆฌ์ ํ ์ด์ ์ ์ํํ๋ค.
๋ธ๋ฆฌํธ๋ ๋ฒํผ์ ๋ด์ฉ์ ๋ณต์ฌํ๋ ๊ฒ์ ๋งํ๋ค. Win32 API์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
[ ๋ค์ค ์ํ๋ง (Multi-Sampling) ]
์ค์ ์ฒด์ธ(SwapChain)์ ๋ง๋ค๊ธฐ ์ ์ ์ฅ์ฐฉ๋ ๋๋ฐ์ด์ค๊ฐ ๋ค์ค ์ํ๋ง์ ์ง์ํ๋์ง ํ์ ํด์ผ ํ๋ค.
๋ค์ค ์ํ๋ง์ด๋ ๊ณ๋จ ํ์ ์ ๊ฑฐ ๊ธฐ๋ฒ(Antialiasing Technique)์ ๋งํ๋ค.
๊ณ๋จ ํ์(Aliasing)์ด๋ ๋ชจ๋ํฐ์ ํฝ์ ํฌ๊ธฐ๊ฐ ๋ฌดํํ ์์ง ์๊ธฐ ๋๋ฌธ์ ๋ํ๋๋ ํ์์ด๋ค.
๋ชจ๋ํฐ์ ํด์๋๋ฅผ ๋๋ฆฌ๋ฉด(ํฝ์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ํ๋ค๋ฉด) ๊ณ๋จ ํ์์ด ์ค์ด๋ค์ง๋ง,
๋ชจ๋ํฐ์ ํด์๋๋ฅผ ๋๋ฆด ์ ์๋ค๋ฉด? ๋ค์ค ์ํ๋ง ๊ธฐ๋ฒ์ ํตํด ๋ณด์ํ ์ ์๋ค.
๋ชจ๋ Direct3D 12 ๋๋ฐ์ด์ค๋ ๋ชจ๋ DXGI ํ์์ ๋ํ 4X ๋ค์ค ์ํ๋ง์ ์ง์ํ๋ค.
๋ค์ค ์ํ๋ง์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์ฐ์ฐ์ด๊ธฐ ๋๋ฌธ์, ํ๋์จ์ด์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
4X ๋ค์ค ์ํ๋ง์ ๊ฒฝ์ฐ ๋จผ์ ์ค์ ์ฒด์ธ ๋ฒํผ์ ๊ฐ๋ก, ์ธ๋ก ํฌ๊ธฐ๋ฅผ
๊ฐ๊ฐ 2๋ฐฐ์ฉ ํค์ด ํ์ ๊ทธ๋ํฝ ์์ ์ ํ๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ํฝ์ ์ ํฌ๊ธฐ๋ค์ด ์๋์ ์ผ๋ก ์์์ง๊ฒ ๋๋ค.
ํ๋ฉด์ ์ถ๋ ฅ๋ ์ต์ข ํฝ์ ์ ์์์ 4๊ฐ์ ์๋ธ ํฝ์ ๋ค์ ๊ฐ๊ฐ ์ํ๋งํ์ฌ ๊ฒฐ์ ํ๋ค.
DirectX 12๋ MSAA(Multi-Sample Anti-Aliasing) ๊ธฐ๋ฒ์ ํตํด ์ํ๋ง ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
[ 4X MSAA ํ์ง ์ง์ ์ ๊ฒ ]
ํ์ฌ ๋๋ฐ์ด์ค๊ฐ ๋ค์ค ์ํ๋ง์ ์ง์ํ๋์ง ์ฌ๋ถ๋
ID3D12Device์ CheckFeatureSupport() ํจ์๋ฅผ ํตํด ์ ์ ์๋ค.
SampleCount๋ 4(2x2), 16(4x4) ๋ฑ ์ค์ ํ ์ ์์ง๋ง,
์ํ๋งํ ํฝ์ ์ ๊ฐ์๊ฐ ๋์ด๋๋ฉด ๋ ๋๋ง ์๊ฐ์ด ๊ธธ์ด์ง๋ฏ๋ก 4๋ก ์ค์ ํ๋ค.
[ CreateSwapChain ]
IDXGISwapChain* ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ ํ,
๋๋ฐ์ด์ค์ CreateSwapChain() ํจ์๋ฅผ ํตํด ์์ฑํ ์ ์๋ค.
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์ Present๋ฅผ ํธ์ถํ๋ฉด ํ๋ฉด ๋ฒํผ์ ์ ๋ฉด ๋ฒํผ์ ๊ต์ฒด๊ฐ ์ผ์ด๋๋ค.
'PROGRAMMING > DirectX 12' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (5) - part 2 (0) | 2020.07.27 |
---|---|
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (5) - part 1 (3) | 2020.07.25 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (4) (0) | 2020.07.16 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (2) (2) | 2020.07.14 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (1) (0) | 2020.07.13 |