DirectX 12 ๋ฃจํŠธ ์„œ๋ช…(Root Signature)๊ณผ ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ(Pipeline State)

2020. 8. 1. 17:19ใ†PROGRAMMING/DirectX 12

 

 

 

 

[ ๋ฃจํŠธ ์„œ๋ช…(Root Signature) ]

 

๋ฃจํŠธ ์„œ๋ช…(Root Signature)๋ž€ ์–ด๋–ค ๋ฆฌ์†Œ์Šค(๋ฐ์ดํ„ฐ)๋“ค์ด ๊ทธ๋ž˜ํ”ฝ์Šค ํŒŒ์ดํ”„๋ผ์ธ์˜ ์…ฐ์ด๋”์—

์—ฐ๊ฒฐ๋˜๋Š” ๊ฐ€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, ๋‹จ์–ด ๊ทธ๋Œ€๋กœ ์ž‘์„ฑํ•œ ์…ฐ์ด๋”๋ฅผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์•Œ๋งž๊ฒŒ ์ž‘์„ฑํ–ˆ๋Š”๊ฐ€์— ๋Œ€ํ•ด

ํ™•์ธํ•˜๊ณ  ์‹ธ์ธ์„ ๋ฐ›๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฃจํŠธ ์„œ๋ช…(Root Siganture)์€ ๋ฐ˜๋“œ์‹œ ๊ทธ๋ฆฌ๊ธฐ ํ˜ธ์ถœ์— ์“ฐ์ด๋Š” ์…ฐ์ด๋”๋“ค๊ณผ

ํ˜ธํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค.

(๊ทธ๋ฆฌ๊ธฐ ํ˜ธ์ถœ ์ „์— ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์— ๋ฌถ์˜€๋‹ค๊ณ  ๊ธฐ๋Œ€๋˜๋Š” ๋ชจ๋“  ์ž์›์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค)

๋ Œ๋”๋ง ํ˜ธ์ถœ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,

๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋ฃจํŠธ ์„œ๋ช…(Root Signature)๋„ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค.

 

Direct3D์—์„œ ๋ฃจํŠธ ์„œ๋ช…(Root Signature)์„ ๋Œ€ํ‘œํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š”

ID3D12RootSignature ์ด๋‹ค.

๋ฃจํŠธ ์„œ๋ช…(Root Signature)์€ ๊ทธ๋ฆฌ๊ธฐ ํ˜ธ์ถœ์—์„œ ์…ฐ์ด๋”๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์ž์›๋“ค์„

์„œ์ˆ ํ•˜๋Š” ๋ฃจํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์˜ ๋ฐฐ์—ด๋กœ ์ •์˜๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์…ฐ์ด๋”๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์ž์›๋“ค์ด๋ž€ ์ƒ์ˆ˜ ๋ฒ„ํผ, ํ…์Šค์ฒ˜, ํ…์Šค์ฒ˜ ์ƒ˜ํ”Œ๋Ÿฌ๋“ค์„ ๋งํ•œ๋‹ค.

์ƒ์ˆ˜ ๋ฒ„ํผ์˜ ๋ ˆ์ง€์Šคํ„ฐ ๋ฒˆํ˜ธ๋Š” b, ํ…์Šค์ฒ˜๋Š” t, ์ƒ˜ํ”Œ๋Ÿฌ๋Š” s๋กœ ์„ค์ •ํ•œ๋‹ค.

 

 

๊ฐ„๋‹จํ•œ ColorShader์˜ ๋ฃจํŠธ ์„œ๋ช…(Root Signature)์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ๋‹ค.

ColorShader๋Š” 2๊ฐœ์˜ ์ƒ์ˆ˜ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

์ด ์ •๋ณด๋“ค์„ D3D12_ROOT_SIGNATURE_DESC ๊ตฌ์กฐ์ฒด์— ๋ฌถ์–ด์ค˜์•ผ ํ•œ๋‹ค.

 

