2020. 7. 25. 23:59ใPROGRAMMING/DirectX 12
[ DirectX 12 ์ฅ์น ์ด๊ธฐํ ๋จ๊ณ ]
1 ๋จ๊ณ Device(๊ทธ๋ํฝ ๋๋ฐ์ด์ค) ์์ฑ.
2 ๋จ๊ณ CommandQueue์ CommandList ์์ฑ.
3 ๋จ๊ณ SwapChain ์์ฑ.
4 ๋จ๊ณ FenceObject ์์ฑ.
5 ๋จ๊ณ ๋ ๋ํ๊ฒ(RenderTarget)๊ณผ ๊น์ด/์คํ ์ค(Depth/Stencil) ๋ฒํผ ์์ฑ.
๋ ๋ํ๊ฒ ๋ฒํผ์ ๊น์ด/์คํ ์ค ๋ฒํผ๋ฅผ ๋ง๋ค๊ธฐ ์ ์
๋จผ์ ๋ฆฌ์์ค(Resource) & ๋ฆฌ์์ค ๋ทฐ(Resource View) ๊ทธ๋ฆฌ๊ณ
์์ ์ ํ(Descriptor Heap)์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค.
[ ๋ฆฌ์์ค (Resource) ]
๋ชจ๋ ๊ทธ๋ํฝ ๋๋ฐ์ด์ค(GPU)๊ฐ ๋ ๋๋ง์ ํ ๋๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๊ตฌ๋ถ์ผ๋ก ๋๋๋ค.
CPU : C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ์คํ์ํจ๋ค.
GPU : Direct 3D ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ์คํ์ํจ๋ค.
GPU๊ฐ ์ด๋ค ์ผ์ ํ๊ธฐ ์ํด์๋ ์ ฐ์ด๋(Shader) ํ๋ก๊ทธ๋จ์ด ์์ด์ผ ํ๋ค.
์ ฐ์ด๋(Shader)๋ GPU์์ ๋ ๋๋ง์ ํ๊ธฐ ์ํด ์คํ๋๋ ํ๋ก๊ทธ๋จ์ด๋ค.
Direct 3D๋ ์ ฐ์ด๋๋ก ๋ ๋๋ง์ ํ๊ธฐ ์ํด ํน์ ํ์ดํ๋ผ์ธ์ ์ ๊ณตํ๋ค.
์ ฐ์ด๋๋ก ๋๊ฒจ์ค์ผ ํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ ๋ฆฌ์์ค(Resource)๋ผ๊ณ ํ๋ค.
์ฆ, ๋ฆฌ์์ค๋ GPU๊ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ค์ ๋งํ๋ค.
๋ฆฌ์์ค๋ฅผ ํฌ๊ฒ ๊ตฌ๋ถํ๋ฉด ํ ์ค์ฒ(Texture)์ ๋ฒํผ(Buffer) ๋ ๊ฐ์ง์ด๋ค.
ํ ์ค์ฒ๋ ์ด๋ฏธ์ง, ๊ทธ๋ฆผ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค. (์ฃผ๋ก 2D ํ ์ค์ฒ๋ง ๋ค๋ฃฌ๋ค)
๋ฒํผ๋ ๊ทธ๋ฆผ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค. (ํ๋ ฌ, ๋ฒกํฐ, ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ์๋ฃํ ๋ฑ๋ฑ)
๋ชจ๋ ๋ฆฌ์์ค(Resource)๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ์ค์ฒ(Texture) ์๋๋ฉด ๋ฒํผ(Buffer)์ด๋ค.
[ ๋ฆฌ์์ค ๋ทฐ (ResourceView) ]
DirectX 11์์๋ ๋ทฐ(View)๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ค.
DirectX 12์์๋ ๋ทฐ(View)๋ผ๋ ํํ๋ ์ฌ์ฉํ๊ณ ์์ ์(Descriptor)๋ผ๋ ํํ์ผ๋ก๋ ์ฌ์ฉํ๋ค.
์์ ์(Descriptor)๋ ํ๋์ ๋ฆฌ์์ค์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์๋ฏธํ๋ค.
DirectX 12์์ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค์ด์ GPU๊ฐ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ด ๋ฆฌ์์ค์ ๋ํ ๋ทฐ(View)๊ฐ ํ์ํ๋ค.
๋ฆฌ์์ค ๋ทฐ(ResourceView)๋ ๋ฆฌ์์ค๋ฅผ ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ๋ฅผ ์๋ฏธํ๋ค.
๋ฆฌ์์ค๋ ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ ์งํฉ์ด๋ค. (๋นํธ๋ค์ ๋ฉ์ด๋ฆฌ)
์ด ๋นํธ๋ค์ ์ ๋ณด๋ฅผ ์ด๋ค ๊ด์ ์์ ๋ฐ๋ผ๋ณผ ๊ฒ์ธ๊ฐ๋ฅผ ์ ์ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ง์ฝ ๋ทฐ(View)๋ฅผ ๋ค๋ฅด๊ฒ ํ๋ฉด ๋๊ฐ์ ๋ฐ์ดํฐ๋ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๋ทฐ(View)๋ ํจ๋ถ๋ก ๋ฐ๊ฟ์๋ ์ ๋๋ค.
๋ง๋ ์ฌ๋์ด ์ด๋ป๊ฒ ๋ง๋ค์๋์ง ๋ชจ๋ฅด๋๋ฐ, ๋ทฐ๋ฅผ ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ฉด ๋ ๋๋ง์ ์๊ณก์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํ ์ค์ฒ ๋ฆฌ์์ค๋ฅผ ์๋ก ๋ค์ด๋ณด์.
๊ทธ๋ฆผ์ ๋ด์ฉ์ GPU๊ฐ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๋์์๋ ํฝ์ ์ ๋ด์ฉ์ด ๋ฐ๋์ง ์๋๋ค.
๊ทธ๋์ ํ ์ค์ฒ ๋ฆฌ์์ค์ ๋ทฐ๋ READ_ONLY์ด๋ค. (D3D12_RESOURCE_STATE_GENERIC_READ)
์ฝ๊ธฐ ์ ์ฉ์ด๋ฏ๋ก, ๋ ๋๋ง์ ํ๋ ๋์ ํฝ์ ์ ๋ด์ฉ์ด ๋ฐ๋์ง ์์ ๊ฒ์ด๋ค.
์ด๋ฅผ WRITE ๋์์ผ๋ก ์จ๋ ์๊ด์ ์์ง๋ง, ๊ทธ๋ ๊ฒ ํ๋ ค๋ฉด READ_ONLY๋ผ๋ ๋ทฐ๊ฐ ๋ฐ๋์ด์ผ ํ๋ค.
READ_ONLY ์ํ ์ธ๋, WRITE๋ฅผ ํ๋ ค๊ณ ์๋ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ง๊ธ๊น์ง ๋ฆฌ์์ค ๋ทฐ(Resource View)์ ๋ํ ์ค๋ช ์ ์ข ํฉํด๋ณด๋ฉด,
๋ชจ๋ ๋ฆฌ์์ค๋ค์ ๋ํด์๋ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ์ชฝ์์
"์ด๋ป๊ฒ ์ด ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋"๋ฅผ ์ ํด์ค์ผ ํ๋ค. ์ด๋ฅผ ์ ์ํด๋์ ๊ฒ์ด ๋ฆฌ์์ค ๋ทฐ์ด๋ค.
DirectX 12์์ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ฆฌ์์ค๋ฅผ ์ง์ ๋๊ฒจ๋ฐ์ง ์๊ณ
"๋ฆฌ์์ค ๋ทฐ(Resoruce View)๋ง ๋๊ฒจ๋ฐ์์ ์ฌ์ฉํ๋ค."
๋ฐ๋ผ์ ๋ชจ๋ GraphicsCommandList์ ๋ฆฌ์์ค์ ๋ํ Setํจ์๋ค์ View๋ก ๋๋๋ค.
๋ทฐ(View)๋ง ๋๊ฒจ์ฃผ๋ฉด GPU๋ ์จ๊ฒจ์ ธ ์๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
๋ทฐ(View)๋ ๋ฆฌ์์ค๋ฅผ ์ฐพ์๊ฐ ์ ์๋ ์ ๋ณด(ํฌ์ธํฐ)๊ฐ ๋ดํฌ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌ์์ค ๋ทฐ(Resource View)์๋ ์ฌ๋ฌ ์ข ๋ฅ๋ค์ด ์๋ค.
์์ ๋ฒํผ ๋ทฐ, ๋ ๋ํ๊ฒ ๋ทฐ, ๊น์ด/์คํ ์ค ๋ทฐ.. ๋ฑ๋ฑ
- ์์ ๋ฒํผ ๋ทฐ(ConstantBufferView)๋ ์์ ๋ฒํผ์ด๋ฏ๋ก, GPU์์ ๊ฐ์ ๋ชป ๋ฐ๊พผ๋ค.
- ๋ฌด์์ํ ์ ๊ทผ ๋ทฐ(Unordered Access View)๋ GPU์์
์ด ๋ฒํผ์ ๋ด์ฉ์ ๋ฐ๊ฟ ์ ์๋ค๋ ์๋ฏธ๋ฅผ ๋ดํฌํ๊ณ ์๋ค.
(ํฝ์ ์ ฐ์ด๋, ๊ณ์ฐ ์ ฐ์ด๋์์ ์ด๋ค ๋ฒํผ์ ๋ด์ฉ์ ์์ด๋ ์ฝ๋๋ก ๋ฐ๊ฟ ์ ์๋ค.)
์ ๋ฆฌํด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๋์ ์ดํดํ์ผ ํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋ฆฌ์์ค(Resource)๋ ํ ์ค์ฒ(Texture)๋ ๋ฒํผ(Buffer) ๋ ๊ฐ์ง๋ก ๊ตฌ๋ถํ ์ ์๋ค.
2. ๋ทฐ(View)๋ CBV, UAV, SRV.. ๋ฑ๋ฑ ์ฉ๋์ ๋ฐ๋ผ ์ธ๋ถํ๋์ด์๋ค.
3. GPU๋ ํญ์ ๋ทฐ(View)๋ฅผ ํตํด์ ๊ฐ์ READ ํ๋ค. (์ค์!)
4. ๋ทฐ(View)๋ฅผ Set ํ๊ธฐ ์ํด์๋ ๋จผ์ ๋ฆฌ์์ค(Resource)๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
5. ๋ฆฌ์์ค๋ฅผ ๋ง๋ ํ์, ์ด ๋ฆฌ์์ค์ ๋ํ ๋ทฐ(View)๋ฅผ ๋ง๋ค์ด ์ค๋ค.
(๋ทฐ๋ฅผ Set ํ๋ ์๋ฏธ๋ ํ๋์ ์ ฐ์ด๋์ ๋ทฐ๋ฅผ ๋ฐ๊ฟ๊ฐ๋ฉฐ ๋๊ฒจ์ค๋ ๋๋ค๋ ๊ฒ์ ์๋ฏธ)
[ ๋ฆฌ์์ค ์์ฑ (Create Resource) ]
Direct3D๊ฐ ์ ๊ณตํ๋ ๋ฆฌ์์ค๋ ํฌ๊ฒ 3๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
1. ์ปค๋ฐ ๋ฆฌ์์ค (Committed Resource)
- ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๊ณผ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ชจ๋ ์์ฑ.
- Direct3D 12์์ ํ(HEAP)์ ํ ๋นํ ๋ ์ปค๋ฐ ๋ฆฌ์์ค์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑํจ.
2. ์์น ๋ฆฌ์์ค (Placed Resource)
- ํ(HEAP)์ ์ด๋ค ์์ญ์ ๋ํ ํฌ์ธํฐ(๊ฒน์น ์ ์๋ ๋ฌธ์ ๊ฐ ์์ ์ ์์)
3. ์์ฝ ๋ฆฌ์์ค (Reserved Resource)
- ์์ฒด์ ์ธ GPU ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ง.
- ๋์ค์ ๊ฐ์ ํ์ด์ง๋ฅผ ํ(HEAP)์ ์ด๋ค ์์ญ์ผ๋ก ๋งคํํ ์ ์์.
- ๋ชจ๋ Direct3D 12 ํ๋์จ์ด์์ ์ ๊ณต๋์ง๋ ์์.
Direct3D๋ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค ๋ ์๋์ฐ ์ด์์ฒด์ ์ "๊ฐ์ ๋ฉ๋ชจ๋ฆฌ"๋ฅผ ์ฌ์ฉํ๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ์ค์ ๋ก๋ ์๋ ๋ฉ๋ชจ๋ฆฌ์ง๋ง, ์๋ ๋ฉ๋ชจ๋ฆฌ์ฒ๋ผ ํด์ฃผ๋ ๊ฒ์ด๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฅ์ ์ RAM ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ด๋ค.
๋ฌผ๋ฆฌ์ ์ผ๋ก ์กด์ฌํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ค์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํด์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก๊ทธ๋จ๋ค์ด ๋์๊ฐ ๋,
๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋๋ผ๋ ํ๋ ๋์คํฌ ๋ฑ์ ์ฌ์ฉํด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฌดํ์ ์๋ ๊ฒ์ฒ๋ผ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
(๋๋ถ๋ถ ์ด์์ฒด์ ๋ค์ด ์ด๋ฅผ ์ง์. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ํ๋ ์ด์์ฒด์ ๋ ๋์ ํ ๋น์ด ์คํจํ ์ผ์ด ์์.)
GPU์ ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ๋ CPU ๋ฉ๋ชจ๋ฆฌ์ ๋น๊ตํ๋ฉด ๊ต์ฅํ ๋น์ฉ์ด ๋น์ธ๊ณ ํจ์ฌ ๋น ๋ฅด๋ค.
๊ทธ๋์ GPU ์ชฝ์์๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์กด์ฌํ๋ ๋ฉ๋ชจ๋ฆฌ ์ด์์ ์ธ ์ ์๋๋ก ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ณตํด์ค๋ค.
์ปค๋ฐ ๋ฆฌ์์ค(Committed Resource)๋ ID3D12Device์ CreateCommittedResource()๋ฅผ ํตํด ์์ฑ ๊ฐ๋ฅํ๋ค.
DirectX 12์์ ๋ชจ๋ ๋ฆฌ์์ค๋ ID3D12Resource COM ๊ฐ์ฒด์ ๋ง๋ค์ด์ง๋ค.
๋ฐํ๋๋ ์ธํฐํ์ด์ค ํฌ์ธํฐ ์ฃผ์๋ ๋ฌผ๋ฆฌ์ ์ธ ์ฃผ์๊ฐ ์๋๋ผ, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ(Virtual Address) ์ฃผ์์ด๋ค.
(์ปค๋ฐ ๋ฆฌ์์ค, ์์น ๋ฆฌ์์ค, ์์ฝ ๋ฆฌ์์ค์ ๋ฐํ๋๋ ๋ฆฌ์์ค๋ ์ ๋ถ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์์ด๋ค.)
๊ทธ๋ฐ๋ฐ, CreateCommittedResource()๋ฅผ ํตํด์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ฉด
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์๋ค๊ฐ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ ๊ฒ๊ณผ ๋๋ถ์ด์
๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ์๋ค๊ฐ๋ ์ด ๋ฆฌ์์ค ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋งคํ(Mapping)๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ ๋นํ๋ค.
์ฆ, ์ปค๋ฐ ๋ฆฌ์์ค๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ + ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ๋ ๋ค ์์ฑํ๋ ๋ฆฌ์์ค์ด๋ค. (1:1๋ก ๋์)
(๋์ค์ ๋ฆฌ์์ค๊ฐ ๋ง์์ง๊ฒ ๋๋ฉด ๊ทธ๋ํฝ์นด๋ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ ์์)
ํน์๋ผ๋ ๊ทธ๋ํฝ์นด๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฑฑ์ ๋๋ค๋ฉด PlacedResource๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
PlacedResource๋ ๋ฆฌ์์ค๋ฅผ ์์ฑํ ๋ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง์ง ์๋๋ค.
๊ทธ๋ ์ง๋ง PlacedResource๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด HEAP ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฐ๋์ ํ ๋นํด์ผ ํ๋ค.
(๋ฆฌ์์ค์ ๋งคํ(Mapping) ์์ญ์ ์ง์ ํด์ค์ผ ํ๋ค)
๋ ๋ฌผ๋ฆฌ์ ์ธ ๊ณต๊ฐ์ ๋ ๊ฐ์ ๋ฆฌ์์ค๊ฐ ๊ฒน์ณ์ ๋งคํ(Mapping)๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
๋์์ ์ผ์ด๋์ง๋ง ์์ผ๋ฉด ๋ฌธ์ ์์ด ์ ์ฌ์ฉ๋ ์ ์๋ค.
์ ๋ฆฌํ๋ฉด
์ปค๋ฐ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ, ์ฆ HEAP ๊ณต๊ฐ์ด ์๋์ผ๋ก ํ ๋น ํ์ง๋ง
์์น ๋ฆฌ์์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด HEAP์์ญ์ ๋ฐ๋ก ๋ง๋ค์ด์ ์ฌ์ฉํด์ผ ํ๋ค.
๋๋ถ๋ถ DirectX 12 ์ํ ์์ ์ ๋ฃจ๋ ์ฑ ์์๋ ์ปค๋ฐ ๋ฆฌ์์ค๋ง ์จ์ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.
(๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์์ ํ ๋นํด์ค์ ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ)
์ปค๋ฐ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์ ํจ์๋ค์ ์ธ์๋ค์ ์ค์ ํด์ผ ํ๋ค.
1. D3D12_HEAP_PROPERTIES
์ปค๋ฐ ๋ฆฌ์์ค๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ(HEAP)๋ฅผ ๋์์ ๋ง๋ค์ด ์ฃผ๊ธฐ ๋๋ฌธ์
HEAP์์ญ์ ์์ฑ์ ์ค์ ํด์ค์ผ ํ๋ค.
Type์ ํ(HEAP)์ ์ ํ์ ์๋ฏธํ๋ค. DEFAULT, UPLOAD, READBACK, CUSTOM์ด ์๋ค.
D3D12_HEAP_TYPE_DEFAULT๋ GPU๋ ์ฝ๊ณ ์ฐ๊ธฐ ๊ฐ๋ฅํ๊ณ , CPU๋ ์ ๊ทผํ ์ ์๋ ํ์ ์ด๋ค.
๋๋ถ๋ถ์ ๋ฆฌ์์ค๋ฅผ DEFAULTํ์ ์ ํ์ผ๋ก ๋ง๋ ๋ค.
D3D12_HEAP_TYPE_UPLOAD๋ CPU์ ๊ทธ๋ฆผ์ด๋ ํ๋ ฌ ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ GPU๊ฐ WRITE ํ ์ ์๋ ํ์ ์ด๋ค.
์ฆ, GPU์ ์ ๋ก๋๋ฅผ ์ํ CPU ์ ๊ทผ์ ์ต์ ํ๋ ํ์ ์ด๋ค.
D3D12_HEAP_TYPE_READBACK์ CPU๊ฐ ์ฝ์ด๊ฐ๊ธฐ ์ํ ํ(HEAP) ์ ํ์ด๋ค.
(D3D12_HEAP_TYPE_CUSTOM์ ์ ์ฐ์ด์ง ์์)
D3D12_CPU_PAGE_PROPERTY๋ ํ์ ๋ํ CPU-ํ์ด์ง ์์ฑ์ ๋ํ๋ธ๋ค.
๋ณ ๋ค๋ฅธ ์์ฑ ์์ด D3D12_CPU_PAGE_PROPERTY_UNKNOWN์ ์ค์ ํ๋ค.
D3D12_MEMORY_POOL์ ํ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํ(Pool)์ ๋ํ๋ธ๋ค.
๋ณ ๋ค๋ฅธ ์์ฑ ์์ด D3D12_MEMORY_POOL_UNKNOWN์ ์ฌ์ฉํ๋ค.
CreationNodeMask๋ ๋จ์ผ GPU ์ด๋ํฐ์ ๋ํด์๋ 1์ ์ฌ์ฉํ๋ค.
VisibleNodeMask๋ ๋ค์ค ์ด๋ํฐ์์ ๋ฆฌ์์ค๋ฅผ ๋ณผ ์ ์๋ ํ ๋์ ์งํฉ์ ๋ํ๋ด๋ ๋นํธ์ด๋ค.
๋จ์ผ GPU ์ด๋ํฐ์ ๋ํด์๋ 1์ ์ฌ์ฉํ๋ค.
2. D3D12_HEAP_FLAGS
ํน๋ณํ ํ๋๊ทธ๊ฐ ์๋ค๋ฉด D3D12_HEAP_FLAG_NONE๋ฅผ ์ฌ์ฉํ๋ค. (์ฃผ๋ก NONE์ ์ฌ์ฉ)
3. D3D12_RESOURCE_DESC
D3D12_RESOURCE_DESC๋ ์์ฑํ๋ ค๋ ๋ฆฌ์์ค๋ฅผ ์ค๋ช ํ๋ ๊ตฌ์กฐ์ฒด์ด๋ค. (๋ฆฌ์์ค๋ ํ ์ค์ฒ or ๋ฒํผ)
D3D12_RESOURCE_DIMENSION์ ๋ฆฌ์์ค์ ์์ฑ์ ์ค์ ํ๋ ๊ตฌ์กฐ์ฒด์ด๋ค.
์ฃผ๋ก BUFFER๋ TEXTURE2D๋ฅผ ์ฌ์ฉํ๋ค.
Alignment๋ ๋ชจ๋ ๊ทธ๋ํฝ์ ์ธ ์ด๋ฏธ์ง ํน์ ๋ฒํผ๋ฅผ GPU๊ฐ ์ฌ์ฉํ ๋ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก
๋ฆฌ์์ค์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ค์ด ์ ๋ ฌ๋์ด์ ๋ง๋ค์ด์ง ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ์ค์ด๋ค.
4KB, 64KB, 4MB ๋ฑ๋ฑ ๊ทธ๋ํฝ์นด๋๋ง๋ค ๋ค ๋ค๋ฅด๋ค.
0์ ์ฐ๋ฉด Default๋ก ์์์ Alignment๋ฅผ ์ ํด์ค๋ค. (64KB)
Width์ Height๋ ๊ฐ๋ก, ์ธ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ค.
DepthOrArraySize๋ ๊น์ด(Z) ํน์ ๋ฐฐ์ด์ด๋ผ๋ฉด ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ค์ ํด์ฃผ๋ ๊ฐ์ด๋ค.
MipLevels์ ๋ฐ๋งต ์์ค์ ์ค์ ํ๋ ๊ฐ์ด๋ค. 0์ ํ๋ฉด ์๋์ผ๋ก ๊ณ์ฐํด์ค๋ค.
DXGI_FORMAT์ ๋ฆฌ์์ค์ ํ์์ ์ค์ ํ๋ ๊ฐ์ด๋ค.
์ํ๋ ๊ฐ์ ์ฐพ์์ ์ฌ์ฉํ๊ฑฐ๋, DXGI_FORMAT_UNKNOWN๋ฅผ ์ค์ ํ๋ค.
DXGI_SAMPLE_DESC๋ ๋ค์ค ์ํ๋ง์ ์ค์ ํ๋ ๊ฐ์ด๋ค.
D3D12_TEXTURE_LAYOUT๋ ๋ฆฌ์์ค์ ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ์ ํํ๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ํ ์ง ๊ฒฐ์ ํ๋ ๊ฐ์ด๋ค.
1์ฐจ์ ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ ํํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด D3D12_TEXTURE_LAYOUT_ROW_MAJOR๋ฅผ ์ค์ ํด์ค๋ค.
(D3D12_TEXTURE_LAYOUT_ROW_MAJOR๋ ์ด ์ฐ์ ์ ์๋ฏธ)
D3D12_RESOURCE_FLAGS๋ ํน๋ณํ ๊ธฐ๋ฅ์ด ์๋ค๋ฉด D3D12_RESOURCE_FLAG_NONE์ ์ค์ ํ๋ค.
4. D3D12_RESOURCE_STATES
๋ฆฌ์์ค๊ฐ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ฅธ ๋ฆฌ์์ค์ ์ด๊ธฐ ์ํ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ด๋ค.
๋ฆฌ์์ค๊ฐ ๊ฐ์ง ์ ์๋ ์ํ๋ค์ ์ฌ๋ฌ ์ข ๋ฅ๋ค์ด ์๋ค.
๋ฆฌ์์ค๊ฐ ์ด๋ค ๋ช ๋ น์ ์คํํ๊ธฐ ์ํด์๋ ํน์ ํ ์ํ์ ์์ ๋ ๊ฐ๋ฅํ๋ค.
๋ชจ๋ ๋ฆฌ์์ค๋ค์ ์ด๋ ํ์๊ฐ์ ํ๋์ STATE๋ฅผ ๊ผญ ๊ฐ์ง๋๋ก ๋์ด์๋ค.
ํ๋์ ๋ฆฌ์์ค์ ๋ ๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ๊ณ ์์ผ๋ฉด ๋๊ธฐํ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
๋ฆฌ์์ค๋ผ๋ ๋จ์ด ์์ฒด๋ ๊ธฐ๋ณธ์ ์ผ๋ก READ_ONLY์ ์๋ฏธ๋ฅผ ๋ดํฌํ๊ณ ์๋ค.
GPU ์ ์ฅ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ์์ค์ ๋ด์ฉ์ด ๋ฐ๋์ง ์๋๋ค.
CPU ์ ์ฅ์์ ๋ฆฌ์์ค๋ WRITE์ ๋์์ด๋ค.(๋ฉ์ฌ, ํ ์ค์ณ ๋ฑ๋ฑ)
๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ง๋ ๊ฐ๋ ์ด RESOURCE_STATE์ด๋ค.
DirectX 11์์๋ ๊ทธ๋ํฝ์นด๋ ๋๋ผ์ด๋ฒ์์ ์์์ ๋ด๋ถ์ ์ธ ์ํ๋ฅผ ๊ด๋ฆฌํด์คฌ๋ค.
๋ฐ๋ผ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ฑด๋ค ์ ์์ด์ ๋๋ผ์ด๋ฒ ์ฑ๋ฅ์ ๋ฐ๋ผ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋ฌ๋ค.
DirectX 12์์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๊ด๋ฆฌํด์ค์ผ ํ๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ๋ฆฌ์์ค๋ค์ ์ด๋ค ์ํ๋ค์ ์ ์งํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
Vertex/Index ๋ฒํผ์ ๋ํด์๋ ์ฃผ๋ก D3D12_RESOURCE_STATE_COMMON์ ์ฌ์ฉํ๋ค.
Depth/Stencil ๋ฒํผ๋ฅผ ๋ง๋ค ๊ฒ์ด๋ผ๋ฉด D3D12_RESOURCE_STATE_DEPTH_WRITE๋ฅผ ์ค์ ํ๋ค.
5. D3D12_CLEAR_VALUE
D3D12_CLEAR_VALUE๋ ๋ฆฌ์์ค๋ฅผ ์ด๋ค ๊ฐ์ผ๋ก ์ด๊ธฐํํ ๊ฒ์ธ์ง ์ค์ ํ๋ ๊ฐ์ด๋ค.
์ฃผ๋ก ๋ ๋ํ๊ฒ๊ณผ ๊น์ด/์คํ ์ค ๋ฒํผ ๋ฆฌ์์ค์ ๋ํด ์ด ๊ฐ์ ์ค์ ํด์ค๋ค.
๋ฐ๋ก ์ค์ ํ์ง ์์ ๊ฒ์ด๋ฉด nullptr์ ์ค์ ํ๋ค.
6. REFIID riidResource, _COM_Outptr_opt_ void **ppvResource
์ค์ ํ ๊ฐ์ผ๋ก ๋ฆฌ์์ค๊ฐ ์์ฑ๋๊ณ ๋๋ฉด, ๋ฐํ๋๋ ์ธํฐํ์ด์ค ํฌ์ธํฐ ๊ฐ์ด๋ค.
[ ์์ ์ ํ (Descriptor Heap) ]
์์์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํญ์ ๋ทฐ(View)๋ฅผ ํตํด์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์ค๋ช ํ๋ค.
DirectX 12์์ ์ค์ ๋ก ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์ ์(Descriptor) ๋๋ ๋ทฐ(View)๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
๋ค์ ํ๋ฒ ์ค๋ช ํ์๋ฉด ๋ฆฌ์์ค๋ฅผ ์ค๋ช ํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ๊ฐ ์๋๋ฐ, ์ด๊ฒ๋ค์ ๋ทฐ(View)๋ผ ํ๋ค.
๋ฆฌ์์ค๋ ๋ทฐ(View)๋ฅผ ํตํด์๋ง GPU์์ ์ค์ง์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
ํญ์ ๋ชจ๋ ๋ฆฌ์์ค๋ค์ ๋ํด Set ํ๋ ๋์์ ๋ทฐ(View)์ด๋ค.
์ด ๋ทฐ(View)๋ฅผ Set ํ๊ธฐ ์ํด ํ์ํ ๊ฒ์ด ๋ฐ๋ก ์์ ์(Descriptor)์ด๋ค.
์ฆ, ์์ ์(Descriptor)๋ ๋ฆฌ์์ค๋ฅผ ์ ฐ์ด๋ ํน์ GPU๊ฐ ์ฌ์ฉํ๊ธฐ ์ํ ์ฐ๊ฒฐ์ฒด์ด๋ค.
๋ฆฌ์์ค์ ๋ํ ์ ๋ณด๋ CreateCommittedResource()๋ฅผ ํตํด ์ค์ ํ๊ณ ์์ฑ๋๋ค.
๋ฆฌ์์ค๋ค์ ๊ถ๊ทน์ ์ผ๋ก ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค์ด์ง๋ ์ด๋ค ๋ฉ๋ชจ๋ฆฌ(ํฌ์ธํฐ)์ด๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ์์ง์ผ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ์ด๋ค. ์ฆ, ์ฃผ์๊ฐ ๋ฐ๋ ์ ์์์ ๋ดํฌํ๋ค.
๊ทธ๋์ ์ด๋ฐ ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ๋ฅผ CPU๋ GPU์ ์ง์ ๋งก๊ฒจ์ฃผ๋ฉด ์ ๋๋ค.
(๋ฌผ๋ฆฌ์ ์ธ ์์น๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ จ๋ ์ ๋ณด(ํฌ์ธํฐ)๋ฅผ ์ง์ ๋๊ฒจ์ฃผ๋ฉด ์ ๋จ)
์ด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ค๊ฐ ๋งค๊ฐ์ฒด๊ฐ ๋ฐ๋ก ์์ ์(Descriptor)์ด๋ค.
์ฆ, ๋ฆฌ์์ค ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํฌ์ธํฐ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ๋งค๊ฐ์ฒด์ด๋ค.
์์ ์(Descriptor)๋ ๊ฐ์ ํ ์ด๋ธ ์ฃผ์ ํน์ ์ธ๋ฑ์ค๋ฅผ ์ฐ๋ฆฌ์๊ฒ ๋๊ฒจ์ฃผ๊ณ ,
์ฐ๋ฆฌ๊ฐ ํ์ํ ๋ฆฌ์์ค์ ์์น๋ฅผ ์๋ ค์ค๋ค.
ํฌ์ธํฐ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด ๋ฆฌ์์ค์ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ค์ด์๋ ๊ตฌ์กฐ์ฒด๊ฐ ์๊ณ , ๋ฆฌ์์ค์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
DirectX๋ ๋ชจ๋ ์์ ์(Descriptor)๋ค์ ๋ํด์ ํ ์ด๋ธ์ ๋ง๋ ๋ค.
์ด ํ ์ด๋ธ ํ๋ฅผ ์์ ์ ํ(Descriptor Heap)์ด๋ผ๋ ๋ฐฐ์ด์ด๋ผ ํ๋ค.
์ด ๋ฐฐ์ด์ ๋ฆฌ์์ค ๋ทฐ(Resource View)๋ค์ ์ฑ์ ๋ฃ๋๋ค.
์ฆ, ์์ ์(Descriptor)๋ ๋ฆฌ์์ค๋ฅผ ์ค๋ช ํ๋ ์๋ฃ๊ตฌ์กฐ์ด๊ณ ,
์์ ์๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ฆฌ์์ค ๋ทฐ๋ค์ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฐ์ด(๋ฉ๋ชจ๋ฆฌ)์ด ํ์ํ๋ค.
์์ ์ ํ(Descriptor Heap) :
- ์์ ์๋ค์ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฐ์ด(๋ฉ๋ชจ๋ฆฌ ๋ฉ์ด๋ฆฌ).
- ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค์ด์ง๋ ์ ๋ณด.
- ํ ๊ฐ๊ฐ์๋ ์์ ์(Descriptor)๋ค์ด ์ ์ฅ๋จ.
์์ ์ ํ(Descriptor)์ ID3D12DescriptorHeap* ๋ฅผ ์ ์ธํ๊ณ ,
ID3D12Device์ CreateDescriptorHeap() ํจ์๋ฅผ ํตํด ๋ง๋ค ์ ์๋ค.
์์ ์ ํ์ ๋ง๋ค๊ธฐ ์ํด์๋ D3D12_DESCRIPTOR_HEAP_DESC ๊ตฌ์กฐ์ฒด ์ ๋ณด๋ฅผ ์ค์ ํด์ผ ํ๋ค.์ด ๊ตฌ์กฐ์ฒด๋ ์์ ์ ํ์ ์ฑ์ง์ ์ค์ ํ๋ ๊ตฌ์กฐ์ฒด์ด๋ค.
1. D3D12_DESCRIPTOR_HEAP_TYPE
TYPE์ 4๊ฐ์ง๊ฐ ์๋ค. ๋ง๋ค๊ณ ์ ํ๋ ๋ฆฌ์์ค ๋ทฐ์ ํ์ ์ ๋ฐ๋ผ ์๋ง๊ฒ ์ค์ ํด์ค๋ค.
2. NumDescriptors
์์ ์์ ๊ฐ์์ด๋ค.
์ฆ, ๋ฐฐ์ด ์์์ ๊ฐ์๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค.
3. D3D12_DESCRIPTOR_HEAP_FLAGS
์์ ์ ํ์ FLAG๋ฅผ ์ค์ ํ๋ ๊ฐ์ด๋ค.
์ ฐ์ด๋์์ ์์ ์ ํ์ ์ฝ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ํ๋๋ก
์ฃผ๋ก D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE๋ฅผ ์ฌ์ฉํ๋ค.
4. NodeMask๋ ๋จ์ผ GPU ์ด๋ํฐ์ ๋ํด์๋ 1์ ์ฌ์ฉํ๋ค.
ID3D12DescriptorHeap์ ์์ ์ ์์์ ์ ๊ทผํ๊ธฐ ์ํด 3๊ฐ์ง ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
- GetCPUDescriptorHandleForHeapStart()
๋ฆฌ์์ค์ ๋ํ ๋ทฐ๋ฅผ ๋ง๋ค๊ณ , ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- GetGPUDescriptorHandleForHeapStart()
๋ฆฌ์์ค ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ค๊ณ ํ ๋, ์์ ์ฃผ์๊ฐ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก GPUStart๊ฐ ๋ฐ๋ก ์๋ค.
- GetDescriptorHandleIncrementSize()
์์ ์ ๋ฐฐ์ด ์์ ํฌ๊ธฐ๋ฅผ ๋ฐํํด์ค๋ค.
์์ ์ ํ์ n๋ฒ์งธ ์์์ ์ ๊ทผํ๊ณ ์ถ๋ค๋ฉด HandleStart + IncrementSize * n์ ํตํด ์ ๊ทผํ๋ฉด ๋๋ค.
'PROGRAMMING > DirectX 12' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DirectX 12 ๋ทฐ ํฌํธ(Viewprot)์ ์์ ์ฌ๊ฐํ(ScissorRect) (0) | 2020.07.28 |
---|---|
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (5) - part 2 (0) | 2020.07.27 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (4) (0) | 2020.07.16 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (3) (1) | 2020.07.15 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (2) (2) | 2020.07.14 |