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

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)์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ข…ํ•ฉํ•ด๋ณด๋ฉด,

๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ

"์–ด๋–ป๊ฒŒ ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ƒ"๋ฅผ ์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์ •์˜ํ•ด๋†“์€ ๊ฒƒ์ด ๋ฆฌ์†Œ์Šค ๋ทฐ์ด๋‹ค.

 

Set Vertex/Index BufferView

DirectX 12์—์„œ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง์ ‘ ๋„˜๊ฒจ๋ฐ›์ง€ ์•Š๊ณ 

"๋ฆฌ์†Œ์Šค ๋ทฐ(Resoruce View)๋งŒ ๋„˜๊ฒจ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค."

๋”ฐ๋ผ์„œ ๋ชจ๋“  GraphicsCommandList์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ Setํ•จ์ˆ˜๋“ค์€ View๋กœ ๋๋‚œ๋‹ค.

๋ทฐ(View)๋งŒ ๋„˜๊ฒจ์ฃผ๋ฉด GPU๋Š” ์ˆจ๊ฒจ์ ธ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋ทฐ(View)๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด(ํฌ์ธํ„ฐ)๊ฐ€ ๋‚ดํฌ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋ฆฌ์†Œ์Šค ๋ทฐ(Resource 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 ์ƒ˜ํ”Œ ์˜ˆ์ œ์™€ ๋ฃจ๋‚˜ ์ฑ…์—์„œ๋Š” ์ปค๋ฐ‹ ๋ฆฌ์†Œ์Šค๋งŒ ์จ์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.

(๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์‹œ์— ํ• ๋‹นํ•ด์ค˜์„œ ํŽธ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ)

 

CreateCommittedResource

์ปค๋ฐ‹ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„ ํ•จ์ˆ˜๋“ค์˜ ์ธ์ž๋“ค์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

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์„ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค.