Vulkan ์๊ฐ
Vulkan์ ํฌ๋ก๋ ธ์ค ๊ทธ๋ฃน์ด ๊ฐ๋ฐํ ํฌ๋ก์ค ํ๋ซํผ ๊ทธ๋ํฝ์ค API(Application Program Interface)์ ๋๋ค. Vulkan API๋ ํ์ค ๊ท๊ฒฉ์ด๋ฏ๋ก ๋ค์ํ ๋๋ฐ์ด์ค, ํ๋ซํผ, ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ๊ตฌํ๋ ์ ์์ต๋๋ค.
Vulkan์ ๊ณ ์ฑ๋ฅ ๋ฉํฐ์ฐ๋ ๋ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค.ํนํ Vulkan์ ๋ช ์์ ์ธ ์ค๊ณ ๋ฐฉ์์ ์ฑํํ์ฌ ๊ทธ๋ํฝ ๋๋ผ์ด๋ฒ์ ์์ ์ ์ค์ด๋ ์ด์ ์ ๊ฐ์ต๋๋ค. Vulkan์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ์ฑ๋ฅ, ์ ์ง์ฐ, ๊ทธ๋ฆฌ๊ณ ์ผ๊ด๋ ํ๋ ์์ ์ป์ ์ ์์ต๋๋ค.
Vulkan API ๊ฐ์
Vulkan API๋ ํจ์ ๋ชฉ๋ก, ์ ๋ฌํ ์ธ์, ๊ทธ๋ฆฌ๊ณ ๋ฐํ ํ์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ C ์ธ์ด๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋๋ถ๋ถ์ ์ธ์ด์ ํธํ ๋ ์ ์์ต๋๋ค.
์ด ํํ ๋ฆฌ์ผ์ C++๋ก ์์ฑ๋์์ง๋ง Rust ํน์ ์์ C์ ๊ฐ์ ์ ์์ค ์ธ์ด๋ก ํฌํ ํ๋ ๊ฒ์ ๊ฐ๋จํ ๊ฒ์ ๋๋ค.
Vulkan์ด ํ์ํ ์ํฉ
๋ง์ฝ ์ฃผ์ ๋ณ๋ชฉ์ด GPU์์ ์ผ์ด๋๋ค๋ฉด, Vulkan์ ๊ตฌํํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ฑ๋ฅ์ด ์ถฉ๋ถํ ํฅ์๋์ง ์์ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ ์ ์์ต๋๋ค. Vulkan์ด OpenGL๊ณผ ๋น๊ตํ์ฌ ์๋นํ ์ด๋ ต๊ณ ์ข ์ข ๊ฐ๋ฐํ๋ ๋ฐ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
๋ง์ฝ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค๋ค๋ ๋งต, ๋์ ์๋, ํน์ ๋ง์ ์์ ์ค๋ธ์ ํธ๋ฅผ ๋ด๋ CAD ์ฌ์ ํฌํจํ๋ค๋ฉด, Vulkan์ ๋ฉํฐ์ฐ๋ ๋ฉ์ ํตํด ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ํํธํ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. ๋ชจ๋ ์ค๋งํธํฐ์ด Vulkan์ ์ง์ํ๋ ๊ฒ์ ์๋๋ฉฐ(ํนํ ๊ตฌํ ๊ธฐ๊ธฐ), ์ง์ํ๋๋ผ๋ ๋๋ผ์ด๋ฒ ํ์ง์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. ํนํ Vulkan์ ์ง์ํ๋ ๋๋ผ์ด๋ฒ๊ฐ ํ์ฌ๋ ํฐ์ ๋ ์ ์ ๋ฐฐํฐ๋ฆฌ๋ก ๋ ์ ์ CPU ์ค๋ฒํค๋์ ๋์ ์ฑ๋ฅ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
ํฌ๋ก์ค ํ๋ซํผ
๋ชจ๋ฐ์ผ๊ณผ ๋ฐ์คํฌํ์ ๋ชจ๋ ์ง์ํ๋ API๋ผ๋ ์ ์์ Vulkan์ ์ค๊ณ๋ ๋ค๋ฅธ ๊ทธ๋ํฝ์ค API์ ๋น๊ตํด ํน์ํ ๋ฉด์ด ์์ต๋๋ค. Vulkan์ ๋ง์ ๊ธฐ๋ฅ์ด ์ ํ์ ์ด๋ฉฐ ์ฌ์ฉํ๋ ค๋ฉด ๋ช ์์ ์ผ๋ก ํ์ฑํํด์ผ ํฉ๋๋ค. ๋๋ถ๋ถ์ ๋ฐ์คํฌํ GPU์์๋ ์ง์ํ์ง๋ง ๋ชจ๋ฐ์ผ์์๋ ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ๋ ํํ ์ผ์ ๋๋ค.
Vulkan์ ๋ชจ๋ฐ์ผ๊ณผ ๋ฐ์คํฌํ์์ ์คํํ ๋, ํ๋ ๋๋ ๋ ๊ฐ์ ํต์ฌ ๋ ๋๋ง ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก 2๊ฐ์ ๋ ๋๋ง ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ต์ ์ ์ฑ๋ฅ์ ์ป๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. API๊ฐ ํตํฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ ๋ ๋๋ง ๊ฒฝ๋ก ๊ฐ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ๋ฐ์คํฌํ์ ์ํ Vulkan์ ์์ฑํ๋ ๊ฒ์ ์ง์คํ ๊ฒ์ด์ง๋ง, ๋ GPU์ ์ฐจ์ด์ ๋ํด์๋ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
๊ฒ์ฆ ๋ ์ด์ด
Vulkan API๋ ๋ฐฉ๋ํ๊ณ ์ค์ํ๊ธฐ ์ฝ์ง๋ง, ๊ฒ์ฆ ๋ ์ด์ด๋ก ์ด๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ฒ์ฆ ๋ ์ด์ด๋ API์ ์ฌ๋ฐ๋ฅด์ง ์์ ์ฌ์ฉ์ ๊ฐ์งํ๊ณ ๊ธฐ๋กํ๋ ์ ํ์ ๊ธฐ๋ฅ์ ๋๋ค.
๊ฒ์ฆ ๋ ์ด์ด๋ ํจ์ ํธ์ถ์ ๊ฐ๋ก์ฑ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ๋ง์ฝ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒ์ฆ๋์๋ค๋ฉด ๋๋ผ์ด๋ฒ์ ๋ํ ํธ์ถ์ด ์ ์์ ์ผ๋ก ์ํ๋ ๊ฒ์ ๋๋ค. ์ด ๊ณผ์ ์์ ํจ์ ๊ฐ๋ก์ฑ๊ธฐ์ ๊ฒ์ฆ ์คํ์ด ์ฑ๋ฅ ํ๋ฝ์ ์ผ์ผํฌ ์ ์๋ค๋ ์ ์ ์ ์ํด์ผํฉ๋๋ค.
๊ฒ์ฆ ๋ ์ด์ด๋ ์ฌ๋ฐ๋ฅด์ง ์์ ๊ตฌํ์ด๋ ์ฌ๋ฐ๋ฅด์ง ์์ ์ด๊ฑฐํ ์ฌ์ฉ, ๋๊ธฐํ ๋ฌธ์ , ๊ฐ์ฒด ์์ฑ์ฃผ๊ธฐ์ ๊ฐ์ ์๋ฌ๋ฅผ ์ก๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์์ฑํ ์ฝ๋๊ฐ ์๊ตฌ์ฌํญ์ ์ค์ํ๋์ง๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ๊ฐ๋ฐ ๋์ค ๊ฒ์ฆ ๋ ์ด์ด๋ฅผ ํ์ฑํ ํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ ๋ ๊ฒ์ฆ ๋ ์ด์ด์ ์ค๋ฅ๊ฐ ์๋ ๊ฒ์ ์ข์ ์ ํธ์ด์ง๋ง, ์ด๊ฒ๋ง์ผ๋ก ๋ค๋ฅธ ํ๋์จ์ด์์ ์ ์คํ๋ ๊ฒ์ด๋ผ๊ณ ํ๋จํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฅํ ๋ง์ ๋๋ฐ์ด์ค์์ ์คํํด๋ณด๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
์ค์ํ ์ ์ ๊ฒ์ฆ ๋ ์ด์ด๊ฐ ์ด๊ธฐํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฐ๋ฅด์ง ์์ ํฌ์ธํฐ์ ๊ฐ์ ๋ฒ๊ทธ๋ฅผ ์ก์์ฃผ์ง๋ ์๋๋ค๋ ์ ์ ๋๋ค. ์ด๋ฌํ ๋ฒ๊ทธ๋ฅผ ์ก๊ธฐ ์ํด์๋ Address Sanitizer์ Vanlgrind๋ฅผ ์ฌ์ฉํ๋ ํธ์ ์ถ์ฒํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ๋ ๊ทธ๋ํฝ ๋๋ผ์ด๋ฒ๋ ์ข ์ข ์๋ชป๋ ํ์ง๋ก ์ถ๋ ฅ์ ์ก์์ด ์๊ธธ ์ ์์ต๋๋ค.
์ฌ์ฉ๋ฒ๊ณผ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์
Vulkan API์์๋ ๋๋ถ๋ถ์ ์์๊ฐ ์ง์ ์์ฑํ๊ณ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์ด์์ต๋๋ค. ์ด๋ ์ด๋ฏธ์ง, ํ ์ค์ณ, ๋ฒํผ(์ ์ ๋ฐ์ดํฐ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ) ๊ฐ์ ์ค์ GPU ์์ ๋ฟ๋ง ์๋๋ผ ๋งค์ฐ ๋ง์ ์์ ๋ด๋ถ ์ค์ ๊ตฌ์กฐ์ฒด๋ ํฌํจํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋์คํฐ๋ผ์ด์ (rasterizer)์ ๊ฐ์ GPU ๊ณ ์ ํจ์๋ ํ์ดํ๋ผ์ธ ๊ฐ์ฒด์ ์ ์ฅ๋๋ฉฐ, ์ด ๊ฐ์ฒด๋ ์ ฐ์ด๋์ ๋ค๋ฅธ ์ค์ ๋ค์ ํฌํจํฉ๋๋ค. OpenGL๊ณผ DX11์์๋ ์ด๋ฅผ ๋ ๋๋ง ์ค ์ฆ์์์ ๊ณ์ฐํฉ๋๋ค. Vulkan์์ ์ด๋ฅผ ์ฌ์ฉํ ๋์๋ ๊ฐ์ฒด๋ค์ ์บ์ฑํ ์ง, ํน์ ๋ ๋๋ง ์ค ์ฆ์์์ ๋ง๋ค ์ง๋ฅผ ์๊ฐํด์ผ ํฉ๋๋ค. ํ์ดํ๋ผ์ธ๊ณผ ๊ฐ์ ๋ช๋ช ๊ฐ์ฒด๋ค์ ์์ฑํ๋ ๋น์ฉ์ด ๋น์ผ ํธ์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ํ๋ฉด ๋ก๋ฉ ์ ํน์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๋ ๋์์ ์์ฑํ๋ ๊ฒ์ด ์ต์ ์ ๋๋ค. ๋์คํฌ๋ฆฝํฐ ์ (DescriptorSet)๊ณผ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ๋น์ฉ์ด ๋ฎ์ ๋ ๋๋ง ์ค ํ์ํ ๋ ์์ฑํด๋ ๋ฌด๋ฐฉํฉ๋๋ค.
Vulkan์ ๋ชจ๋ ๊ฒ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ ๋น๋๋๋ฏ๋ก, GPU์ ๋๋ถ๋ถ์ ์ํ ๊ฒ์ฌ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ด๋ฃจ์ด์ง๋๋ค. ๋ฐ๋ผ์ ๋ ๋๋ง ์์ฒด์ ์์ ๋์ด ์ค์ด๋ค์ด ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ค์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๊ณ ์ฌ์ฉ๋๋์ง ์ ์ดํดํ๋ฉด ์ ์ฒด ์คํ ํ๋ฆ์ ํจ๊ณผ์ ์ผ๋ก ์ ์ดํ์ฌ ํ๋ ์์ ๋ถ๋๋ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
์ค์ GPU ๋ช ๋ น์ ์คํํ ๋, GPU์ ๋ชจ๋ ์์ ์ ์ปค๋งจ๋ ๋ฒํผ(CommandBuffer)์ ๊ธฐ๋ก๋์ด ํ(Queue)๋ก ์ ์ถ๋ฉ๋๋ค. ๋จผ์ ์ปค๋งจ๋ ๋ฒํผ๋ฅผ ํ ๋นํ๊ณ , ์ด๋ฅผ ์์ฑํด ํ์ ์ ์ถํ๋ ๊ฒ์ผ๋ก ์คํํ ์ ์์ต๋๋ค. ์ปค๋งจ๋ ๋ฒํผ๋ฅผ ํ์ ์ ์ถํ๋ฉด GPU์์ ํด๋น ๋ช ๋ น์ ์คํ์ด ์์๋ฉ๋๋ค. ์ธ์ ์คํ์ด ๋๋ ์ง๋ฅผ ์ ์ดํ๋ ๋๊ตฌ๋ ์์ต๋๋ค. ๋ง์ฝ ์ฌ๋ฌ ์ปค๋งจ๋ ๋ฒํผ๋ฅผ ์๋ก ๋ค๋ฅธ ํ์ ์ ์ถํ๋ค๋ฉด, ๋ณ๋ ฌ๋ก ์คํํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
Vulkan์๋ ํ๋ ์์ด๋ผ๋ ๊ฐ๋ ์ด ์์ต๋๋ค. ์ด๋ ๋ ๋๋ง ๋ฐฉ์์ด ์ ์ ์ผ๋ก ๊ฐ๋ฐ์์๊ฒ ๋งก๊ฒจ์ก๋ค๋ ์๋ฏธ์ฃ . ์ค์ํ ๊ฒ์ ์ธ์ ํ๋ ์์ ํ๋ฉด์ ํ์ํ ๊ฒ์ธ์ง ์ด๋ฉฐ, ์ด๋ ์ค์์ฒด์ธ(swapchain)์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ํ์ง๋ง ๋ ๋๋งํ ์ด๋ฏธ์ง๋ฅผ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ๊ฑฐ๋, ํ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ฑฐ๋, ์ค์์ฒด์ธ์ ํตํด ์คํฌ๋ฆฐ์ ์ด๋ฅผ ํ์ํ๋ ๊ฒ์๋ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ ์์ต๋๋ค.
์ด๋ Vulkan์ด ์์ ํ ํค๋๋ฆฌ์ค(headless)๋ชจ๋๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฆ, ํ๋ฉด์ ์๋ฌด๊ฒ๋ ํ์ํ์ง ์๊ณ ์ด๋ฏธ์ง๋ฅผ ๋ ๋๋งํ ํ ์ด๋ฏธ์ง๋ฅผ ๋์คํฌ์ ์ ์ฅํ ์ ์์ต๋๋ค(ํ ์คํธ ํ๊ธฐ์ ๋งค์ฐ ์ ์ฉํ์ฃ !). ํน์ Vulkan์ ๋ ์ดํธ๋ ์ด์ฑ๊ณผ ๊ฐ์ GPU ์ฐ์ฐ์ด๋ ๋ค๋ฅธ ์ปดํจํ ์์ ์ ์ํํ๋ ๋๊ตฌ๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Next: Vulkan Render flow