GPU๋Š” ๋ฆฌ์†Œ์Šค(๋ฒ„ํผ ํ˜น์€ ํ…์Šค์ฒ˜)๋ฅผ ํ•ญ์ƒ ๋ทฐ(View)๋ฅผ ํ†ตํ•ด ์ฐธ์กฐํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ ColorShader๋Š” 2๊ฐœ์˜ ์ƒ์ˆ˜ ๋ฒ„ํผ ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์„ค์ •ํ•ด์ค€๋‹ค.

์ธ์ž๋กœ ๋“ค์–ด๊ฐ€๋Š” ์ˆซ์ž๋Š” ๋ ˆ์ง€์Šคํ„ฐ ๋ฒˆํ˜ธ์ด๋‹ค.

 

๋ฃจํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด D3D12_ROOT_SIGNATURE_DESC ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฃจํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

์„ธ ๋ฒˆ์งธ์™€ ๋„ค ๋ฒˆ์งธ ์ธ์ž๋Š” ๊ฐ๊ฐ ์ƒ˜ํ”Œ๋Ÿฌ์˜ ๊ฐœ์ˆ˜์™€ ์ƒ˜ํ”Œ๋Ÿฌ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์ฃผ์†Œ์ด๋‹ค.

ColorShader๋Š” ํ…์Šค์ฒ˜์™€ ์ƒ˜ํ”Œ๋Ÿฌ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ฐ๊ฐ 0๊ณผ nullptr์„ ์„ค์ •ํ•œ๋‹ค.

 

์•Œ๋งž๊ฒŒ D3D12_ROOT_PARAMETER ๊ตฌ์กฐ์ฒด์™€

D3D12_ROOT_SIGNATURE_DESC ๊ตฌ์กฐ์ฒด๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด 

๋””๋ฐ”์ด์Šค์˜ CreateRootSignature() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฃจํŠธ ์„œ๋ช…(RootSignature)์ด ์ƒ์„ฑ๋  ๊ฒƒ์ด๋‹ค.

 

 

 

 

[ ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ(Pipeline State) ]

 

ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ(Pipeline State)๋ž€ ๋ง ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด(Object)๋ฅผ

๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ๊ทธ๋ฆด ๋•Œ ์–ด๋– ํ•œ ์ƒํƒœ๋กœ ๊ทธ๋ฆด ๊ฒƒ์ธ๊ฐ€๋ฅผ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

DirectX 9 Shader Program

DirectX 9์˜ ์…ฐ์ด๋”์—์„œ pass์˜ ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ๊นŠ์ด ๊ฐ’์„ WRITE ํ•  ๊ฒƒ์ธ๊ฐ€?

์•ŒํŒŒ ๋ธ”๋žœ๋”ฉ์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€?

์•ŒํŒŒ ๋ธ”๋žœ๋”ฉ์„ ํ•œ๋‹ค๋ฉด ์–ด๋–ค ์˜ต์…˜์œผ๋กœ ๋ธ”๋žœ๋”ฉ ํ•  ๊ฒƒ์ธ๊ฐ€?

์…ฐ์ด๋” ์ปดํŒŒ์ผ ๋ฒ„์ „์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€?

 

์œ„์˜ ์„ค์ •๋“ค์„ DirectX 12๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ(Pipeline State) COM ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•œ๋‹ค.

ID3D12PipelineState ๊ฐ€ ๋Œ€ํ‘œ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ ,

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

ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” D3D12_GRAPHICS_PIPELINE_STATE_DESC ๊ตฌ์กฐ์ฒด

์ •๋ณด๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

D3D12_GRAPHICS_PIPELINE_STATE_DESC 

1. D3D12_GRAPHICS_PIPELINE_STATE_DESC - pRootSignature

์‚ฌ์šฉํ•  ์…ฐ์ด๋”์˜ ๋ฃจํŠธ ์„œ๋ช…์„ ์„ค์ •ํ•ด์ค€๋‹ค.

 

2. D3D12_GRAPHICS_PIPELINE_STATE_DESC - PrimitiveTopologyType

์ •์ ๋“ค์„ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•ด์ค€๋‹ค.

 

3. D3D12_GRAPHICS_PIPELINE_STATE_DESC - NumRenderTargets

๋ช‡ ๊ฐœ์˜ ๋ Œ๋”ํƒ€๊ฒŸ์„ ๊ทธ๋ฆด ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•ด์ค€๋‹ค.

