์์ง ์ํคํ ์ฒ
์์ง์ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ๋ก์ฐ ๋ ๋ฒจ ๊ธฐ๋ฒ์ ์ด๋ฏธ ๊ฐ์ถฐ์ก์ต๋๋ค. ์์์ ๋ฉ์๋ฅผ ๊ทธ๋ฆด ์ ์๊ณ , ๋ฒํผ๋ ํ ์ค์ณ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ฐ์ด๋์ ์ ๋ฌํ ์ ์์ต๋๋ค. ์ด์ ํ์ํ ๊ฒ์ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํ ์ ๋๋ก๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ถํ๊ณ VulkanEngine ํด๋์ค์ ํ๋์ฝ๋ฉ๋ ๊ตฌ์กฐ์ฒด ์ฌ์ฉ์ ์ง์ํ๋ ๊ฒ์ ๋๋ค.
๋ค์ ์ฅ์์ GLTF ํ์ผ๋ก๋ถํฐ ๋์ ์ผ๋ก ์ ์ฒด ์ฌ์ ๋ถ๋ฌ์ฌ ๊ฒ์ด๋ฏ๋ก, ์ฌ๊ธฐ์์ ์ํคํ ์ณ๋ GLTF๋ฅผ ์ด๋ ์ ๋ ๋ชจ๋ฐฉํ๊ฒ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ GLTF์ PBR ์ฌ์์ ๊ธฐ๋ฐ์ผ๋ก ๊ธฐ๋ณธ์ ์ธ GLTF ํ์ดํ๋ผ์ธ์ ๋ง๋ค๊ณ , ์ฒซ ๋ฒ์งธ ๋ฉ์ ํด๋์ค๋ฅผ ์ ์ํ ๊ฒ์ ๋๋ค.
์ด ์ํคํ ์ฒ๋ ๋ ๋จ๊ณ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ทธ ์ค ํ๋๋ RenderObject ๊ตฌ์กฐ์ฒด์ ๋๋ค.
struct RenderObject {
uint32_t indexCount;
uint32_t firstIndex;
VkBuffer indexBuffer;
MaterialInstance* material;
glm::mat4 transform;
VkDeviceAddress vertexBufferAddress;
};
์ด ๊ตฌ์กฐ์ฒด๋ VkCmdDrawIndexed ํธ์ถ์ ํ์ํ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ํํํํ ์ถ์ํ ๊ตฌ์กฐ์ ๋๋ค. ์ธ๋ฑ์ฑ์ ํ์ํ ์ ๋ณด์ ํจ๊ป, ํน์ ๋จธํ ๋ฆฌ์ผ์ ํด๋นํ๋ ํ์ดํ๋ผ์ธ๊ณผ ๋์คํฌ๋ฆฝํฐ ์ ์ ๊ฐ๋ฆฌํค๋ MaterialInstance ํฌ์ธํฐ๋ฅผ ํฌํจํฉ๋๋ค. ์ด์ด์ 3D ๋ ๋๋ง์ ํ์ํ ํ๋ ฌ๊ณผ ์ ์ ๋ฒํผ์ ํฌ์ธํฐ๊ฐ ์์ผ๋ฉฐ, ์ด ๋ ์์๋ ๊ฐ์ฒด๋ง๋ค ๋ฐ๋๋ ๋์ ๋ฐ์ดํฐ์ด๋ฏ๋ก ํธ์ ์์๋ฅผ ํตํด ์ ๋ฌ๋ฉ๋๋ค.
์ด ๊ตฌ์กฐ์ฒด๋ ๋งค ํ๋ ์ ๋์ ์ผ๋ก ์์ฑ๋๋ฉฐ, ๋ ๋๋ง ๋ก์ง์ RenderObject ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด์ ์ํํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ๋ช ๋ น์ ์ง์ ๊ธฐ๋กํ๊ฒ ๋ฉ๋๋ค.
MaterialInstance ๊ตฌ์กฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
struct MaterialPipeline {
VkPipeline pipeline;
VkPipelineLayout layout;
};
struct MaterialInstance {
MaterialPipeline* pipeline;
VkDescriptorSet materialSet;
MaterialPass passType;
};
๋จธํ ๋ฆฌ์ผ ์์คํ ์๋ ๋ ๊ฐ์ ํ์ดํ๋ผ์ธ, ์ฆ GLTF PBR ๋ถํฌ๋ช ์ฉ๊ณผ ํฌ๋ช ์ฉ์ผ๋ก ํ๋์ฝ๋ฉ๋ ๊ฒ์ ๋๋ค. ๋ ํ์ดํ๋ผ์ธ์ ๋์ผํ ์ ์ ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋ ์์ ๊ณต์ ํ๋ฉฐ, ๋์คํฌ๋ฆฝํฐ ์ ์ ์ด 2๊ฐ๋ง ์ฌ์ฉํ ์์ ์ ๋๋ค. ์ฌ๋กฏ 0๋ฒ์ ์นด๋ฉ๋ผ ๋ฐ ํ๊ฒฝ ์ ๋ณด์ ๊ฐ์ ์ ์ญ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๋์คํฌ๋ฆฝํฐ ์ ์ผ๋ก, ํ๋ฒ ๋ฐ์ธ๋ฉ๋ ํ ๋ชจ๋ ๋๋ก์ฐ ์ฝ์์ ์ฌ์ฌ์ฉ๋ฉ๋๋ค. ์ดํ ์กฐ๋ช ์ ๋ณด ๋ฑ๋ ์ถ๊ฐํ ์์ ์ ๋๋ค. ์ฌ๋กฏ 1๋ฒ์ ๋จธํ ๋ฆฌ์ผ๋ณ ๋์คํฌ๋ฆฝํฐ ์ ์ผ๋ก, ํ ์ค์ณ ๋ฐ ๋จธํ ๋ฆฌ์ผ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ์ญํ ์ ํฉ๋๋ค. GLTF ์ฌ์์ ๊ทธ๋๋ก ๋ฐ์ํ์ฌ, PBR GLTF ๋จธํ ๋ฆฌ์ผ์ด ์๊ตฌํ๋ ํ ์ค์ณ ์ธ์๋ ๊ฐ์ฒด ์์ ๋ฑ์ ์์ ์์๋ฅผ ํฌํจํ๋ ์ ๋ํผ ๋ฒํผ๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. GLTF PBR ๋จธํ ๋ฆฌ์ผ์ ํน์ ํ ์ค์ณ๊ฐ ์์ด๋ ์ ํจํ์ง๋ง, ์ด ๊ฒฝ์ฐ ์ฉ๋์ ๋ฐ๋ผ ๊ธฐ๋ณธ ํฐ์ ํน์ ๊ฒ์์ ํ ์ค์ณ๋ฅผ ๋ฐ์ธ๋ฉํ๊ฒ ๋ฉ๋๋ค. MaterialInstance ๊ตฌ์กฐ์ฒด๋ MaterialPass ์ด๊ฑฐํ์ ๊ฐ๋๋ฐ ์ด๋ ๋ถํฌ๋ช ๊ฐ์ฒด์ ํฌ๋ช ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
2๊ฐ์ ํ์ดํ๋ผ์ธ๋ง ์ฌ์ฉํ๋ ์ด์ ๋ ํ์ดํ๋ผ์ธ ์๋ฅผ ๊ฐ๋ฅํ ์ ๊ฒ ์ ์งํ๊ธฐ ์ํจ์ ๋๋ค. ํ์ดํ๋ผ์ธ ์๊ฐ ์ ์ผ๋ฉด ์์ ์ ์ฌ์ ๋ก๋ฉ์ด ๊ฐ๋ฅํ๊ณ , ํนํ ๋ฐ์ธ๋๋ฆฌ์ค ๋ ๋๋ง์ด๋ draw-indirect ๋ ๋๋ง ๋ก์ง์ ๋์ ํ์ ๋ ๋ ๋๋ง ์๋๊ฐ ํฅ์๋ฉ๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ GLTF PBR ๋จธํ ๋ฆฌ์ผ๊ณผ ๊ฐ์ ๊ฐ ๋จธํ ๋ฆฌ์ผ ํ์ ์ ๋ํด ์์์ ํ์ดํ๋ผ์ธ๋ง์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋ ๋๋ง ์์ง์ด ํ์๋ก ํ๋ ํ์ดํ๋ผ์ธ ์๋ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ ์ดํฐ๋ ์์ง๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ฒ์์ ์ฝ 200์ฌ๊ฐ์ ํ์ดํ๋ผ์ธ๋ง ์ฌ์ฉํ์ง๋ง, ์ธ๋ฆฌ์ผ ์์ง ๊ธฐ๋ฐ์ ํ๋ก์ ํธ์ธ ๊ฒฝ์ฐ ์ข ์ข 10๋ง ๊ฐ ์ด์์ ํ์ดํ๋ผ์ธ์ ์ฌ์ฉํฉ๋๋ค. ์ด์ฒ๋ผ ์ง๋์น๊ฒ ๋ง์ ํ์ดํ๋ผ์ธ์ ์ปดํ์ผ ํ๋ ๊ฒ์ ๋ ๋๋ง ์ค ์คํฐํฐ๋ง์ ์ ๋ฐํ๊ณ , ๋ง์ ์ ์ฅ ๊ณต๊ฐ์ ์ฐจ์งํ๋ฉฐ, draw-indirect์ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ตฌํ์๋ ์ ์ฝ์ ์ค๋๋ค.
RenderObject๋ ๋งค์ฐ ๋ก์ฐ ๋ ๋ฒจ์ ๊ตฌ์กฐ์ด๋ฏ๋ก, ์ด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ตฌ์กฐ๊ฐ ํ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ฌ ๊ทธ๋ํ๋ฅผ ๋์ ํ๊ฒ ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ์ ๊ฐ์ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ํํํ ์ ์์ผ๋ฉฐ, ๋ฉ์๊ฐ ์๋ ๋น ๋ ธ๋๋ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ ๊ฒ์ ์์ง์์ ๋ ๋ฒจ์ ๊ตฌ์ฑํ๊ธฐ ์ํ ์ ํ์ ์ธ ๋ฐฉ์์ ๋๋ค.
์ด๋ฒ์ ์ค๊ณํ ์ฌ ๊ทธ๋ํ๋ ์ค๊ฐ ๋๋ ๋ค์ ๋ฎ์ ์ฑ๋ฅ ๊ตฌ์กฐ์ด์ง๋ง, ์ถํ์ ๊ฐ์ ํ ์์ ์ด๋ฉฐ ๋งค์ฐ ์ ์ฐํ๊ณ ํ์ฅ์ฑ์ด ๋ฐ์ด๋ฉ๋๋ค. ํ์ฌ ์ค๊ณ๋ง์ผ๋ก๋ ์๋ง ๊ฐ์ ๊ฐ์ฒด ๋ ๋๋ง์๋ ์ถฉ๋ถํ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
// base class for a renderable dynamic object
class IRenderable {
virtual void Draw(const glm::mat4& topMatrix, DrawContext& ctx) = 0;
};
๋จ์ผ Draw() ํจ์๋ง์ ์ ์ํ๋ IRenderable ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค. ์ด ํจ์๋ ๋ถ๋ชจ๋ก ์ฌ์ฉํ ํ๋ ฌ๊ณผ RenderContext๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. RenderContext๋ ํ์ฌ๋ก์๋ ๋ ๋๋งํ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ผ ๋ฟ์ ๋๋ค. ์ด ๊ตฌ์กฐ์ ์์ด๋์ด๋ Draw() ํจ์๊ฐ ํธ์ถ๋ ๋, ํด๋น ๊ฐ์ฒด๊ฐ ์ด๋ฒ ํ๋ ์์ ๋ ๋๋งํ ํญ๋ชฉ์ Renderables์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ฐฉ์์ ํํ Immediate Design์ด๋ผ ๋ถ๋ฆฌ๋ฉฐ, ๊ฐ์ฅ ํฐ ์ฅ์ ์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ค๋ฅธ ํ๋ ฌ์ ์ฌ์ฉํ์ฌ ํ ํ๋ ์ ์์์ ์ค๋ณต ๋ ๋๋งํ ์ ์๋ค๋ ์ ์ ๋๋ค. ๋ํ ํน์ ๋ก์ง์ ๋ฐ๋ผ ์ด๋ค ํ๋ ์์์๋ Draw()๋ฅผ ํธ์ถํ์ง ์์์ผ๋ก์จ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ์ง ์์ ์๋ ์์ต๋๋ค. ์ด ์ ๊ทผ๋ฒ์ ์์ ๊ด๋ฆฌ ๋ฐ ๊ฐ์ฒด ์๋ช ๊ด๋ฆฌ๊ฐ ํจ์ฌ ๋จ์ํด์ง๊ธฐ ๋๋ฌธ์ ๋์ ์ธ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ๋ ๋งค์ฐ ์ ์ฉํ๋ฉฐ, ์ฝ๋ ์์ฑ ๋ํ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค. ๋จ์ ์ผ๋ก๋, ํ๋ ์๋ง๋ค ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์ํํ๋ฉฐ ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋๋ฐ, ๊ฐ์ฒด ์๊ฐ ๋ง์์ง์๋ก ์ด๋ฌํ ํธ์ถ ๋น์ฉ์ด ๋์ ๋๋ค๋ ์ ์ ๋๋ค.
Node ํด๋์ค๋ IRenderable์ ์์๋ฐ์ ๊ฒ์ด๋ฉฐ, ๊ณ ์ ์ ๋ณํ ํ๋ ฌ๊ณผ ์์ ๋ ธ๋์ ๋ฐฐ์ด์ ๊ฐ์ง ๊ฒ์ ๋๋ค. Draw()๊ฐ ํธ์ถ๋ ๋ ์์ ๋ ธ๋๋ค์ Draw()๋ ํธ์ถํ๊ฒ ๋ฉ๋๋ค.
MeshNode ํด๋์ค๋ฅผ ๋ง๋ค ๊ฒ์ด๋ฉฐ, ์ด๋ Node๋ฅผ ์์๋ฐ์ ๊ฒ์ ๋๋ค. ์ด ํด๋์ค๋ ๋ ๋๋ง์ ํ์ํ ์์๋ค์ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ, Draw()๊ฐ ํธ์ถ๋๋ฉด RenderObject๋ฅผ ์์ฑํด DrawContext์ ์ถ๊ฐํ๊ฒ ๋ฉ๋๋ค.
์กฐ๋ช ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ ๋๋ง ์์๋ฅผ ์ถ๊ฐํ ๋๋ ๋์ผํ ๊ตฌ์กฐ๋ก ๋์ํฉ๋๋ค. DrawContext๋ ์กฐ๋ช ๋ค์ ๋ชฉ๋ก์ ์ ์งํ๊ณ , LightNode๋ ์กฐ๋ช ์ด ํ์ฑํ๋์ด ์์ ๊ฒฝ์ฐ ์์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํด๋น ๋ชฉ๋ก์ ์ถ๊ฐํฉ๋๋ค. ์งํ, ํํฐํด ๋ฑ ๋ค๋ฅธ ๋ ๋๋ง ๊ฐ์ฒด๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ํ ๊ฐ์ง ํธ๋ฆญ์ GLTF๋ฅผ ์ถ๊ฐํ ๋ LoadedGLTF๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ด ํด๋์ค๋ Node๊ฐ ์๋ IRenderable์ ์ง์ ์์ํ๋ฉฐ, ํน์ GLTF ํ์ผ์ ํฌํจ๋ ์ ์ฒด ์ํ์ ํ ์ค์ณ, ๋ฉ์๊ฐ์ ๋ชจ๋ ์์์ ํฌํจํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Draw()๊ฐ ํธ์ถ๋๋ฉด ํด๋น GLTF์ ๋ด์ฉ์ ๋ ๋๋งํฉ๋๋ค. ๋น์ทํ ๋ฐฉ์์ผ๋ก OBJ์ ๊ฐ์ ๋ค๋ฅธ ํฌ๋งท๋ ์ฒ๋ฆฌํ ์ ์์ด ์ ์ฉํฉ๋๋ค.
GLTF๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ ๋ค์ ์ฅ์์ ํ ์์ ์ด์ง๋ง, ์ง๊ธ์ RenderObject์ GLTF ๋จธํ ๋ฆฌ์ผ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ค๋นํ ๊ฒ์ ๋๋ค.
Next: Setting up Materials