Vulkan ν΅μ¬ κ°μ²΄μ νμ© λ°©λ²
VkInstance
: Vulkan λ¬Έλ§₯(context)μΌλ‘, GPU λλΌμ΄λ²μ μ κ·Όνλ λ° μ¬μ©λ©λλ€.VkPhysicalDevice
: GPU κ·Έ μ체μ λλ€. κΈ°λ₯, νΈνμ±, λ©λͺ¨λ¦¬ ν¬κΈ°, κ·Έ μ΄μΈμ μ¬λ¬ GPU μΈλΆ μ¬νμ μ‘°ννλ λ° μ¬μ©λ©λλ€.VkDevice
: GPUλ₯Ό μ€μ λ‘ μ€ννλλ° μ¬μ©ν βλ Όλ¦¬μ μΈβ GPU λ¬Έλ§₯μ λλ€.VkBuffer
: GPUκ° μ κ·Όν μ μλ λ©λͺ¨λ¦¬ λ¬Άμμ λλ€.VkImage
: μ½κ³ μΈ μ μλ ν μ€μ³μ λλ€.VkPipeline
: 그리기μ νμν GPU μνλ₯Ό λ΄κ³ μλ κ°κ²£μ λλ€.(ex. μ °μ΄λ, λμ€ν°ν, κΉμ΄ μ€μ )VkRenderPass
: λ λλ§ν μ΄λ―Έμ§μ μ 보λ₯Ό λ΄κ³ μμ΅λλ€. λͺ¨λ 그리기 λͺ λ Ήμ λ λν¨μ€(renderpass) λ΄λΆμμ μνλ©λλ€.VkFrameBuffer
: λ λν¨μ€μ νκ² μ΄λ―Έμ§λ₯Ό λ΄μ΅λλ€. ꡬλ²μ vkguideμμλ§ μ¬μ©λ©λλ€.VkCommandBuffer
: GPU λͺ λ Ήμ κΈ°λ‘ν©λλ€. (λλΌμ΄λ²κ° μλ)GPUμμ μ€νλλ λͺ¨λ λͺ λ ΉμVkCommandBuffer
μ κΈ°λ‘λ©λλ€.VkQueue
: λͺ λ Ήμ μ€ν μ§μ μ λλ€. GPUλ λ€λ₯Έ μμ±μ ν λͺ¨μμ κ°μ΅λλ€. μ΄λ€ νλ κ·Έλν½ λͺ λ Ήλ§ λ°μΌλ©°, λ€λ₯Έ μ΄λ€ νλ λ©λͺ¨λ¦¬ λͺ λ Ήλ§ λ°μ΅λλ€. μλ₯Ό λ€μ΄ 컀맨λ λ²νΌλ νμ μ μΆλμ΄ μ€νλλλ°, μ΄λ GPUλ‘ λ λλ§ λͺ λ Ήμ μ λ¬ν©λλ€.VkDescriptorSet
:VkBuffer
μμμ΄λVkImage
ν μ€μ³μ κ°μ λ°μ΄ν°λ₯Ό μ °μ΄λλ‘ μ°κ²°νλ λ° νμν μ 보λ₯Ό λ΄μ΅λλ€. GPUμμμ ν¬μΈν°λΌκ³ μκ°ν΄λ μ’μ΅λλ€.VkSwapchainKHR
: νλ©΄μ μ΄λ―Έμ§λ₯Ό λ΄λλ° μ¬μ©λ©λλ€. λ λλ§ ν κ²μ μκ°μ μΌλ‘ λ³Ό μ μλ μ°½μ λ λλ§ ν μ μκ² ν©λλ€.KHR
μ λ―Έμ¬λ Vulkan νμ₯μ κ°μ²΄μμ λνλ λλ€. μ¬κΈ°μλVk_KHR_swapchain
μ λλ€.VkSemaphore
: GPUκ° λͺ λ Ή λκΈ°νμ μ¬μ©λ©λλ€. μ¬λ¬ 컀맨λ λ²νΌκ° μμ λ νλκ° μ€νλκ³ κ·Έ λ€μ κ²μ΄ μ€ννλ κ²μ 보μ₯νκΈ° μν΄ μ¬μ©λ©λλ€.VkFence
: GPUμ CPUλ₯Ό λκΈ°ννλ λ° μ¬μ©λ©λλ€. 컀맨λ λ²νΌκ° GPUμμ μ€νμ΄ μλ£λμλμ§λ₯Ό νμΈν λ μ¬μ©ν©λλ€.
κ³ μμ€ Vulkan μ ν리μΌμ΄μ νλ¦
μμ§ μ΄κΈ°ν
λ¨Όμ , λͺ¨λ κ²μ μ΄κΈ°νν©λλ€. Vulkanμ μ΄κΈ°ννκΈ° μν΄μ VkInstance
λ₯Ό μμ±νλ κ²λΆν° μμν©λλ€. VkInstance
λ‘λΆν° μ»΄ν¨ν°μ μ¬μ© κ°λ₯ν VkPhysicalDevice
νΈλ€μ λͺ©λ‘μ μ‘°νν©λλ€. μλ₯Ό λ€μ΄, μ»΄ν¨ν°κ° μ μ© GPUμ ν΅ν© κ·Έλν½μ€λ₯Ό κ°λλ€λ©΄, κ°κ° VkPhysicalDevice
κ° λ μ μμ΅λλ€. VkPhysicalDevice
λ‘λΆν° μ¬μ© κ°λ₯ν κΈ°λ₯κ³Ό μ ν μ¬νμ μ‘°νν ν VkDevice
λ₯Ό μμ±ν©λλ€. VkDevice
μμλ 컀맨λλ₯Ό μ€ννκ² ν΄μ£Όλ VkQueue
νΈλ€μ μ»μ μ μμ΅λλ€. κ·Έ ν, VkSwapchainKHR
μ μ΄κΈ°νν©λλ€. VkQueue
νΈλ€λ‘ 컀맨λ λ²νΌλ₯Ό ν λΉν μ μλ κ°μ²΄μΈ VkCommandPool
μ μμ±ν μ μμ΅λλ€.
μμ μ΄κΈ°ν
ν΅μ¬ ꡬ쑰체λ€μ΄ μ΄κΈ°ν λκ³ λλ©΄, λ λλ§ν λμμ νμν μμμ μ΄κΈ°νν΄μΌν©λλ€. λ¨Έν
리μΌ(Material)μ΄ λ‘λ©λλ©΄ VkPipeline
μ μ§ν©μ μμ±ν©λλ€. μ΄λ λ¨Έν
리μΌμ λ λλ§νλ λ° νμν μ
°μ΄λ μ‘°ν©κ³Ό νλΌλ―Έν°λ₯Ό λ΄μ΅λλ€. λ©μ(Mesh)λ₯Ό λ λλ§ νκΈ° μν΄ λ©μμ μ μ λ°μ΄ν°λ₯Ό VkBuffer
μμμΌλ‘, κ·Έλ¦¬κ³ λ©μμ ν
μ€μ³λ₯Ό VkImage
μμμΌλ‘ μ
λ‘λν΄μΌ ν©λλ€. μ΄ λ μ΄λ―Έμ§κ° βμ½μ μ μλβ λ μ΄μμμμ λΆλͺ
ν ν΄μΌν©λλ€. λν μ£Όμ λ λλ§ ν¨μ€μ λν΄ VkRenderPass
κ°μ²΄λ₯Ό λ§λ€μ΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, μ£Όμ λ λλ§νλλ° μ¬μ©ν VkRenderPass
κ° μμ μ μκ³ , κ·Έλ¦Όμ ν¨μ€μ μ¬μ©ν VkRenderPass
κ° μμ μ μμ΅λλ€. νΉν νμ΄νλΌμΈ μμ±μ κ½€ λΉμΌ νΈμ΄κΈ° λλ¬Έμ, μ€μ μμ§μμλ μ΄λ¬ν μμ
μ λ°±κ·ΈλΌμ΄λ μ°λ λμμ λ³λ ¬ν λμ΄ μ²λ¦¬λ μ μμ΅λλ€.
λ λλ§ λ£¨ν
μ΄μ λ λλ§ν μ€λΉκ° λλ¬μ΅λλ€. λ¨Όμ VkSwapchainKHR
μ λ λλ§ν μ΄λ―Έμ§λ₯Ό μμ²ν΄μΌ ν©λλ€. κ·Έλ¦¬κ³ VkCommandPool
λ‘λΆν° VkCommandBuffer
λ₯Ό ν λΉνκ±°λ μ΄λ―Έ ν λΉλ 컀맨λ λ²νΌλ₯Ό μ¬μ¬μ©ν΄ 컀맨λλ₯Ό μμ±ν©λλ€. λ€μμΌλ‘λ VkRenderPass
λ₯Ό μμν΄μ λ λλ§μ μμν©λλ€. μ΄λ μΌλ°μ μΈ VkRenderPass
νΉμ λμ λ λλ§μ μ¬μ©ν΄ μνν μ μμ΅λλ€. λ λν¨μ€λ μ€μ체μΈμΌλ‘λΆν° λ°μμ¨ μ΄λ―Έμ§μ λ λλ§μ μννλλ‘ μ§μ ν©λλ€. κ·Έλ¦¬κ³ VkPipeline
, (μ
°μ΄λ νλΌλ―Έν°μ νμν)VkDescriptorSet
, μ μ λ²νΌλ₯Ό λ°μΈλ©νκ³ κ·Έλ¦¬κΈ° νΈμΆμ μ€νν 루νλ₯Ό λ§λλλ€. λ λν¨μ€μμ κ·Έλ¦¬κΈ°κ° λλ¬μΌλ©΄ VkRenderPass
λ₯Ό λλ
λλ€. λ λλ§ ν κ²μ΄ λ¨μμμ§ μλ€λ©΄ VkCommandBuffer
λ λλ
λλ€. λ§μ§λ§μΌλ‘ λ λλ§νκΈ° μν΄ μ»€λ§¨λ λ²νΌλ₯Ό νλ‘ μ μΆν©λλ€. κ·Έλ¬λ©΄ GPUμμ 컀맨λ λ²νΌμ λͺ
λ Ήλ€μ μ€νμ΄ μμλ κ²μ
λλ€. λ§μ½ λ λλ§ν κ²°κ³Όλ₯Ό νλ©΄μ νμνκ³ μΆλ€λ©΄, λ λλ§ν μ΄λ―Έμ§λ₯Ό νλ©΄μ βνμ(present)βν΄μΌν©λλ€. μμ§ λ λλ§μ΄ λλμ§ μμμ μ μκΈ° λλ¬Έμ, μΈλ§ν¬μ΄(semaphore)λ₯Ό μ¬μ©ν΄ λ λλ§μ΄ λλ λ κΉμ§ νλ©΄μ μ΄λ―Έμ§λ₯Ό νμνλ μμ
μ λκΈ°μμΌμΌ ν©λλ€.
Vulkanμμμ λ λλ§ λ£¨ν μμ¬μ½λμ λλ€.
// μ€μ체μΈμ λ λλ§ν μ΄λ―Έμ§μ μΈλ±μ€λ₯Ό μμ²ν©λλ€.
int image_index = request_image(mySwapchain);
// 컀맨λ λ²νΌλ₯Ό μμ±ν©λλ€.
VkCommandBuffer cmd = allocate_command_buffer();
// 컀맨λ λ²νΌλ₯Ό μ΄κΈ°νν©λλ€.
vkBeginCommandBuffer(cmd, ... );
// μ€μ체μΈμΌλ‘λΆν° λ°μμ¨ μ΄λ―Έμ§ μΈλ±μ€λ‘ μλ‘μ΄ λ λν¨μ€λ₯Ό μμν©λλ€.
// κ° νλ μ λ²νΌλ μ€μ체μΈμ μ΄λ―Έμ§λ₯Ό μ°Έμ‘°ν©λλ€.
vkCmdBeginRenderPass(cmd, main_render_pass, framebuffers[image_index] );
// λͺ¨λ κ°μ²΄λ₯Ό λ λλ§ν©λλ€.
for(object in PassObjects){
// κ°μ²΄λ₯Ό λ λλ§νλ λ° μ¬μ©λλ ꡬμ±κ³Ό μ
°μ΄λλ₯Ό λ°μΈλ©ν©λλ€.
vkCmdBindPipeline(cmd, object.pipeline);
// κ°μ²΄λ₯Ό λ λλ§νλ λ° μ¬μ©λλ μ μ κ³Ό μΈλ±μ€ λ²νΌλ₯Ό λ°μΈλ©ν©λλ€.
vkCmdBindVertexBuffers(cmd, object.VertexBuffer,...);
vkCmdBindIndexBuffer(cmd, object.IndexBuffer,...);
// μ
°μ΄λ μ
λ ₯μΌλ‘ μ¬μ©λλ κ°μ²΄μ λμ€ν¬λ¦½ν° μ
μ λ°μΈλ©ν©λλ€.
vkCmdBindDescriptorSets(cmd, object.textureDescriptorSet);
vkCmdBindDescriptorSets(cmd, object.parametersDescriptorSet);
// 그립λλ€.
vkCmdDraw(cmd,...);
}
// λ λν¨μ€μ 컀맨λ λ²νΌλ₯Ό λλ
λλ€.
vkCmdEndRenderPass(cmd);
vkEndCommandBuffer(cmd);
// 컀맨λ λ²νΌλ₯Ό μ μΆνκ³ GPUμμ μ€νν©λλ€.
vkQueueSubmit(graphicsQueue, cmd, ...);
// λ λλ§ν μ΄λ―Έμ§λ₯Ό νλ©΄μ νμν©λλ€.
// renderSemaphoreλ `cmd`κ° μ€νλ λ κΉμ§ μ΄λ―Έμ§λ₯Ό νμνμ§ μλ κ²μ 보μ₯ν©λλ€.
vkQueuePresent(graphicsQueue, renderSemaphore);
Next: Project files and libraries