DirectX 12๋Š” ๋™์‹œ์— 8๊ฐœ์˜ ํƒ€๊ฒŸ์— ์žฅ๋ฉด์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

4. D3D12_GRAPHICS_PIPELINE_STATE_DESC - RTVFormats[0]

๋ Œ๋”ํƒ€๊ฒŸ์˜ ํฌ๋งท์„ ์„ค์ •ํ•ด์ค€๋‹ค.

๋งŒ์•ฝ ๋™์‹œ์— 4๊ฐœ์˜ ํƒ€๊ฒŸ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฐ๊ฐ [1], [2], [3]์— ๋Œ€ํ•ด์„œ๋„

์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

5. D3D12_GRAPHICS_PIPELINE_STATE_DESC - InputLayout

์‚ฌ์šฉํ•  ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•œ ํ›„, VertexShader์˜ Input์œผ๋กœ ๋“ค์–ด๊ฐˆ

๊ตฌ์กฐ์ฒด ์ •๋ณด๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

 

6. D3D12_GRAPHICS_PIPELINE_STATE_DESC - VS, PS

InputLayout์„ ์„ค์ •ํ•˜๋ฉด์„œ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•  ๋•Œ ์ƒ์„ฑ๋œ

VertexShader์™€ PixelShader์˜ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

 

7. D3D12_GRAPHICS_PIPELINE_STATE_DESC - BlendState

๋ธ”๋žœ๋”ฉ์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ์ง€, ๋ธ”๋žœ๋”ฉ ์˜ต์…˜์„ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•ด์ค€๋‹ค.

 

8. D3D12_GRAPHICS_PIPELINE_STATE_DESC - DepthStencilState

๊นŠ์ด/์Šคํ…์‹ค์— ๋Œ€ํ•œ ์„ค์ •์„ ํ•ด์ค€๋‹ค.

๋ณดํ†ต ๊นŠ์ด ๊ฐ’์„ WRITE ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋งŒ ์„ค์ •ํ•ด์ค€๋‹ค.

๊ธฐ๋ณธ์€ DepthEnable์€ true์ด๋‹ค.

 

9. D3D12_GRAPHICS_PIPELINE_STATE_DESC - RasterizerState

๋ ˆ์Šคํ„ฐ๋ผ์ด์ €๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

๋ณดํ†ต D3D12_FILL_MODE์™€ D3D12_CULL_MODE์— ๋Œ€ํ•œ ์„ค์ • ๋ง๊ณ ๋Š”

ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ผ์ด ๋งŽ์ด ์—†๋‹ค.

 

 

ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ(Pipeline Stae)๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์œ„์˜ ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ๋Š” Color ๋ฒ„ํผ๋ฅผ D3D12_FILL_MODE_SOLID๋กœ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ 

ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ์ด๋‹ค. ์ด๋ฅผ WIREFRAME์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด?

๋ ˆ์Šคํ„ฐ๋ผ์ด์ € ์ƒํƒœ์—์„œ FILL_MODE๋ฅผ WIREFRAME์œผ๋กœ ์„ค์ •ํ•œ ํ›„ 

ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์ค€ ํ›„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ(Pipeline State)๋ฅผ ์„ค์ •ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ 

์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, SetPipelineState() ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด ์˜ค๋ธŒ์ ํŠธ๋ฅผ D3D12_FILL_MODE_SOLID๋กœ 100๊ฐœ ๋ Œ๋”๋ง์„ ํ•  ๋•Œ

100๊ฐœ์˜ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ

100๋ฒˆ SetPipelineState()๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋ง์ด๋‹ค.

์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆด ๋•Œ ํ•œ ๋ฒˆ ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋’ค์— ๊ทธ๋ฆด ๊ฐ์ฒด๋“ค์€

์„ค์ •๋œ ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ๋กœ ์•Œ์•„์„œ ๊ทธ๋ ค์ง„๋‹ค.

๋”ฐ๋ผ์„œ ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ทธ๋ฆฌ๊ธฐ ํ˜ธ์ถœ๋งˆ๋‹ค

SetPipelineState()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ผ์€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ค๋Š” ํ–‰๋™์ด๋‹ค.