From ac79e671dd0f6debc2b39a08ff30f571231a16c9 Mon Sep 17 00:00:00 2001 From: CDDing Date: Wed, 16 Apr 2025 18:06:18 +0900 Subject: [PATCH 1/9] ko-translate getting_started --- guide/build.cmake | 1 + guide/translations/ko-KR/book.toml | 10 + guide/translations/ko-KR/src/README.md | 34 ++ guide/translations/ko-KR/src/SUMMARY.md | 51 +++ .../ko-KR/src/dear_imgui/README.md | 3 + .../ko-KR/src/dear_imgui/dear_imgui.md | 137 ++++++++ .../ko-KR/src/dear_imgui/imgui_demo.png | Bin 0 -> 24061 bytes .../ko-KR/src/dear_imgui/imgui_integration.md | 59 ++++ .../ko-KR/src/descriptor_sets/README.md | 5 + .../src/descriptor_sets/descriptor_buffer.md | 174 ++++++++++ .../descriptor_sets/instanced_rendering.md | 139 ++++++++ .../descriptor_sets/instanced_rendering.png | Bin 0 -> 29662 bytes .../src/descriptor_sets/pipeline_layout.md | 81 +++++ .../src/descriptor_sets/rgby_texture.png | Bin 0 -> 22654 bytes .../ko-KR/src/descriptor_sets/texture.md | 247 ++++++++++++++ .../ko-KR/src/descriptor_sets/view_matrix.md | 79 +++++ .../ko-KR/src/descriptor_sets/view_matrix.png | Bin 0 -> 27789 bytes .../ko-KR/src/descriptor_sets/view_ubo.png | Bin 0 -> 52258 bytes .../ko-KR/src/getting_started/README.md | 34 ++ .../ko-KR/src/getting_started/class_app.md | 39 +++ .../src/getting_started/high_level_loader.png | Bin 0 -> 191966 bytes .../src/getting_started/project_layout.md | 22 ++ .../src/getting_started/validation_layers.md | 11 + .../src/getting_started/vkconfig_gui.png | Bin 0 -> 155155 bytes .../ko-KR/src/initialization/README.md | 12 + .../ko-KR/src/initialization/device.md | 66 ++++ .../ko-KR/src/initialization/glfw_window.md | 89 +++++ .../ko-KR/src/initialization/gpu.md | 94 ++++++ .../ko-KR/src/initialization/instance.md | 87 +++++ .../ko-KR/src/initialization/scoped_waiter.md | 64 ++++ .../ko-KR/src/initialization/surface.md | 26 ++ .../ko-KR/src/initialization/swapchain.md | 226 +++++++++++++ guide/translations/ko-KR/src/memory/README.md | 5 + .../translations/ko-KR/src/memory/buffers.md | 94 ++++++ .../ko-KR/src/memory/command_block.md | 84 +++++ .../ko-KR/src/memory/device_buffers.md | 133 ++++++++ guide/translations/ko-KR/src/memory/images.md | 184 +++++++++++ .../ko-KR/src/memory/vbo_quad.png | Bin 0 -> 74756 bytes .../ko-KR/src/memory/vertex_buffer.md | 104 ++++++ guide/translations/ko-KR/src/memory/vma.md | 66 ++++ .../ko-KR/src/rendering/README.md | 3 + .../ko-KR/src/rendering/dynamic_rendering.md | 212 ++++++++++++ .../rendering/dynamic_rendering_red_clear.png | Bin 0 -> 18626 bytes .../ko-KR/src/rendering/render_sync.md | 75 +++++ .../ko-KR/src/rendering/swapchain_loop.md | 28 ++ .../ko-KR/src/rendering/swapchain_update.md | 98 ++++++ .../ko-KR/src/rendering/wsi_engine.png | Bin 0 -> 41484 bytes .../ko-KR/src/shader_objects/README.md | 5 + .../src/shader_objects/drawing_triangle.md | 130 ++++++++ .../src/shader_objects/glsl_to_spir_v.md | 71 ++++ .../src/shader_objects/locating_assets.md | 49 +++ .../ko-KR/src/shader_objects/pipelines.md | 254 +++++++++++++++ .../src/shader_objects/shader_program.md | 304 ++++++++++++++++++ .../src/shader_objects/srgb_triangle.png | Bin 0 -> 84213 bytes .../srgb_triangle_wireframe.png | Bin 0 -> 31164 bytes .../src/shader_objects/white_triangle.png | Bin 0 -> 29161 bytes 56 files changed, 3689 insertions(+) create mode 100644 guide/translations/ko-KR/book.toml create mode 100644 guide/translations/ko-KR/src/README.md create mode 100644 guide/translations/ko-KR/src/SUMMARY.md create mode 100644 guide/translations/ko-KR/src/dear_imgui/README.md create mode 100644 guide/translations/ko-KR/src/dear_imgui/dear_imgui.md create mode 100644 guide/translations/ko-KR/src/dear_imgui/imgui_demo.png create mode 100644 guide/translations/ko-KR/src/dear_imgui/imgui_integration.md create mode 100644 guide/translations/ko-KR/src/descriptor_sets/README.md create mode 100644 guide/translations/ko-KR/src/descriptor_sets/descriptor_buffer.md create mode 100644 guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.md create mode 100644 guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.png create mode 100644 guide/translations/ko-KR/src/descriptor_sets/pipeline_layout.md create mode 100644 guide/translations/ko-KR/src/descriptor_sets/rgby_texture.png create mode 100644 guide/translations/ko-KR/src/descriptor_sets/texture.md create mode 100644 guide/translations/ko-KR/src/descriptor_sets/view_matrix.md create mode 100644 guide/translations/ko-KR/src/descriptor_sets/view_matrix.png create mode 100644 guide/translations/ko-KR/src/descriptor_sets/view_ubo.png create mode 100644 guide/translations/ko-KR/src/getting_started/README.md create mode 100644 guide/translations/ko-KR/src/getting_started/class_app.md create mode 100644 guide/translations/ko-KR/src/getting_started/high_level_loader.png create mode 100644 guide/translations/ko-KR/src/getting_started/project_layout.md create mode 100644 guide/translations/ko-KR/src/getting_started/validation_layers.md create mode 100644 guide/translations/ko-KR/src/getting_started/vkconfig_gui.png create mode 100644 guide/translations/ko-KR/src/initialization/README.md create mode 100644 guide/translations/ko-KR/src/initialization/device.md create mode 100644 guide/translations/ko-KR/src/initialization/glfw_window.md create mode 100644 guide/translations/ko-KR/src/initialization/gpu.md create mode 100644 guide/translations/ko-KR/src/initialization/instance.md create mode 100644 guide/translations/ko-KR/src/initialization/scoped_waiter.md create mode 100644 guide/translations/ko-KR/src/initialization/surface.md create mode 100644 guide/translations/ko-KR/src/initialization/swapchain.md create mode 100644 guide/translations/ko-KR/src/memory/README.md create mode 100644 guide/translations/ko-KR/src/memory/buffers.md create mode 100644 guide/translations/ko-KR/src/memory/command_block.md create mode 100644 guide/translations/ko-KR/src/memory/device_buffers.md create mode 100644 guide/translations/ko-KR/src/memory/images.md create mode 100644 guide/translations/ko-KR/src/memory/vbo_quad.png create mode 100644 guide/translations/ko-KR/src/memory/vertex_buffer.md create mode 100644 guide/translations/ko-KR/src/memory/vma.md create mode 100644 guide/translations/ko-KR/src/rendering/README.md create mode 100644 guide/translations/ko-KR/src/rendering/dynamic_rendering.md create mode 100644 guide/translations/ko-KR/src/rendering/dynamic_rendering_red_clear.png create mode 100644 guide/translations/ko-KR/src/rendering/render_sync.md create mode 100644 guide/translations/ko-KR/src/rendering/swapchain_loop.md create mode 100644 guide/translations/ko-KR/src/rendering/swapchain_update.md create mode 100644 guide/translations/ko-KR/src/rendering/wsi_engine.png create mode 100644 guide/translations/ko-KR/src/shader_objects/README.md create mode 100644 guide/translations/ko-KR/src/shader_objects/drawing_triangle.md create mode 100644 guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md create mode 100644 guide/translations/ko-KR/src/shader_objects/locating_assets.md create mode 100644 guide/translations/ko-KR/src/shader_objects/pipelines.md create mode 100644 guide/translations/ko-KR/src/shader_objects/shader_program.md create mode 100644 guide/translations/ko-KR/src/shader_objects/srgb_triangle.png create mode 100644 guide/translations/ko-KR/src/shader_objects/srgb_triangle_wireframe.png create mode 100644 guide/translations/ko-KR/src/shader_objects/white_triangle.png diff --git a/guide/build.cmake b/guide/build.cmake index 8589bc4..afc07be 100644 --- a/guide/build.cmake +++ b/guide/build.cmake @@ -25,3 +25,4 @@ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/theme" DESTINATION "${CMAKE_CURRENT_SOURC BuildBook("en" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/book") BuildBook("zh-TW" "${CMAKE_CURRENT_SOURCE_DIR}/translations/zh-TW" "${CMAKE_CURRENT_SOURCE_DIR}/book/zh-TW") +BuildBook("ko-KR" "${CMAKE_CURRENT_SOURCE_DIR}/translations/ko-KR" "${CMAKE_CURRENT_SOURCE_DIR}/book/ko-KR") diff --git a/guide/translations/ko-KR/book.toml b/guide/translations/ko-KR/book.toml new file mode 100644 index 0000000..db0956a --- /dev/null +++ b/guide/translations/ko-KR/book.toml @@ -0,0 +1,10 @@ +[book] +authors = ["Karnage"] +language = "en" +src = "src" +title = "Learn Vulkan" + +[output.html] +theme = "theme" +additional-js = ["theme/lang_toggle.js"] +additional-css = ["theme/lang_toggle.css"] diff --git a/guide/translations/ko-KR/src/README.md b/guide/translations/ko-KR/src/README.md new file mode 100644 index 0000000..f3d6bf2 --- /dev/null +++ b/guide/translations/ko-KR/src/README.md @@ -0,0 +1,34 @@ +# 소개 + +Vulkan은 매우 명시적이고 어려운 API로 알려져 있습니다. 하지만 버전이 거듭될수록 새로운 기능이 추가되고 기존 확장 기능들이 핵심 API에 통합되면서, 필수적인 어려움은 점차 줄어들고 있습니다. RAII는 C++의 핵심 개념 중 하나이지만, 대부분의 Vulkan 가이드에서는 이를 제대로 활용하지 않고, 자원을 수동으로 해제하는 방식으로 오히려 명시성을 강조하는 경우가 많습니다. + +이러한 격차를 메우기 위해 이 가이드는 다음과 같은 목표를 가지고 있습니다. + +- 모던 C++, VulkanHPP, Vulkan 1.3 기능을 적극 활용합니다. +- 성능이 아닌, 단순하고 직관적인 접근에 초점을 맞춥니다. +- 기본적인 렌더링 기능을 갖춘 동적 렌더링 기반을 구축합니다. + +다시 한번 말하자면, 이 가이드의 목적은 성능이 아닙니다. 이 가이드는 현대 패러다임과 도구를을 활용해 현재 표준으로 자리잡은 멀티 플랫폼 그래픽스 API를 빠르게 소개하는 데 중점을 둡니다. 성능을 고려하지 않더라도 Vulkan은 OpenGL보다 현대적이고 우수한 설계를 갖추고 있습니다. 예를 들어, Vulkan에는 전역 상태 기계가 없고, 파라미터는 의미있는 멤버로 구성된 구조체를 통해 전달되며, 멀티쓰레딩 역시 상당히 간단하게 구현할 수 있습니다(실제로 OpenGL보다 Vulkan에서 멀티쓰레딩이 더 쉽습니다). 또한, 애플리케이션 코드를 변경하지 않고도 오용을 가밎할 수 있는 강력한 검증 레이어를 활성화할 수 있습니다. + +더 깊이 Vulkan에 대해 학습하고 싶다면 [공식 튜토리얼](https://docs.vulkan.org/tutorial/latest/00_Introduction.html)이 권장됩니다. [vkguide](https://vkguide.dev/)와 [Vulkan Tutorial](https://vulkan-tutorial.com/) 또한 많이 참고되는 자료로, 내용이 매우 자세하게 정리되어 있습니다. + +## 대상 독자 + +이 가이드는 이런 분들께 추천합니다. + +- 모던 C++의 원리와 사용법을 이해하시는 분 +- 써드파티 라이브러리를 사용해 C++ 프로젝트를 진행해보신 분 +- 그래픽스에 어느 정도 익숙하신 분 + - OpenGL 튜토리얼을 따라 해본 경험이 있다면 이상적입니다 + - SFML / SDL과 같은 프레임워크를 사용해본 경험도 도움이 됩니다 +- 필요한 모든 정보가 이 가이드 하나에 전부 담겨 있지 않아도 괜찮으신 분 + +이 책은 다음 내용을 다루지 않습니다. + +- GPU 기반 렌더링 기법 +- 그래픽스 시스템의 근본적인 구조부터 시작하는 실시간 렌더링 +- 타일 기반 GPU(예: 모바일 기기나 Android)를 위한 고려 사항 + +## 소스코드 + +프로젝트의 소스코드와 본 가이드는 여기에서 확인할 수 있습니다. `section/*` 브랜치는 각 섹션의 끝에서의 코드 상태를 반영하는 것을 목표로 합니다. 버그 수정이나 일부 변경사항은 가능한 한 반영하지만, `main`브랜치의 최신 상태와는 일부 차이가 있을 수 있습니다. 가이드 자체의 소스는 오직 `main` 브랜치에만 최신 상태로 유지되며, 변경사항은 다른 브랜치로 반영되지 않습니다. diff --git a/guide/translations/ko-KR/src/SUMMARY.md b/guide/translations/ko-KR/src/SUMMARY.md new file mode 100644 index 0000000..fbc6ee8 --- /dev/null +++ b/guide/translations/ko-KR/src/SUMMARY.md @@ -0,0 +1,51 @@ +# Summary + +[Introduction](README.md) + +# Basics + +- [Getting Started](getting_started/README.md) + - [Project Layout](getting_started/project_layout.md) + - [Validation Layers](getting_started/validation_layers.md) + - [class App](getting_started/class_app.md) +- [Initialization](initialization/README.md) + - [GLFW Window](initialization/glfw_window.md) + - [Vulkan Instance](initialization/instance.md) + - [Vulkan Surface](initialization/surface.md) + - [Vulkan Physical Device](initialization/gpu.md) + - [Vulkan Device](initialization/device.md) + - [Scoped Waiter](initialization/scoped_waiter.md) + - [Swapchain](initialization/swapchain.md) + +# Hello Triangle + +- [Rendering](rendering/README.md) + - [Swapchain Loop](rendering/swapchain_loop.md) + - [Render Sync](rendering/render_sync.md) + - [Swapchain Update](rendering/swapchain_update.md) + - [Dynamic Rendering](rendering/dynamic_rendering.md) +- [Dear ImGui](dear_imgui/README.md) + - [class DearImGui](dear_imgui/dear_imgui.md) + - [ImGui Integration](dear_imgui/imgui_integration.md) +- [Shader Objects](shader_objects/README.md) + - [Locating Assets](shader_objects/locating_assets.md) + - [Shader Program](shader_objects/shader_program.md) + - [GLSL to SPIR-V](shader_objects/glsl_to_spir_v.md) + - [Drawing a Triangle](shader_objects/drawing_triangle.md) + - [Graphics Pipelines](shader_objects/pipelines.md) + +# Shader Resources + +- [Memory Allocation](memory/README.md) + - [Vulkan Memory Allocator](memory/vma.md) + - [Buffers](memory/buffers.md) + - [Vertex Buffer](memory/vertex_buffer.md) + - [Command Block](memory/command_block.md) + - [Device Buffers](memory/device_buffers.md) + - [Images](memory/images.md) +- [Descriptor Sets](descriptor_sets/README.md) + - [Pipeline Layout](descriptor_sets/pipeline_layout.md) + - [Descriptor Buffer](descriptor_sets/descriptor_buffer.md) + - [Texture](descriptor_sets/texture.md) + - [View Matrix](descriptor_sets/view_matrix.md) + - [Instanced Rendering](descriptor_sets/instanced_rendering.md) diff --git a/guide/translations/ko-KR/src/dear_imgui/README.md b/guide/translations/ko-KR/src/dear_imgui/README.md new file mode 100644 index 0000000..324cd8f --- /dev/null +++ b/guide/translations/ko-KR/src/dear_imgui/README.md @@ -0,0 +1,3 @@ +# Dear ImGui + +Dear ImGui does not have native CMake support, and while adding the sources to the executable is an option, we will add it as an external library target: `imgui` to isolate it (and compile warnings etc) from our own code. This requires some changes to the `ext` target structure, since `imgui` will itself need to link to GLFW and Vulkan-Headers, have `VK_NO_PROTOTYPES` defined, etc. `learn-vk-ext` then links to `imgui` and any other libraries (currently only `glm`). We are using Dear ImGui v1.91.9, which has decent support for Dynamic Rendering. diff --git a/guide/translations/ko-KR/src/dear_imgui/dear_imgui.md b/guide/translations/ko-KR/src/dear_imgui/dear_imgui.md new file mode 100644 index 0000000..69e18a2 --- /dev/null +++ b/guide/translations/ko-KR/src/dear_imgui/dear_imgui.md @@ -0,0 +1,137 @@ +# class DearImGui + +Dear ImGui has its own initialization and loop, which we encapsulate into `class DearImGui`: + +```cpp +struct DearImGuiCreateInfo { + GLFWwindow* window{}; + std::uint32_t api_version{}; + vk::Instance instance{}; + vk::PhysicalDevice physical_device{}; + std::uint32_t queue_family{}; + vk::Device device{}; + vk::Queue queue{}; + vk::Format color_format{}; // single color attachment. + vk::SampleCountFlagBits samples{}; +}; + +class DearImGui { + public: + using CreateInfo = DearImGuiCreateInfo; + + explicit DearImGui(CreateInfo const& create_info); + + void new_frame(); + void end_frame(); + void render(vk::CommandBuffer command_buffer) const; + + private: + enum class State : std::int8_t { Ended, Begun }; + + struct Deleter { + void operator()(vk::Device device) const; + }; + + State m_state{}; + + Scoped m_device{}; +}; +``` + +In the constructor, we start by creating the ImGui Context, loading Vulkan functions, and initializing GLFW for Vulkan: + +```cpp +IMGUI_CHECKVERSION(); +ImGui::CreateContext(); + +static auto const load_vk_func = +[](char const* name, void* user_data) { + return VULKAN_HPP_DEFAULT_DISPATCHER.vkGetInstanceProcAddr( + *static_cast(user_data), name); +}; +auto instance = create_info.instance; +ImGui_ImplVulkan_LoadFunctions(create_info.api_version, load_vk_func, + &instance); + +if (!ImGui_ImplGlfw_InitForVulkan(create_info.window, true)) { + throw std::runtime_error{"Failed to initialize Dear ImGui"}; +} +``` + +Then initialize Dear ImGui for Vulkan: + +```cpp +auto init_info = ImGui_ImplVulkan_InitInfo{}; +init_info.ApiVersion = create_info.api_version; +init_info.Instance = create_info.instance; +init_info.PhysicalDevice = create_info.physical_device; +init_info.Device = create_info.device; +init_info.QueueFamily = create_info.queue_family; +init_info.Queue = create_info.queue; +init_info.MinImageCount = 2; +init_info.ImageCount = static_cast(resource_buffering_v); +init_info.MSAASamples = + static_cast(create_info.samples); +init_info.DescriptorPoolSize = 2; +auto pipline_rendering_ci = vk::PipelineRenderingCreateInfo{}; +pipline_rendering_ci.setColorAttachmentCount(1).setColorAttachmentFormats( + create_info.color_format); +init_info.PipelineRenderingCreateInfo = pipline_rendering_ci; +init_info.UseDynamicRendering = true; +if (!ImGui_ImplVulkan_Init(&init_info)) { + throw std::runtime_error{"Failed to initialize Dear ImGui"}; +} +ImGui_ImplVulkan_CreateFontsTexture(); +``` + +Since we are using an sRGB format and Dear ImGui is not color-space aware, we need to convert its style colors to linear space (so that they shift back to the original values by gamma correction): + +```cpp +ImGui::StyleColorsDark(); +// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay) +for (auto& colour : ImGui::GetStyle().Colors) { + auto const linear = glm::convertSRGBToLinear( + glm::vec4{colour.x, colour.y, colour.z, colour.w}); + colour = ImVec4{linear.x, linear.y, linear.z, linear.w}; +} +ImGui::GetStyle().Colors[ImGuiCol_WindowBg].w = 0.99f; // more opaque +``` + +Finally, create the deleter and its implementation: + +```cpp +m_device = Scoped{create_info.device}; + +// ... +void DearImGui::Deleter::operator()(vk::Device const device) const { + device.waitIdle(); + ImGui_ImplVulkan_DestroyFontsTexture(); + ImGui_ImplVulkan_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); +} +``` + +The remaining functions are straightforward: + +```cpp +void DearImGui::new_frame() { + if (m_state == State::Begun) { end_frame(); } + ImGui_ImplGlfw_NewFrame(); + ImGui_ImplVulkan_NewFrame(); + ImGui::NewFrame(); + m_state = State::Begun; +} + +void DearImGui::end_frame() { + if (m_state == State::Ended) { return; } + ImGui::Render(); + m_state = State::Ended; +} + +// NOLINTNEXTLINE(readability-convert-member-functions-to-static) +void DearImGui::render(vk::CommandBuffer const command_buffer) const { + auto* data = ImGui::GetDrawData(); + if (data == nullptr) { return; } + ImGui_ImplVulkan_RenderDrawData(data, command_buffer); +} +``` diff --git a/guide/translations/ko-KR/src/dear_imgui/imgui_demo.png b/guide/translations/ko-KR/src/dear_imgui/imgui_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..94eae35ecaa7a9724a9125ae78e33fbf73cd2fde GIT binary patch literal 24061 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 vk::Format { + return m_ci.imageFormat; +} +``` + +`class App` can now store a `std::optional` member and add/call its create function: + +```cpp +void App::create_imgui() { + auto const imgui_ci = DearImGui::CreateInfo{ + .window = m_window.get(), + .api_version = vk_version_v, + .instance = *m_instance, + .physical_device = m_gpu.device, + .queue_family = m_gpu.queue_family, + .device = *m_device, + .queue = m_queue, + .color_format = m_swapchain->get_format(), + .samples = vk::SampleCountFlagBits::e1, + }; + m_imgui.emplace(imgui_ci); +} +``` + +Start a new ImGui frame after resetting the render fence, and show the demo window: + +```cpp +m_device->resetFences(*render_sync.drawn); +m_imgui->new_frame(); + +// ... +command_buffer.beginRendering(rendering_info); +ImGui::ShowDemoWindow(); +// draw stuff here. +command_buffer.endRendering(); +``` + +ImGui doesn't draw anything here (the actual draw command requires the Command Buffer), it's just a good customization point for all higher level logic. + +We use a separate render pass for Dear ImGui, again for isolation, and to enable us to change the main render pass later, eg by adding a depth buffer attachment (`DearImGui` is setup assuming its render pass will only use a single color attachment). + +```cpp +m_imgui->end_frame(); +// we don't want to clear the image again, instead load it intact after the +// previous pass. +color_attachment.setLoadOp(vk::AttachmentLoadOp::eLoad); +rendering_info.setColorAttachments(color_attachment) + .setPDepthAttachment(nullptr); +command_buffer.beginRendering(rendering_info); +m_imgui->render(command_buffer); +command_buffer.endRendering(); +``` + +![ImGui Demo](./imgui_demo.png) diff --git a/guide/translations/ko-KR/src/descriptor_sets/README.md b/guide/translations/ko-KR/src/descriptor_sets/README.md new file mode 100644 index 0000000..ecdea30 --- /dev/null +++ b/guide/translations/ko-KR/src/descriptor_sets/README.md @@ -0,0 +1,5 @@ +# Descriptor Sets + +[Vulkan Descriptor](https://docs.vulkan.org/guide/latest/mapping_data_to_shaders.html#descriptors)s are essentially typed pointers to resources that shaders can use, eg uniform/storage buffers or combined image samplers (textures with samplers). A Descriptor Set is a collection of descriptors at various **bindings** that is bound together as an atomic unit. Shaders can declare input based on these set and binding numbers, and any sets the shader uses must have been updated and bound before drawing. A Descriptor Set Layout is a description of a collection of descriptor sets associated with a particular set number, usually describing all the sets in a shader. Descriptor sets are allocated using a Descriptor Pool and the desired set layout(s). + +Structuring set layouts and managing descriptor sets are complex topics with many viable approaches, each with their pros and cons. Some robust ones are described in this [page](https://docs.vulkan.org/samples/latest/samples/performance/descriptor_management/README.html). 2D frameworks - and even simple/basic 3D ones - can simply allocate and update sets every frame, as described in the docs as the "simplest approach". Here's an [extremely detailed](https://zeux.io/2020/02/27/writing-an-efficient-vulkan-renderer/) - albeit a bit dated now - post by Arseny on the subject. A more modern approach, namely "bindless" or Descriptor Indexing, is described in the official docs [here](https://docs.vulkan.org/samples/latest/samples/extensions/descriptor_indexing/README.html). diff --git a/guide/translations/ko-KR/src/descriptor_sets/descriptor_buffer.md b/guide/translations/ko-KR/src/descriptor_sets/descriptor_buffer.md new file mode 100644 index 0000000..a581a0f --- /dev/null +++ b/guide/translations/ko-KR/src/descriptor_sets/descriptor_buffer.md @@ -0,0 +1,174 @@ +# Descriptor Buffer + +Uniform and Storage buffers need to be N-buffered unless they are "GPU const", ie contents do not change after creation. Encapsulate a `vma::Buffer` per virtual frame in a `DescriptorBuffer`: + +```cpp +class DescriptorBuffer { + public: + explicit DescriptorBuffer(VmaAllocator allocator, + std::uint32_t queue_family, + vk::BufferUsageFlags usage); + + void write_at(std::size_t frame_index, std::span bytes); + + [[nodiscard]] auto descriptor_info_at(std::size_t frame_index) const + -> vk::DescriptorBufferInfo; + + private: + struct Buffer { + vma::Buffer buffer{}; + vk::DeviceSize size{}; + }; + + void write_to(Buffer& out, std::span bytes) const; + + VmaAllocator m_allocator{}; + std::uint32_t m_queue_family{}; + vk::BufferUsageFlags m_usage{}; + Buffered m_buffers{}; +}; +``` + +The implementation is fairly straightforward, it reuses existing buffers if they are large enough, else recreates them before copying data. It also ensures buffers are always valid to be bound to descriptors. + +```cpp +DescriptorBuffer::DescriptorBuffer(VmaAllocator allocator, + std::uint32_t const queue_family, + vk::BufferUsageFlags const usage) + : m_allocator(allocator), m_queue_family(queue_family), m_usage(usage) { + // ensure buffers are created and can be bound after returning. + for (auto& buffer : m_buffers) { write_to(buffer, {}); } +} + +void DescriptorBuffer::write_at(std::size_t const frame_index, + std::span bytes) { + write_to(m_buffers.at(frame_index), bytes); +} + +auto DescriptorBuffer::descriptor_info_at(std::size_t const frame_index) const + -> vk::DescriptorBufferInfo { + auto const& buffer = m_buffers.at(frame_index); + auto ret = vk::DescriptorBufferInfo{}; + ret.setBuffer(buffer.buffer.get().buffer).setRange(buffer.size); + return ret; +} + +void DescriptorBuffer::write_to(Buffer& out, + std::span bytes) const { + static constexpr auto blank_byte_v = std::array{std::byte{}}; + // fallback to an empty byte if bytes is empty. + if (bytes.empty()) { bytes = blank_byte_v; } + out.size = bytes.size(); + if (out.buffer.get().size < bytes.size()) { + // size is too small (or buffer doesn't exist yet), recreate buffer. + auto const buffer_ci = vma::BufferCreateInfo{ + .allocator = m_allocator, + .usage = m_usage, + .queue_family = m_queue_family, + }; + out.buffer = vma::create_buffer(buffer_ci, vma::BufferMemoryType::Host, + out.size); + } + std::memcpy(out.buffer.get().mapped, bytes.data(), bytes.size()); +} +``` + +Store a `DescriptorBuffer` in `App` and rename `create_vertex_buffer()` to `create_shader_resources()`: + +```cpp +std::optional m_view_ubo{}; + +// ... +m_vbo = vma::create_device_buffer(buffer_ci, create_command_block(), + total_bytes_v); + +m_view_ubo.emplace(m_allocator.get(), m_gpu.queue_family, + vk::BufferUsageFlagBits::eUniformBuffer); +``` + +Add functions to update the view/projection matrices and bind the frame's descriptor sets: + +```cpp +void App::update_view() { + auto const half_size = 0.5f * glm::vec2{m_framebuffer_size}; + auto const mat_projection = + glm::ortho(-half_size.x, half_size.x, -half_size.y, half_size.y); + auto const bytes = + std::bit_cast>( + mat_projection); + m_view_ubo->write_at(m_frame_index, bytes); +} + +// ... +void App::bind_descriptor_sets(vk::CommandBuffer const command_buffer) const { + auto writes = std::array{}; + auto const& descriptor_sets = m_descriptor_sets.at(m_frame_index); + auto const set0 = descriptor_sets[0]; + auto write = vk::WriteDescriptorSet{}; + auto const view_ubo_info = m_view_ubo->descriptor_info_at(m_frame_index); + write.setBufferInfo(view_ubo_info) + .setDescriptorType(vk::DescriptorType::eUniformBuffer) + .setDescriptorCount(1) + .setDstSet(set0) + .setDstBinding(0); + writes[0] = write; + m_device->updateDescriptorSets(writes, {}); + + command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, + *m_pipeline_layout, 0, descriptor_sets, + {}); +} +``` + +Add the descriptor set layouts to the Shader, call `update_view()` before `draw()`, and `bind_descriptor_sets()` in `draw()`: + +```cpp +auto const shader_ci = ShaderProgram::CreateInfo{ + .device = *m_device, + .vertex_spirv = vertex_spirv, + .fragment_spirv = fragment_spirv, + .vertex_input = vertex_input_v, + .set_layouts = m_set_layout_views, +}; + +// ... +inspect(); +update_view(); +draw(command_buffer); + +// ... +m_shader->bind(command_buffer, m_framebuffer_size); +bind_descriptor_sets(command_buffer); +// ... +``` + +Update the vertex shader to use the view UBO: + +```glsl +layout (set = 0, binding = 0) uniform View { + mat4 mat_vp; +}; + +// ... +void main() { + const vec4 world_pos = vec4(a_pos, 0.0, 1.0); + + out_color = a_color; + gl_Position = mat_vp * world_pos; +} +``` + +Since the projected space is now the framebuffer size instead of [-1, 1], update the vertex positions to be larger than 1 pixel: + +```cpp +static constexpr auto vertices_v = std::array{ + Vertex{.position = {-200.0f, -200.0f}, .color = {1.0f, 0.0f, 0.0f}}, + Vertex{.position = {200.0f, -200.0f}, .color = {0.0f, 1.0f, 0.0f}}, + Vertex{.position = {200.0f, 200.0f}, .color = {0.0f, 0.0f, 1.0f}}, + Vertex{.position = {-200.0f, 200.0f}, .color = {1.0f, 1.0f, 0.0f}}, +}; +``` + +![View UBO](./view_ubo.png) + +When such descriptor buffers are created and destroyed dynamically, they would need to store a `ScopedWaiter` to ensure all rendering with descriptor sets bound to them completes before destruction. Alternatively, the app can maintain a pool of scratch buffers (similar to small/dynamic vertex buffers) per virtual frame which get destroyed in a batch instead of individually. diff --git a/guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.md b/guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.md new file mode 100644 index 0000000..3fed899 --- /dev/null +++ b/guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.md @@ -0,0 +1,139 @@ +# Instanced Rendering + +When multiple copies of a drawable object are desired, one option is to use instanced rendering. The basic idea is to store per-instance data in a uniform/storage buffer and index into it in the vertex shader. We shall represent one model matrix per instance, feel free to add more data like an overall tint (color) that gets multiplied to the existing output color in the fragment shader. This will be bound to a Storage Buffer (SSBO), which can be "unbounded" in the shader (size is determined during invocation). + +Store the SSBO and a buffer for instance matrices: + +```cpp +std::vector m_instance_data{}; // model matrices. +std::optional m_instance_ssbo{}; +``` + +Add two `Transform`s as the source of rendering instances, and a function to update the matrices: + +```cpp +void update_instances(); + +// ... +std::array m_instances{}; // generates model matrices. + +// ... +void App::update_instances() { + m_instance_data.clear(); + m_instance_data.reserve(m_instances.size()); + for (auto const& transform : m_instances) { + m_instance_data.push_back(transform.model_matrix()); + } + // can't use bit_cast anymore, reinterpret data as a byte array instead. + auto const span = std::span{m_instance_data}; + void* data = span.data(); + auto const bytes = + std::span{static_cast(data), span.size_bytes()}; + m_instance_ssbo->write_at(m_frame_index, bytes); +} +``` + +Update the descriptor pool to also provide storage buffers: + +```cpp +// ... +vk::DescriptorPoolSize{vk::DescriptorType::eCombinedImageSampler, 2}, +vk::DescriptorPoolSize{vk::DescriptorType::eStorageBuffer, 2}, +``` + +Add set 2 and its new binding. Such a set layout keeps each "layer" isolated: + +* Set 0: view / camera +* Set 1: textures / material +* Set 2: draw instances + +```cpp +static constexpr auto set_2_bindings_v = std::array{ + layout_binding(1, vk::DescriptorType::eStorageBuffer), +}; +auto set_layout_cis = std::array{}; +// ... +set_layout_cis[2].setBindings(set_2_bindings_v); +``` + +Create the instance SSBO after the view UBO: + +```cpp +m_instance_ssbo.emplace(m_allocator.get(), m_gpu.queue_family, + vk::BufferUsageFlagBits::eStorageBuffer); +``` + +Call `update_instances()` after `update_view()`: + +```cpp +// ... +update_view(); +update_instances(); +``` + +Extract transform inspection into a lambda and inspect each instance transform too: + +```cpp +static auto const inspect_transform = [](Transform& out) { + ImGui::DragFloat2("position", &out.position.x); + ImGui::DragFloat("rotation", &out.rotation); + ImGui::DragFloat2("scale", &out.scale.x, 0.1f); +}; + +ImGui::Separator(); +if (ImGui::TreeNode("View")) { + inspect_transform(m_view_transform); + ImGui::TreePop(); +} + +ImGui::Separator(); +if (ImGui::TreeNode("Instances")) { + for (std::size_t i = 0; i < m_instances.size(); ++i) { + auto const label = std::to_string(i); + if (ImGui::TreeNode(label.c_str())) { + inspect_transform(m_instances.at(i)); + ImGui::TreePop(); + } + } + ImGui::TreePop(); +} +``` + +Add another descriptor write for the SSBO: + +```cpp +auto writes = std::array{}; +// ... +auto const set2 = descriptor_sets[2]; +auto const instance_ssbo_info = + m_instance_ssbo->descriptor_info_at(m_frame_index); +write.setBufferInfo(instance_ssbo_info) + .setDescriptorType(vk::DescriptorType::eStorageBuffer) + .setDescriptorCount(1) + .setDstSet(set2) + .setDstBinding(0); +writes[2] = write; +``` + +Finally, change the instance count in the draw call: + +```cpp +auto const instances = static_cast(m_instances.size()); +// m_vbo has 6 indices. +command_buffer.drawIndexed(6, instances, 0, 0, 0); +``` + +Update the vertex shader to incorporate the instance model matrix: + +```glsl +// ... +layout (set = 1, binding = 1) readonly buffer Instances { + mat4 mat_ms[]; +}; + +// ... +const mat4 mat_m = mat_ms[gl_InstanceIndex]; +const vec4 world_pos = mat_m * vec4(a_pos, 0.0, 1.0); +``` + +![Instanced Rendering](./instanced_rendering.png) diff --git a/guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.png b/guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.png new file mode 100644 index 0000000000000000000000000000000000000000..766a49c59495dc3da7c6d038d4c6dff36fdd44b4 GIT binary patch literal 29662 zcma%j2|SeR`}ae#rH~2{B2>0Xi=7tbI6|8(jG0P~-B@DK7?I`JDp|636xqg>HOrt( zSqozn#xjkuuZ?|q??>nN|Nr0j^M2mX+vl7U<9@FDy07bdeXr$yobVe)di%MLazhZb zU;hu?TM)E27=re=aKP)^T=)gz#UzRwz10vu<9?z@ho=&cI_V>|F z=Fo++YF$3;TK~uA7SOr#s_hLm zPY47_K>E6u?)V_52mKNsm{}`r+IYz%aJ?1?)8}N7zI5@jgjlfVf_sfF(&bP5bE&Xv z*jf?nN70*-Vxp?=f@#t<Fwi z;!n;~Dx|GF;9L9zznJTbi>0qN;P0TND=1B32}fG%_8R;>QQ2ah=<|y8o9((4{4oAe z{OJ?Oo@ehP(#-^QWZ)+f%M{s5tTz*z?>)cVV)0n9)YlsR*j%QR+un{@EpTQIJ@#IE z+rIVy{4t`&{%Lu)Z)*4}QieyD_|ls~Uijnd)HhB2`ZfWQW2ZJ#dPwRyQ>^gEgJ*Ie z?^~4AFf7*<5)%_WrB3Vl6vGAosJS4bVWLty3uA3JS}k@hdWt4O@%oXpJXQAX_X@nr z_}vV(nHW2(LKVW)_3LI=8ryMJ$y)VM?KRC0JN5z@cx=V1Vb8OS^0M!gzUeiA?oTN9 zv*O(kJDioLy+TuM?5rrehqf0o<5QpZ3P~O6eMtE5%0o8GAdvP@JH9=|(!sBwd`U7S z`GZBbzXGh+k^c9W+tJAEnSt`9AAN0Q7d&SBypC%Qw2_Kld3Xd7&b|}>=3=DWW(6-c zKi3re#(C^O(%E;g=+ajnq=&r?Ki?JVOk%6D9M3T&FAQ@7?PL`dYJbz8g z)#;(IRrKPI%#>J1^?HJtSJ9zytgS{`YyDG2X+Ft_aqsABJB=5m zd+Djk=4g0ZF=d)k&i+jVnpUq!P;o|4)Zoiyy)`z(A4yvRF&(sxu)6n zF1M8^kHla-+Jed(?7C~RkU0)6CJOgf*Cm?LRHiqJ6CXip(^LC3bpF{+$@T5O8<&eU zDSMNX@cz|rR6V#c|GlSh(uACQr`^#q;$5MN@Nx>8;rip;p3i6-$G$awGUH{LyXZ}8 zxj2s&jINi0{p5bf6bg(2JUU9_bN&aUNo{@{?X-zU%U!kTcZB`Q(`ro}Loe<3Ml{uR zsE#F+U80?)r=UqeJZA$Et6*gjhR#>o%a>lbZx_Kox7LRu{W;!_qJP=y26=y)7er`GCg^ zdhD90X1%@Dvb)#PWV8poSky|6WEk=)S%j$xD}6HR;H?9GMrr|lm|KDn;O8Mn(`67mW%Bq_vObd6j=~MuQlFz0qwY6$hnzZuMV&!x~lWEE6p1>0(_^ zNbA}A-iuUKt+x9glchWdlOG)sLN2pkWey)KuXX9i@^f@LbE8@@FDAVhrm1F>LJgxI zJuR49W-#vX*qee*@ytuKH>Xnya_N)nCJaW4FS*K#CgaQ~PgQxZzcGlMjsoNCZF`WBXzypEKLkrkcI!m_eA9(^X`}w=3ecgNG18f0ufw> zXj|*TT%<|Fy93BPhbnh!-Mth!MlbnAE|!iVR~jW_oyQ^{3>pT_*t4H}! zx#!abisM9M(0hNLPCIrL1lY=(bX!prkbO!$f&@&c%)GN^s24))%DnA-3ytg67#3XWU1Vs zp4_|I1ixripU&Y$wPOiPbb9P!bx`zFq@$6eWlN*z$)HYUltOwp#`kA!uG$*ryHa}I z`Wj|%;7*=80pN4mA3nBFZ&AYowSXJuKRU(iQw)U7le#tLMT;?l`0A-Qk%StTQ}vJ5 zQeM)k&U8p%zLtf|WMh!x=d%5cNE5ue);d~@m=ZH>$}vW#zD4H-ec%o7ujBn5I3+{o zVwvnICJYm@7eGji_x)LoJddcR*PZw%~^ zd!=WyGF{6ZTQI$nsV>n$GNBYyBfBx%DLvMO`RDDEx_d-^s5UiaIi6=qPG0HK^lXn~ zA|Iv1Ea_1VI&A|)YqJ<9#1m@6f*gUP`?0Y8UrqZjmZX?POC<$$DPKSKE2VI~9heZS z6mW;Rh#>>ncgR!GdFPnPzE?!_@T%iSo0ePo$_(py%v(trNNhna&O&YqFh}lWlW0Pc zFMrU+uGroTL`jZ~VAuimS>AUEwdV-?!lov35`I!n+vI6>q{o&ZDTSrqadI?HUJmO_ zu=0uN-kden0L4x@@tm}k)&kKMj~~6=m^G{AZp=|&d2&kmeOPj0xpIcnQ3|s~4O=V9 zU|u58m-$U7a^l$9Sygec&ZKs>vZp6PXu#Fhz(OeV=9Sj!r51^@(|^reecUI);cHv# z-_zb2lh=$@n7it~o|QF>Vbsj=Zt5iIq}q@8fwHk zqS9Y?;MlrpyR%>FViFyL%$p=1W0d7$>~GY!oMgZUDiXTJb&MnR_HuWnzfp^CRj!Io zN2lS4Gg4_~-|Vq>1)}e=F)ick-&ISnSiIGk9aiBOqfl7E!DK7vv`)^=9_vg(+RrUd zD{a}@{CIH&&ELcoXjll}1Ne!Sy8 z0hqTYJ-U^Vd$&Hzw4%#fTBD=F=X2+T_`A8*u{SmOHP@6RmmhAax}_jB3Mo%NO{h<# zoTi^o9y4l_XB{~`F=p~KF~|WBb|#N!>)kgCIoVpHYO>T7oZZZK4~jGCSU{sNhcCPv zF=h1!lkynV8h>SOA#P{0t0PZmEj)oVh{lMGj~xh)dhM2EcKC;>b*3Okr(szxwe5|u z+u2;gO%sD#O6jp2r6y%1>CLsOK2KdOl$wU!2O`4az@MfL++@H8#dW}kHsVdi+D%g* zGXlGJlLFRbbtLo?I`mj?J>?r|x^6V8P@{HeZb;ahqsrdPt?r*n`;_$9N&Vb7lD{3(1@C~RB30F&hL(T6M7xqPciIffY7!`mw8bh-f^yq{>48)G6zInt zEnHu$dv)q#w>GP0GI@e;3;Exe>FE|*NKyUyb*^e_xqr9jG8gq*nT^5)3?0`i6nk7a zMc8QZi+EHhq&Hp2yT7vu_J-0EGZ5?F#-$@{yHlGq;;ZFTBzVhc50d|#sH zk6Sp?KW*9{HB)O(lPr+nU>1?MpnI<@CPoz>=tPyD`lQskA|_JoirL zO!wwncdzsZCbcySRg3#iG3aHNV&cNgzn3xymZ9Iz`n;t?Y#bB84BV^@8z)g*CrAk{ zVSOs`SNq`&h^jNxS`A54-k7a@SG!GlH|_;oODtqJBFS+8vYaCY(yVgz?yR)j)qVW< zUb8SKBi&5|u50*3Tz$z>?fN%_$}=T4yA(%#sj(DO&xWG;Xu4Y4l9CbGYB& zeH+~X@Q>@S4L@3P#dJjd&I29f$_R46T@Sn4(I5=;j(PQb!+0z9>C6KwT})B_SbJ5e z-LSz~j60i=d!s^-gOcZ97?P^W`7K8v)DFg@*zKO%QQZ6R0MplKGlr_&_n~X`O3ttQdAlaoyT=G*22k1;YGmi4GAmsEVu6ZKY0PdN;ed@D>k{ql z?tME5+>{DVE13l%KJ+JD5fjbU8GT<;Gy6*~<;c*&GmZqh4E9F1Np z6Dc+Eb}#I$a&rwoonsxTHYVgJ(5!F*ts+UF^4R{1JH)SeC#sP7YfkNSw6?qSGIc%9 zTy3EU$`}8_GzttZK%~ahq_h>Jx;fv}Vj8O~p5JnyyXK{u>9K?|b=yKwSubXB@->N+ z$aQ_Xib~WHZS!VGEnUR2uE9Rs=WQHPNz7yYIX{0fW6V)Xa`ahd-T8lpVyMUUKHkjU z8VC#z)m8GvjMs`Ek<+8fx@-y{$v&-Dy4f^klK;TC%nQLYXP0r@DE9J=SFJQrmKA z?kPh*7o%D>^pg_mt0pQRJ)PgGr$4J)xw+wbGhl88oT`Lb85X9x`DQN4PxGhjXi;pP zcfiFOW?v=gO4<=W*A0j1+L`t7m32&K!Pe@s09zvj)gqN}i?V5AuD)Bg3w7T0axS!9~ zeY~1U|8;56S#r_;4E+t3VBTQ>+8QkTtI3I~N!2L3ho*sUan&L>ds~yu&Uc8fUHfLA zLjCD!HBm`cm?CXydF$$ajQ2}B#9ynr__Fl=(5!3ob6!o2^^He*0V{@>)yF%I170+{ zf6`6&u1MC|nn>_K^Z6b)W!&h5afIN`_Fl|#c{XXNc45(HLcB&*?9t>EDam^)vx5uY zJ0EMOt!xT@6i9oou>F%BaHM`SLPrq9`iKZ&sZmf3lMDbQGD) zRG;DqkibnuuV^fU8{sXSgho|Nocq+YaG;ZO3=jxZr)k39kn=QIcdm;M5e?m+B*xHc5gskMte?P3BvT(bs^G`%37uJH+%4qb(I5g=5wUsw1m3 zz&sx}24w4|>irq!Y;@CH3iH}nN4(Z zZ|^A6wNi5y^Yb~T>#=bgfp38kfW`QaH;G3T;+WMwG`eeaCvJ9WDi5Tnkeh-X@yBQ1 zO%iUeR3E!B_QXs0-Ye-W%!AGeP;TWVC+L`^TAGRLGwYwJ9PN)NyRmY2B9>5XZ>uDp z;EGCHW$Z|2bTL(CEOe-Tt%Evl`Pz#r_lBHpq6Td?{+O<%M__uSaN5g+Ej?Y`>Fpn( zlD_;~xQ{Igexu11E-qDC5V1xBoRpS$KRSA6JH?LVk+vl_#gvNCR3?0wT?bUQKAuSv z#4X#6egjsiWN5|wt>w4;ae;J9Q15}9os=YXCy>`gNOlKM(jcM^J2Pf(VG&+n855T5 zT4#GjNpf_L_@X)n+>Q-#ZUat^u8-=Iud`}M#)&AK~O#k{}=TurDUv${&G()={T~q$ZL)5G1ricT; zFMVVh=5K!fxZ|@$Mgbq~qbOf&R#ZS>7Uy5yZXenf=P%BQ(XkD*KWwKnOTASt&Q!bq zqU2L8M|8K^n#ZkZ(y5)q7p8?|8NRglxgyD+*vX-uBlz8s-ijmCqFt>5Xlbh3g2gPImye zu{~tN0wEMnr96f+L|7P1!8aRw_CK1d^FV#wc+DGd4oAaw7H)Z4iJ0U)Tf+N&?v&yU zZbhhc^4=bXQ)L1p?zr27GEG0H!+l0S&ULr^7%qD@^wZxe&8Bw=vwgB@s06uTKwoBV zED)?KX2gGO6f=_3E#?N-+Krp3wH2geHd~B6ameWpQ)87=W1Xay0zW{pjO>b!b+|S3 z9!Nf6icqf&^PQN_;up*ylj7fTm%`B*Q+ zSA43V?%)=BWOYs%sZZ2l=>62X*8x)n70tZ`mMT4U1!IC_I(5C=`(yg{oLRGoQoZu_ z@TdOWa0mvAV{GbF*4n4!1U9PjF1pyEH=TRGdjWvMr?Ru*7gIJdnXx~vm$-)wqtt352NlDU*{ zb)a%be1$S}Xdxs_m6I` ze6UGzU)(dQmo{JN^EpWTkl*rjI2?tVo9{!f7E&UlqE#i+{HPxHY~L=V+b1v6m3Hj> zr)_k^>VGZih={NC)i)>9Z>Ec^r?2*q7xoP8JjOI~k@Ucmp{eU%eOkWjRHKbz6SgMO zKf#o!gd5p+4{&*%@1WPWxfR;4(7BzfSXt2k|IHSqt;?7r5b?p|@urP{iT;{D@}A{s zkMWy{n?0?wMJ7&y;)`CD6aR9_V@>UC^?IM-vd#CIJA+}1&0{JRq7-tT7+pjI!Bi|M>Q=`>vqvnXa2nzc*JvX?9NUnR-0jxgKz}#1r*6iQR$^dNJ5oGz%1%%BW1bS$xn|nfhF@p7N0wxpP^Z2<8W(WH zc>SAfbDGx1PG_!Q&G^cwhH-#y4Jdm)?XI9j*!*2lOS4|1%Z@Ip*a(xv{N`G0WV{#h zl)|mWcOF=+n*|8FR&6pdv*7GC)AXGWDW+2$8gqX$0CO$OcZ(g-S;Vo*^3^kLjMFFEuTdjaQ49Ff6mVMlcE_QEQ0NGec_tyr0vC09p^@eXB=pB_)$?4HMo6Tvfnchy}o&IHy zWZ?@*2-PCy)AD6uy;X5*q_19Qo*LHYJ&ZMeWW^lNnYS`A@Z-B4ds*tz#A6Jd&@>u9NDt+KweY;y!g-r7IcABcI9-d;mExJQo|8t1 zrL@v&;wjnp?t;27tLI#O4z|ESbNu<`kwe>KB>RDuf)7%PemiMCgC>47%a|z=CXfGv z_gsYQKv%?04aQ(P`A0uHEIv{~;lQ9ES?%7(!Pm~BJ{?V?zdk#zZJr<-crkOpNY08H ztiD#`DX`>gQg4skPSNQSNeXSm)|Nfq!ugM^hbdW!pJ|+cB@vx|TA+3O?(F?&qIO?f zF=(&^>1`!z9q_fr@YTblS3^bREy-49o#Lm)3yzvSZS1buozN1eUw%iMgqZhw)c%dJ zh^YKvN(KYS^u$Ghq`1vy@?h|0)Jb}6uH)OzQtx5ac74+BR-<{`xIE=X<@@;}W@H0w zz}U6@!L7#SVA5Hge1lq3O*!R9XC_hma?ilai&k5#iYA{ccUNOU)U8#z7~KL_4{`MSFP(?N3@Uw2#nBkg;P)zt0<97)6lTB#c`-@Cn^ z6l|l{j~ARuzD^R@`s9{;rhr^*qLTBcSYLdZyA{)l8P+Gn%^*E*hkJVHh-J&(rF=xx zQc7{I>BDFfnw7QIz54~ZI%i_JgOjzxH)Y6Ct+eW7%idTpD*Z4-EJ^r%uldPz>k!B84*bmhZN<#Tf=#}ot+kFN zA$=jK!f$8#}?I@vRs0}@AJ$>vtJ z+KFO02`_6)OudZM2pTSD(-Q638s9EnJCLVYF}eS9`VwtXuo3k8dFN)?X+0R3wKQq&`9_DFRrD4 zJ0eE4O18gLZglr=Fp1fABu2O97o7?aeWRHT-zdsBqy)Mp^VX%DootU(U9H({|KexD zT>KY%&Lxc{>38Vi^prPXNCNITbJ|m0N1o*qOUO+=cJp!O6g8t-MYgbCaTjs%1^_S^ z>-fa9ys?*MxgHuh5rJ+wvty=%eYwdtCSYh!*gd9vnzEfdX+kx?XmYYD3rU!%DNepB zF|Zu#e6~>WYk}{cCEsoMU{Ji?tNo_*r$K44{#MJ9xsGSg&tCLNd{&lX=H)WDUx9Je zNwZ#4F+DGOcLoK+&h~=&!%!1|II`+Lj|=`JlP(;g9SD|vz4*;p74Cpmy&UJ-l-tW5Ud&tlSSf(t0n@?# zxp@gKYHL_8lD(D5E_oa=yM4qw;qaKnJqt&0<1A46RzC6@BK<*sm6z+Ex?3W*#2Buq zZYJ<&hxSHx%Rz{E-3s&Rt!?;7oCPY4-$h30I)mAIt%qVT;nm-E?E8s5Bbax70xfsH z8@H&@Yuo_=b1XCoLI}rgDQ2IE?bE6fFdFyGB|oh+tbLWpjOVXfycVCk?p3xKb!zBM zt~PwY-)y65W@dbCroHVw>qvRJe?QiQy;hB%W2Hakw;SR$1>~0+s@sY*vmM~;lNN-B ziZkGH-3{aXiIDTm+&62^L-G*x*Nk1jvR&&z@Zv;5NrUoPc}IKAFPfNJl!Ei^7gg{1 zr=!TpaWQ$+H?XeBi>o9ZZR$d__e9vRY<=GRjEW%f*cWOkOj;rd2@^nN4R{f3SmyR`1q1 z^pLHkO}9*Hb9*hUd4prKRF2yx-KON_g7M#t*~fE!q)t$Lf3(xt`0n#90(qxAv}=ml zD_(j)^|q?UpMPkycivAb+zYkU{^Cup4jAqsgL_|(`=){OZ(NasOpe+Sa0Oh#p*vw>o^v>?mzpgkw?v#*KXDsVFz&m0YWJTv_)oKv#qna^Q?u1 z+=htquC8z-W*QvLDwCu3CkD2-~IbCs;qS01!BA>-b;` zx0KtTg~Yjh7rBZnz}R@FB+XiMGroF?L5P(fKLe9zD8kH|;v`!M(KBhuU&oF*Q~v^D zB6xB0K?{*~noMfxjTl`QYy6dcPsT(DNTuZwi9H70vDjRg`#Tt}+54V*|l`yqhu zaP>jX827UtYgNvLvB=UHa3TBdSCp&26m@e@seoc0qY`;~vze)aF?W5bg zkh!|EM??A2*flfO5q-W@RtSNa^Ji$#Ffo2s7Gf54N#z5Rubo}3y3U90zttKen`+rh zdOKOxg|ROD@{Yj*dAyz#@w0w>=v1uej*fpbs@IRx?A4txjc`X+sOTegd$}U!JkKn1 zcKhl>lj9Hik-~pRJA7qMMt4_gR^%tt_K06go{Fn2C(*$r>3-kuncdYwoU*Z%;jxuq z6mKv&8lj|U0LmJhwEfXivZAE(Sy`=tZi<6Fm?5hX1ROx}>6iykJYFeu7)Xd>+}w2% zRDkio?WLnfszC=$DNfGyks3RMFIL}}PCpGq$tSoMPYxuJE>`~OD=?-GZhkZT2$iE< zC2SDU{qtGU(=*1F*LX5{!UQJ`ccV|{-iXJ?tNVkeezGhy*6+SpLS#3w)Om>=xoj62 zQDV!M{Oi33@YpdF~>%C-Ej^LTf-IoWJE=ydOQ^GR+Xnq~43PxC>{#03Kz)0)D3$uEaGR4Of@)#IOL4F+GCG56+|M4ByfBUYK z&uI#N7z*MFhAj@o2iu$m6Q+T(<)^D%I`uj7g&LrFN_hKx(2YqKX?ApUEUvEp;bV2) zs4VQAW_F6sUnvx++(L^#YpW>*lL;R9PbJ{?uB4|WC~f}NZ_vo{J)EUCI0%*4{$l61q0xew!5$CC7w0?53>K;T>lOA77IJA zxAH9V1p%v}Dsj?4QsO>V^j&@&ER?ueY755;^gqG_7@x>CNE2HLbKO~Xje+NKl9DbT z!2EdHPDiAI>g#w$06ZaM3})5>?k%UXKL&|!4v#Z^r^@a}tH~H?E__^Vv(px!Sa}#; z5P?^A#`AkpfBd*>!J4>FHpQ(m1fe>?^aT^4foyr8DDfj#@b~viojN+mU;hZk(E}%+ zP)q8ntEPsnQoBJQswk~C%NRzE2< z%OMy32D!F+M)H+kFL`0w#0P;!|Eqoc3f+0ugWvT4h?oW77p(lX zoy`2v+Y0(8&$}jkJP<-g&K95(FFY>p!_)Qf0CaJ`92^)A^@;nS>(38^OCG3H*+EEi z5(^Q#1Ym?*x9p!ep5(Ob51~$dR|aJ&>TYl)M2zGLwx{QprrnB%;(K*Ao036Yb}so2 z-#|e4_->&J{?gs?2~l zB*)?vq`(Kwmrm}3+E{kAx{$XI?Ix(r4rMIm!>|^L<2wQ+o@GT}nAu$FR5F-StQ>w) z;`ywstc*z`lgasKtHGDW)*zY=bde=0#rbPXI3YKcKtyu6*Ho|ST+LF8yOqz#Q`;Qi z=Uhk-!moWJBZQ!gz3>t+rBt2DFCG2WZERCG1DsUuI+WIa6j|r4Iyy{lYWlT=O!n2? zn7aCY?yBej2ZSwpMR1tMX@f;G3yX1 z&i3legSJV+6acor+&MxCw-8b6++SXDo!!95@T3#} z6I5O>3!WP+HZ?B_Rt5DiJXP5dOHuVID|cRW4XK&!bbTLVo|t%Ux*G zukj5ISfp@W7S6&oPg5zNHVe6Smrmk>F6zlUaKgvD0pi8O>$tsz(v`kTlVk4-c#kqB zeZ9N@bno2^LP7YW<&nUH@!ciC4XukSyeOdO%JFm9=Q_KM=Ib zKKopR&DhK^ybyjj%|=}3H{j8!U=U?$W~MSN?(`M}QVKu2 zv5k(TuPr}huFHx(@`6tYLLJ}&lpxa~1|o{+^j)@61WaX$4#5FNoaQ{v0%iRPSQomU zZqhLLQ;P-vR2H^kmLA{0W2!i0{ujs$AU3g=uR(YtKF-n`(OS$ew&7|XP2>buAwOe= z%~~33QE+g>Que?0WQ9`(Lih>rc}H<5{55i!3&}&h0-67@>sZ?Hi)_%iCLG21b^&%J znK?N~UKBjF&(_(wK)y^F@QXp`GG9dJ#y)7@r+9wERf?6Dev1E?nn<%g61+Bj-d^3c zN31<**7|m#em6FAIsVh+q=UuZVOxQ&)=K|uYeEj3TrAMoi;F^8CwM2jDtSV?D|0As zQYgzwhFVE+D-NP7Wxv0HghVdQyHD!r7Rs|iOMgi4+!i(ap?)p_tpIim)(-Q)WxdNC=;KE;V4{!f5(Bs(UNqwi4`!+*IE0;QT zbIuXgtonhMm)F+w&^&v`&tRkJJ;rC6)jw-=~J)|!y+WbA|Y+52N4GZIGbelbMLeuig|dFJ6tDstw2@opMEUN z+{{|KHly(55L-6+19UwM&=%@AAY_^GpJzM2&;L=@e)`J8vDg)ihf_C%I9?u#;tSA* zPy~zPJZIe(Ux@^Ku@XC^!c01ss^Spy&~SwSj5Sen)6e?OO6!l743)V!mU)C+a5BNt z?xhD{<7d2p@HvCgf4ATXqKxXEOpET?sau7PNsVOq6?V!wyO+p*Up4kbkte8YXeBh1 zXbFcu-d3829ds{n`C)!xnd_nGrZ6kM>I5GbNy(s1ZSEB0^a7EnzqD@*Xb&?8iXVpeI}|T0@&pihWb@S?d=>gB0G>Q+ zAi%ByXRyUdQrh~@61KL)#~CbH7lp11_8AC4V^83uf;pN`;oT04ok$AI%??NAHry z9)WL%T8uvEt?+Q0>djEdu~|6lLg!l1J^2EFW4|8Xg@`^sd(*XTBZ$}rzzJ#qnP03> zMkbu%@tB2uG!!C04?<F_okM4!#M3ZwWt_-h1q{Edq8b`;J-yx=LY#+j9af~p)|ONs03i;8 z^PtfA1qI-}CO}W$SpJd-1`maUxM}$xK;en+Q0R25et0`(p|4GAIW3w3%1qyrJYWAt z2vxuRO{$TxfXT*_@)W=G4ad=BygXWcwOuC9h|#qaNQRSR@m_PMh^tJge`G;;p}4q$ z(FZuUj>N3|nw>fJ!aq5*#>{2sYmXx!R^q)cXNPgdCwWpIfTVr>rOj!Mvu^Ds-aAS= z&ek4e>8Y60Ud*sDG1{3HE#%mW=Wq0?XioZ?G=S+rM}{M7MB(hpC+1U7PRI)b)-vjo zK`qEH`6Y#x1es37Z{2Jf0KbtjW&RXdGKfg1=~wIP@!v z{K5I9M<^GzzmB~~^#^-Hc{D!yAom`kZl5x%`U7eO%P@-C-N5cV^0h~Ve1gE`sW-UH z2Uz5ABf>;B9orFtFPb^s2{Ydru}mrr{-Qlr`B}T!Ts#Z>djgA^c~8-2oMqU`{}fVh zIgN&dK#hLg;x=AoMvV5&GbVd5Sulw8dlv4t(m!=JW*kR?w z9PDzGV&e`;NWzF~dyQdlP^ZUBxQF;+w`B3SA_LYZ--ijq1AP}=WYYNcX7{=z zNZ_D}J<_t@%mx{s=s~>=J-7%!s}1MCullh+WGnaQ1;5UG$h^t|9SH+<4Zh>~8c50y zU|JiGv>-g+gl|(8BVz&q@EjLg8&ug>RWf9Q{;6}NoN820rlNI zWFx5WUT2QcBRCA(7d+wX>v4dA$48TbXd&qY=ss5Ee?g;Yvok8-&me0cBByYmsx*! z^a<2NDm}U8!aUF*n3)Kv$b(b`6>+jPdiGuwwC+(QNb#`aXU&5pgvM2E{(?{^!H$lk z=wonY8y41AKuym!<-HB2TvzlIS_O|oeQ)5pZ|rwr)Z5#8K)t*Wz&sj+1vD0V zG4ZL?=3e}S`ItoIP{g>x(tbQ)QZLwK6Z-l&o*y(|wy(-V|GGEDIeyY61Il;~`=s}$ zJh0OcY<`{xCT{0p>-sma;_t#4DkJ_nXxfiNz(gbZ@$cc~{DUFUi&uG|(-z0uE~~-A z1L?6g0DwC5v{q^W-H+Qdodfv{CSNPf?7$yy?E&pJZU_;3Vhpx_X1>dqy=t)9c+7+P}Dv#ur5AXK?-#lCKuJU zHV@Fxz#$FpX#P#-?^PxrJHcs*KQAxO_LSr@N1az~*!mLcCTC!FHZV!m$XBi3u4ZdQ zaA8pia#u$EL1lBR!_lujOKc`?r9hN&ic$91HOUw9dJx+U_beHCVDZCK86U=SCvOO; z`uK&od$~|uC$Bn9XCtvjx4Z|lme^Bc@1*W4m5E_HX)etJE%Sw7982$(o|1R@UB-yb zMEQ!tNkl~nWJ`)Twlb;w(O=ziSNhzojxN_MGIK8vSBtg1c>Lr;gHmEp^y1!wcxk}e zkcSj6a_X{``9tLcAeZw2LSj!c<^NA9vwW>K#*h*9!_w3A=jHQgHx)Rd=n*oI!F359 zk9+*(oaWc46<_$dn{ef!pgjpew{i-VYC_jZ_UG-^TE`Ym(hO^5U%it zP{~m)h+1RDPHb`#`Q|yOo|&?zTaqnJ97Ic}2>T#Su#KhY4Q!Jj*6J)=g715Zr#Rpm zS;G+r>q0`BW763_;k4KE=JR1j>~oACf-~uyB#|UDoH!>Rykp zH|vP3MGu^WS%^K~kt{!+-vo-%9)h!9B$@NqRQ|@CAYS?&oW%aCP%3hI0J;U@2{=W4 zWij2W#Jh_ees+{TOfV1s;Hyaq2252av8RX)hWA-XZy-3UU93_5<$dGF?iQ>M+qA#B zAub{KH_W(JHqrRmiQQn4N5D{h`5D|I;Vs}{4>9<=Y@+(|F7`$6d*L=LQQ{SV<5y__ zQao4D>BREiT8iTLO7pSf!^|x$tlLPwS?$=zSlcS0$4?HOgA(rp*P-mWp1k6?j2;&o(tr}} z;7?Aip~dhw-^__W9{K}HyuHl#@b$lQ!wd6E8cUx+aDLBQm+PC;`;|Y+f$9KQ!@s@3 z4AO*nMmIR1h-N@)#LHl(h(=^1!rHk$02~#Ml>(SK5}*E!Md<0AI3%xZd9CO_o#yS? zJu|<_vwN5WdnB$l7+rF0YYHd|M$UjoiH(14)UPyZmU^*84yo4tmIv2*h?PyA1H_a5 zI}l13j)J!HI&Gzq0Eq3$A6Gy$uq1N8x!B`N=KvJhxWWs?rvh>Eks$xU_-vI=#7r-7 zMi5VlR{TWhNm}Yd$?r+m10cvpRVf5t^2I z7gc`yK=B}Flc@dOD0PRJ?+(7MpqBbSYP8bsPvSpW#JvB4-bFjF}jnfWU0N!jRiesQYFc`T0En}XLqZ2NctTMiR zfhqg#e=FP4%gEhnM=fJCq$LRomiyXym!QadNN^?tA-p17%e8$TM9(iKCj4tfbKQvf zt)^an$n)vpMhk3;^MBq2fDn7Oq>RH0NXKr*3&y7h{&pe)2S7r6$&AsIUbi%sZ{63* zyM%ab%2mpFWMKoIrh3BtAmVE4A@+?|g7}-O+bmG5^nb!4T#cb+`&`~YXqp2%9)eT) zhoN-B>&TxCJ61M)^3PX`yNqpcOkL@Hd>TxuVYto=r- zlU*VT2TC-OtAylrgI!AgOjNwvY|P1j!SyRnl!d09d01!A7n=zfj4~EdX!z(T^4dzHipKJfN-7t zJ?|CzUS`XJ%7Q8QLG-CbQb8(C=O0FW7AxW^D;m6cxY(+6$^cvgBRN?!B7z&Q2kG2v z65!s0Fa+cRK^F|c9D1n%W+Pqmakjyqf^BEG8i(8Aen0UD+;~Ak;XDG+SPUHaAI-x! z2SFc`OxBr4)xfG91*#EszodeitnDB)mJCk|YA6 zPB9;U^_SD=X@LPlQ?5M-E};JEPXC8wY5iCCtt)SK`Gwof@9)^M31Zhv9m;4WQ;{rO zuP(9|#S32x*1Nc^Urz3Pl&Si1fUEh$p*mS0cOV89s;?)TO^_lQDhIg^f+|l6OF}nb z0WsggIPZ5!`{Syg6zV4+AWL|ZDlYB)VuseR?3mXgGY#b~O$=Kc1M^pWYy&;fV2phHOnFdQ+EDI|% zcMyCBm3ndoq!CcQumElVU&Ns*fk^$6n_w=O#?QT{C|>6@Nnv&956Uu~qwWF=8>I3x zfC@o=-vIb{NIT*Xd@P|xRBx9w5Amov?0I&H?mbX+#uXt*=*2Z%p;*O{8LSb)@+(+y z3r38N8u-9V`5F;Epj8qdD4KvG>mt&}IfcTLxnP2?X3X!{#jOLhP6b0tfF zufZr8xF?ydA@UDk7A>IE@SSs#jft~Ar1Rwxzi~ZfdG~wMxCc%U(P9E<4$V>uWFu@)b=Ju!A^ugZ4ZHK|O5^zfGu13wWCAh`iFz0I{ zb3SGH%Mc#o&Ib+fK$WL~7H$rL06VQ}jtNBs6u}5+v(p0#GUDLp&k+8@SNJqkeG&eV z#g4Di`BI4*z{+l}u)YV4fFFaNhqFN5U@QkgkIvqMMF1na!TEn!nY}F)f5GUaJZDHf zIM3`C@i^dZMZ>YZ(0u3tu;3QEy)N6|#$H_eg3xJ-X#583QOGJfavzjo493B3YT^#M zY-y_h81#8OL2Ci;tiYgEoWKuo`7|J37Xd?}gkeLvIXpr6q{AX$)FzbOmXe&$DyRI(&4g@pc=5YjeIKoGs)FzQeIOP5Vs zes^ngur+1ZG}@DST5JvA{ULs^OT|A1Ld^?gv6(3i?(Ox1TuouXmsW60R~~zf@JGT6 zMGasliOP8IHLDIrU#|{kAzTHY47^Z8tM*#)rEon(U%!mTPpxLdm%8O8C)n7bVO4;A zd_VBdhVOZvUTGc>&OC1W;efy!)*c0OvmzaUQ)0oy!H^mG$42u9{}tT=JXf~N^W^Mn1PD(aH{>qG6!q~R2Oik<-8=~K zwv9VN`QU(WfKgL+jasUG7~We8j*)Oh^eXKggH7r6zf1h#y`J7k{2+3Qvjf-*n%liC z+&O!Xk0%m{BUZsJh`J}2hf3z7-^KvvUYggV0|spF;9~`nkHL}!z!F=#3C`JX{~r7R zz#vrls+1j=vj#pP;z|O-%zcb7{AU6<01&+j?`_QaRPBS@-iB8)RXIM$p=rimGOfifQ8wGzz_~X z?R|}qs&<4e>I>_l3jW_L|K-kRxQsOiTBOTx&I)ihC4#fxU)Vj>iC`ko*Z_c#xDOoa z9C}{)Uq>~+28;%=%K+@53}C+^-xwrnVU6ae{`FJjC2-Dp_SXnM_$sPM5RMI=%VzVB z{{6Xs8qjOlusRr zpOAn7VKb`&QU{4tgdg}1p$_{`;Rq z-#w#YqV9WsW7U_ffg*7z1f(gJW%xo0{}c|OlvLOQcGbb1#%A;90dirt^ig!mK)7tm zz|rCWgH!Zk!hF>@XC1F~Bb>;f4LCqWbx-;qc!Gi;0%-jq$k1#)^*;jOh#$UK9ZZt? zU*&yiK$2P8|7}@WW2W_#R;HQL@?J4)812a<>-t^4YdPmW+?d>V z1#$4>2Gd92*tr=(30VwGiT8u>nBDguQ)fN<`VSdC7W$mcg7B zKi?PVnYHsc=|wL2n17~C&V|$N_XpD=3Rtv2kK30B3R3a^3_u|=_wADzKTFL7 zn+w&8Azw;Xn}G7U)^vCU)N04s`O|kDU=c%S6{sOat>E24q_PCCG2A6dwOC-$_TV3e zl|x>KTS4?b+=MRJk)(j-=qM2II5ln38#%HcSmW}*bHWg0-nM-HZ+&XuFD5G2ooa4H z2?k*$Mn#7QPb4v2@*O}$X?>sXn#KL&? zAlDw;;MxDtbb7Zo*+kh=Y%fW(S!5KC7WVpmCZ-$*5S7g^I^x&ZPt_f@GOf+(TiO&( z;lc{Z@dq~4`EPB@@)f`r97KiMT{mr}qlSOD=oG=|0H}2A1#`t4F(=44b5p~T1;if! z5=0o5-B(vb$iWbpBI7Omr>-y@ta3{H0qjdn<5$5P&shjulKh*wm4pPP+PNV9FbJv_?lpqbgn(%t zT}P*J|2G&&fPq=P^c8xM0GdUF37gaI9Al&1-~Q_q)MTbx<;(|QeaM8~%DcP3Wld<) zSKz9D`fbE?51@(-M5#OPuF-Cg?N&WQ1|j<3>=e+_CRR9UHlEj5zxWv3WO#+9;84xPcby-z#fTT%G2r!Ko zdbUCG6-@Ie8&2c4HzIsj(if1+OcBLIAUtX3vfa)FsoxE=(#orCoJ))kph31m#Aph% zU%VnbEHfNQE`n~5G%-N;>|ljdq8E2AUTO9AC^}Iz7j28fHvo@*KvVX%b+67_6yEbc z0*(zB;A#TlGy{K1tRQe7&YzgK`#aERgGk^!hW;Mh)im3F#oB)@18+n^{v+A}G{+(zZh+*Cb`q4ry_w;={9ylW6ut>chlvqfybFmnd(VaN zUF5U#$-oQQaLvH^{@YzHf6;v*Jk(#IRg@|~Qi&JT!g^1Xu|0|9e*{pCnu`{9&PHI8 zyE82A)<0b{w#U9h;XxA(XWpLcl4t;K{6feT1WTB7iU0u|?+E|(-qmDm|6j0RG5x21 zUabcSlk*!~?~JW3U6TEG#(E=(d?pr@yTPy|*cnk4E!p)*oL44qs%K4m%tgGPqrqnemGy>gC9?k8 zL;cZS;4YBWuP_5rdO&`sJT}RynLoXA;&sDBJ>sU}W68WVrZ1-VfJ1_iv&aX?Dyy53 zK=JrvnQps3dH|i!7Me;$axBKUc1XM#iu3Rmpn1F#w743%W9_E~IRCR2*aTazj(t!G zOS=ch2P(zVnZ)kq>soXa~ATuCc=t?hq zk1rU7w$aEoP3+Y&z^j@5G@QtsTg$|Q$y$?7fFlE`FfCJ#qez8rnxBFJ#G)LB1&;C@ za&ycS1)u;w+*M|Ta5ke_*%?0rpM)zuLdbB73?$~IJ&xubeN5mT@KO%^o)c0VvbtN; zo)Hh<_>-kwZ{KD&GBCT}VQ!OtUfskZ^mzRv-r-q&)(DDyz2e%f{^hg##%J@u9wQK$ zcV=#i+-vlw^YN4KFbmLW+(o6tR~5!hWL9L+cr*Gj{F5KnCBKeN__QNg;Ur0Iq$|MN6^!eBXPxk+;omA;-Q|O``W!du&-6|jLFZExNB*#6bQZABw8wg{GKm{G zxv8d^m+Lz7?K?)K(>K)C1toGqbV6=b+D3Dl;ml3ax!kqr7biIET~6*d7VYOhuh859 z7sXw?+|j{i5UT*T<4)_li~GKIVv>^bb|k;DbY-oVyPDEO=+{tif$a;3m?E-Nu)qKF zj^v@6m1i^J!kEiOMcv-;(~??JXSlPA8Joo1R&GDL&#^JTW=E2Io`MgrQplzHh&Dp{ z5gE7sNydTb8r%v}zVcHTnGD`Qe{csbi#= zLfxj$8Cd*dtlICW4k6uj_e;ca8|>#a5yRf_EZq+)Cf(Wgf*F9yY9tlW!<{rBoW`_` z?(*vQ#^*&?O#*5t!=J;`=60PIpHTj|&%u=5darA%YeRwMZqkGa+ z%gninCAGgxbMAC7_ino8e1B?BpwC7qEI!S(yYTflHw6k>tv8iEyU*3Ox+-pOOsoyF zsMk-0;m?p_{Qi^Yw>JwCoOcfLD}U~Nf2z_ftM{#e!gg-V*~!csu&uH|RnzPn$Yjxk zikcjp~DTHhu%)oj`qSP5;x zEi4c&4HMOuyv$sK+gP>ExoR=CRU@uv49OqtNT!!M-<`5L*xK)BSU$Gfab9x`8qB!f zL*8S(Dm~9)w7yEP_3-p1K=|>sZKVdOG?C6KVol5*D7G|{`D{Q}c_2$%@&d-*5hzHX z`N#3X`&vw(s^V7g?7kZ3yYitge5}E6xs0`)tFmjn>BaR4pZs3^k7_N(#ER4HR>V_B zglF>db>(lnddm*8b&o`4=ZAx&4NoWf5iK^)s-tMwO(ECL%1yFcTCym0}S$CQ_QE! zG!F*Ujg8H0V!4oL{n$CD)>)M+;bK{!~Zt|0{x64Bt~ehPnL`LjTS z-ykaU5f%OE8pU?%!R2BxQ-%{%uD-<}r&;-63DYVAF3in#q@n-zhu-b|V{J7-+|3=D z^59k)y-J`RGVib%QpInP)`(Z?7?+9SC7Q6IB=?ns#@8O&DIHndplc>AJfQGu3@V&< zXwSHp((ReqJ8|n+fPpcfdsCq6ARdP%C;OcU_E^%Yrsnb!7=L@sD^1{G&2U5{B-i8^ zft~b8_=+`N%htX3^tHKIUs6?t50ur39L&?7rn`6?Uc}Z+{Pt;wYr_XTJ^f3<#5iNp z;fnp)Nln_#`ZI6AEe9+38v$kqxufJ#=F%RHo(+clJ=veAAV`aE5Se-0L~9Z&>J^$Y z8EYePfh6)7v33yGoMLmH;NR~awP9u7P(|^%>6bOt4%V{K)TnNC^eQkvh48Qw8z5FkTi-gu(8v>Z zncZx5%^xaMyC;oHi_gsx5*q^2eNu2j+o38vTluPA-YK%nG0A#f?D&nHqG96XZnhgE zER``iPHXmvnvU}EJipVJW7q51VX>vzqcOpndqaey881 zoC?#N( zjK~y(gdA(f!WhZdeQA?x{kFLk z)k=@&88@-r>VmJ1ozCd>lxlE7?26`zV8i>uu6ORjhMyfXKaQvL(`t^pGhX?e=E)5$ zM)B$FAi13|ik-yhr-?~SnD;mu{)EF%{GA|D=>yT_Ni@$hE(Om;D?Y#UXzHzX&apQ0 z*=|r122#95FWiM^FkIc}DEp>y6ZgesA!W1B_KP(uPky+^l9fLl)##b1u$)kkaklTx zeRlIk-7|ZtwY@_sr;pX!as*T9(+R1pUR}#G;?$tNMOBd|{7B6`Ae4O-kX@nuCLWQk z_vLnxr&8ja1It*Y#dBF2T(ds;sZUR%t0_ZA*8~aViWe-qus;YXw0%QmvZ#ks*Boc{ z(Y-`m$rkTup1QtjSp>njq_IJGX3xrqxS<6(h_11>AD3&pA?Ly0gcmG*;;4r>0P}H@ zPij%)m~z*{C<@3O%k2Ve;l&5K4*h4oG-t(&-HyxwjOMLHprXd#JxVW5c)F!ST~AXS zW@-->Ey%JR3fQwe>~(M?_1CtEfgkc$Jd3_W7+o~1s9UC>Pn!NV-7__K+1yPzGR9#2 zd|AjNKK9Dc4%nxiXGDB{;rd~ zahugS_UxmD1 zHVRd{=igjPCgTi9C^1BYzCF}%CgeQS(Q8oVg10R9b<3DjZT8jbQyu| zyrE&Reu_VpRbeL`vAx zXlx^-&X7Ezq8h(aUArtL1YfXy&7*cQ;ZoN(XG;X+er*~Y_5{L~XDi+I>jV?V1; z{x*H?^@FXpUfkn20)28SLOz+!^686Hn#7ihw`<1ih?a3YqNDb2&BzLUaw?Ngsuxyo zyD0`*Gn;UP8dfovn=tWX{|Xlw*MfYE z%4Ov#Ky#MDy@o#O8y5h+C;G}DW&Edm(@VW|fBpJTNM%}){h#gXBSqNOJF$hrgmmXX zf+k&m`ir$xAT95#yHz}^&(GjV$xdO&u>P8Ig+*OppmZV76xA5(jp`}~7R zbeGOUI65^kA*pBHm;_H+qz6e;;zC>Ht~Gc9ThFM3%nIdv04)hitM=Fb$f{m9t21?K zV}G8MUM@S}e(`axie=R-W~%IS``Nq%kQY*wUT*j;upy_gqSm>&W&~xl@kr`Y`-_h~ z2I&e9Nnu(06?Od$QlTGR&L^`x2s$6u$<-5W#hPDV<1ra;N?A-*LSdDP7#cSeV2%Ta z!l!}_23kVVk;^GI%?+eaIen=)_Cj?vZD)g%)PGYCoQs2@&$m&FZ#QaQ2C`CPsDuqG z{XUU^W5r@|>O*|9{`6M$LnT-&3GOTEJhqsdix2n*tl_76>mFg)ZtFkh_= zt5)E-=4s3?UP)gwB`tFabi83q9IQK$7#1YsS7>_bSD47$CVqS~cDj*SCfkHBR<_=c z@-SwowV3JKAQx$T#U`1@1FREm{0d43Sh#|+NERM^5?xa%%T7ff4rQv%H7#$>(1V%% zH6qdRy`Mb~tLRl7B;F{N-=+I+Fw@WqI>zhCfq{Mf#gjO4P?Vbf_+`*)HSXDFNDEfe18w zVM76y!@-6n@|TMWe*NH%HKgT=9IgA#wDpgt=4#o_VZlPR$4fh|V(Ng5C>Vryr6hP# zr|5dE8)(|P{?PH+`W99#UY6kXO`Op9Sz?9*c(8eZHafjJU~W@q@ub6TXMwab{wx~cjaxKOAblOu{4;yS*Xa`NW@1<^xuQ!p2C zOmb9AZ2b>(o5$-rYG{N+YdPk^=qr%vr?Rf6SWBZuPD&L!%VlYaj)F!}Q9O9x%XdvH znXGbS4(JXGcQRz^?rJyY{}-GC1asBmYT9wCA~Ar@A2~$tkjW305$;qulYh5tDxK9<8ziIeyLiX- zP@$(TDurGZseHS*rt&OKrm-ezN)uec)`42{gLkK0w@9_f!st}$pUgvC1wD`}d_ig> z_q%>{{U~N9ShID3I;qZ_kkVat66_HG=}7$b+g1D&LWb~IciBLSSlG2vlO$!682p4n zA@Kp&e#jMVIYg}!c4GtZL$Q_3aSCkRDxyZ_;dfK@DM^ zm%kh7)*p>&CuOVa@kO9%V#-q33^(PikfM-~nAYKVC7wvQV|hs%l}O{VCu{IRGFhJ5 zj^%yqCiiSFTA`D2%X`p`EN=P2ZxvIe;b)`5oGI=7HEI4)fx2?xKE9e%sMGQ$F+{M( z71Xt5N9s8yOTl*0bkayU34r-R7M7_1n=Pacp#6q$_{Wy&Pq%AJIzki| z?`gbT)2}Cd22V^2l#v>1i1~Hvcqtm?_{NY6nf^-FxqvvF>YxHRCGB1U2+fAC<26J< zUD7I@lqr&Fr8;!l(W1J?S@qA32>d zkGi>NdoyjLphU|9i>P`**L!RRTNyJXQ)snMw}r;Vq=SVv`h#Q$q5b4ffdqd!JAs+k zOyGi523K85e4u`xyzE;B>r*;&@aPJLAWdU^Canyk$2CVpv6XbStGEW9Z9|?UWpYU| z&QyATO$tUArNI%{8n2@5k%77nd3|IVrYw4ujZ;nUH4J^STlmcZ1r6-$X&9|)p!(LN z4iX`-Ke}vuMMyWwKcZ;OX%M!zNp$-B5QR9>Ak}_Kz(lfHwM?)C=&U-y-57E)(_f{N zH{h$Wx~JP3naYfls&3b#abW-_|N0r+qa$JtbaweHeJEhF&9`w&7-?svN7?DIafDVa zUw@shbF2)0Q2nXFU;9)`>^<}dt78ck5y&93$UVsCxMEkjM!^Oo)CiB_XVXVaD`wG0Ja7j>BK zQ*f~qWjys2?!i$Ztv#f`?1ap>N8I4041F)+l2oEnJ@p>>rZOakJDkwYzNs7cd|yx^@9P|=CNa=DFfLxWx+v6#<$XAANQQO3PAB`usk+?@MDIZ> zqS@3V6xFiJhL-<}QKP%f25$3lV-h-f4W$V|3W5y8ORtE4!or~j&wA}D{Hhg*D#9yS zUoe6FQL()h`mF>lv$IZQVf68x@JOvQZ;~ME#35c)c^W|!z2o^Ixa33_;ZC2*30!IC zJM${W$;6nUiCgy!H)gvm+MqLd(^po2^zlUReDn#>HN9VNGm zCgb!;j)T!LS8ITP_rkAoe}W1-TC5zYg~kp4;{W7vDF##!!TYYNr(oYLtwTf*C^Nd& z`?j!{;4}HPvHRG;1zW0;VjV+f6zw>+_p?V;WGr1iG{nb-gk_u>N+jswK7Kaq8~$-v z|JpS|E~3kc_?b;KM)!SG_}!68zOP9EY54k4UAG>r)YqCqGPluN!Ua_`g-uA<(xhj;#IrhV8f9z1ZHxS^} mvAr#*zVPq=-D_}gdfxjs;_a?)x4FSj?)_o^E{1P-=KlkKz;5mU literal 0 HcmV?d00001 diff --git a/guide/translations/ko-KR/src/descriptor_sets/pipeline_layout.md b/guide/translations/ko-KR/src/descriptor_sets/pipeline_layout.md new file mode 100644 index 0000000..9e16f3e --- /dev/null +++ b/guide/translations/ko-KR/src/descriptor_sets/pipeline_layout.md @@ -0,0 +1,81 @@ +# Pipeline Layout + +A [Vulkan Pipeline Layout](https://registry.khronos.org/vulkan/specs/latest/man/html/VkPipelineLayout.html) represents a sequence of descriptor sets (and push constants) associated with a shader program. Even when using Shader Objects, a Pipeline Layout is needed to utilize descriptor sets. + +Starting with the layout of a single descriptor set containing a uniform buffer to set the view/projection matrices in, store a descriptor pool in `App` and create it before the shader: + +```cpp +vk::UniqueDescriptorPool m_descriptor_pool{}; + +// ... +void App::create_descriptor_pool() { + static constexpr auto pool_sizes_v = std::array{ + // 2 uniform buffers, can be more if desired. + vk::DescriptorPoolSize{vk::DescriptorType::eUniformBuffer, 2}, + }; + auto pool_ci = vk::DescriptorPoolCreateInfo{}; + // allow 16 sets to be allocated from this pool. + pool_ci.setPoolSizes(pool_sizes_v).setMaxSets(16); + m_descriptor_pool = m_device->createDescriptorPoolUnique(pool_ci); +} +``` + +Add new members to `App` to store the set layouts and pipeline layout. `m_set_layout_views` is just a copy of the descriptor set layout handles in a contiguous vector: + +```cpp +std::vector m_set_layouts{}; +std::vector m_set_layout_views{}; +vk::UniquePipelineLayout m_pipeline_layout{}; + +// ... +constexpr auto layout_binding(std::uint32_t binding, + vk::DescriptorType const type) { + return vk::DescriptorSetLayoutBinding{ + binding, type, 1, vk::ShaderStageFlagBits::eAllGraphics}; +} + +// ... +void App::create_pipeline_layout() { + static constexpr auto set_0_bindings_v = std::array{ + layout_binding(0, vk::DescriptorType::eUniformBuffer), + }; + auto set_layout_cis = std::array{}; + set_layout_cis[0].setBindings(set_0_bindings_v); + + for (auto const& set_layout_ci : set_layout_cis) { + m_set_layouts.push_back( + m_device->createDescriptorSetLayoutUnique(set_layout_ci)); + m_set_layout_views.push_back(*m_set_layouts.back()); + } + + auto pipeline_layout_ci = vk::PipelineLayoutCreateInfo{}; + pipeline_layout_ci.setSetLayouts(m_set_layout_views); + m_pipeline_layout = + m_device->createPipelineLayoutUnique(pipeline_layout_ci); +} +``` + +Add a helper function that allocates a set of descriptor sets for the entire layout: + +```cpp +auto App::allocate_sets() const -> std::vector { + auto allocate_info = vk::DescriptorSetAllocateInfo{}; + allocate_info.setDescriptorPool(*m_descriptor_pool) + .setSetLayouts(m_set_layout_views); + return m_device->allocateDescriptorSets(allocate_info); +} +``` + +Store a Buffered copy of descriptor sets for one drawable object: + +```cpp +Buffered> m_descriptor_sets{}; + +// ... + +void App::create_descriptor_sets() { + for (auto& descriptor_sets : m_descriptor_sets) { + descriptor_sets = allocate_sets(); + } +} +``` diff --git a/guide/translations/ko-KR/src/descriptor_sets/rgby_texture.png b/guide/translations/ko-KR/src/descriptor_sets/rgby_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..25b0c6d11a56041a3de3a986367f8c8e68a085e3 GIT binary patch literal 22654 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 literal 0 HcmV?d00001 diff --git a/guide/translations/ko-KR/src/descriptor_sets/texture.md b/guide/translations/ko-KR/src/descriptor_sets/texture.md new file mode 100644 index 0000000..bac0b80 --- /dev/null +++ b/guide/translations/ko-KR/src/descriptor_sets/texture.md @@ -0,0 +1,247 @@ +# Texture + +With a large part of the complexity wrapped away in `vma`, a `Texture` is just a combination of three things: + +1. Sampled Image +2. (Unique) Image View of above +3. (Unique) Sampler + +In `texture.hpp`, create a default sampler: + +```cpp +[[nodiscard]] constexpr auto +create_sampler_ci(vk::SamplerAddressMode const wrap, vk::Filter const filter) { + auto ret = vk::SamplerCreateInfo{}; + ret.setAddressModeU(wrap) + .setAddressModeV(wrap) + .setAddressModeW(wrap) + .setMinFilter(filter) + .setMagFilter(filter) + .setMaxLod(VK_LOD_CLAMP_NONE) + .setBorderColor(vk::BorderColor::eFloatTransparentBlack) + .setMipmapMode(vk::SamplerMipmapMode::eNearest); + return ret; +} + +constexpr auto sampler_ci_v = create_sampler_ci( + vk::SamplerAddressMode::eClampToEdge, vk::Filter::eLinear); +``` + +Define the Create Info and Texture types: + +```cpp +struct TextureCreateInfo { + vk::Device device; + VmaAllocator allocator; + std::uint32_t queue_family; + CommandBlock command_block; + Bitmap bitmap; + + vk::SamplerCreateInfo sampler{sampler_ci_v}; +}; + +class Texture { + public: + using CreateInfo = TextureCreateInfo; + + explicit Texture(CreateInfo create_info); + + [[nodiscard]] auto descriptor_info() const -> vk::DescriptorImageInfo; + + private: + vma::Image m_image{}; + vk::UniqueImageView m_view{}; + vk::UniqueSampler m_sampler{}; +}; +``` + +Add a fallback bitmap constant, and the implementation: + +```cpp +// 4-channels. +constexpr auto white_pixel_v = std::array{std::byte{0xff}, std::byte{0xff}, + std::byte{0xff}, std::byte{0xff}}; +// fallback bitmap. +constexpr auto white_bitmap_v = Bitmap{ + .bytes = white_pixel_v, + .size = {1, 1}, +}; + +// ... +Texture::Texture(CreateInfo create_info) { + if (create_info.bitmap.bytes.empty() || create_info.bitmap.size.x <= 0 || + create_info.bitmap.size.y <= 0) { + create_info.bitmap = white_bitmap_v; + } + + auto const image_ci = vma::ImageCreateInfo{ + .allocator = create_info.allocator, + .queue_family = create_info.queue_family, + }; + m_image = vma::create_sampled_image( + image_ci, std::move(create_info.command_block), create_info.bitmap); + + auto image_view_ci = vk::ImageViewCreateInfo{}; + auto subresource_range = vk::ImageSubresourceRange{}; + subresource_range.setAspectMask(vk::ImageAspectFlagBits::eColor) + .setLayerCount(1) + .setLevelCount(m_image.get().levels); + + image_view_ci.setImage(m_image.get().image) + .setViewType(vk::ImageViewType::e2D) + .setFormat(m_image.get().format) + .setSubresourceRange(subresource_range); + m_view = create_info.device.createImageViewUnique(image_view_ci); + + m_sampler = create_info.device.createSamplerUnique(create_info.sampler); +} + +auto Texture::descriptor_info() const -> vk::DescriptorImageInfo { + auto ret = vk::DescriptorImageInfo{}; + ret.setImageView(*m_view) + .setImageLayout(vk::ImageLayout::eShaderReadOnlyOptimal) + .setSampler(*m_sampler); + return ret; +} +``` + +To sample textures, `Vertex` will need a UV coordinate: + +```cpp +struct Vertex { + glm::vec2 position{}; + glm::vec3 color{1.0f}; + glm::vec2 uv{}; +}; + +// two vertex attributes: position at 0, color at 1. +constexpr auto vertex_attributes_v = std::array{ + // the format matches the type and layout of data: vec2 => 2x 32-bit floats. + vk::VertexInputAttributeDescription2EXT{0, 0, vk::Format::eR32G32Sfloat, + offsetof(Vertex, position)}, + // vec3 => 3x 32-bit floats + vk::VertexInputAttributeDescription2EXT{1, 0, vk::Format::eR32G32B32Sfloat, + offsetof(Vertex, color)}, + // vec2 => 2x 32-bit floats + vk::VertexInputAttributeDescription2EXT{2, 0, vk::Format::eR32G32Sfloat, + offsetof(Vertex, uv)}, +}; +``` + +Store a texture in `App` and create with the other shader resources: + +```cpp +std::optional m_texture{}; + +// ... +using Pixel = std::array; +static constexpr auto rgby_pixels_v = std::array{ + Pixel{std::byte{0xff}, {}, {}, std::byte{0xff}}, + Pixel{std::byte{}, std::byte{0xff}, {}, std::byte{0xff}}, + Pixel{std::byte{}, {}, std::byte{0xff}, std::byte{0xff}}, + Pixel{std::byte{0xff}, std::byte{0xff}, {}, std::byte{0xff}}, +}; +static constexpr auto rgby_bytes_v = + std::bit_cast>( + rgby_pixels_v); +static constexpr auto rgby_bitmap_v = Bitmap{ + .bytes = rgby_bytes_v, + .size = {2, 2}, +}; +auto texture_ci = Texture::CreateInfo{ + .device = *m_device, + .allocator = m_allocator.get(), + .queue_family = m_gpu.queue_family, + .command_block = create_command_block(), + .bitmap = rgby_bitmap_v, +}; +// use Nearest filtering instead of Linear (interpolation). +texture_ci.sampler.setMagFilter(vk::Filter::eNearest); +m_texture.emplace(std::move(texture_ci)); +``` + +Update the descriptor pool sizes to also contain Combined Image Samplers: + +```cpp +/// ... +vk::DescriptorPoolSize{vk::DescriptorType::eUniformBuffer, 2}, +vk::DescriptorPoolSize{vk::DescriptorType::eCombinedImageSampler, 2}, +``` + +Set up a new descriptor set (number 1) with a combined image sampler at binding 0. This could be added to binding 1 of set 0 as well, since we are not optimizing binding calls (eg binding set 0 only once for multiple draws): + +```cpp +static constexpr auto set_1_bindings_v = std::array{ + layout_binding(0, vk::DescriptorType::eCombinedImageSampler), +}; +auto set_layout_cis = std::array{}; +set_layout_cis[0].setBindings(set_0_bindings_v); +set_layout_cis[1].setBindings(set_1_bindings_v); +``` + +Remove the vertex colors and set the UVs for the quad. In Vulkan UV space is the same as GLFW window space: origin is at the top left, +X moves right, +Y moves down. + +```cpp +static constexpr auto vertices_v = std::array{ + Vertex{.position = {-200.0f, -200.0f}, .uv = {0.0f, 1.0f}}, + Vertex{.position = {200.0f, -200.0f}, .uv = {1.0f, 1.0f}}, + Vertex{.position = {200.0f, 200.0f}, .uv = {1.0f, 0.0f}}, + Vertex{.position = {-200.0f, 200.0f}, .uv = {0.0f, 0.0f}}, +}; +``` + +Finally, update the descriptor writes: + +```cpp +auto writes = std::array{}; +// ... +auto const set1 = descriptor_sets[1]; +auto const image_info = m_texture->descriptor_info(); +write.setImageInfo(image_info) + .setDescriptorType(vk::DescriptorType::eCombinedImageSampler) + .setDescriptorCount(1) + .setDstSet(set1) + .setDstBinding(0); +writes[1] = write; +``` + +Since the Texture is not N-buffered (because it is "GPU const"), in this case the sets could also be updated once after texture creation instead of every frame. + +Add the UV vertex attribute the vertex shader and pass it to the fragment shader: + +```glsl +layout (location = 2) in vec2 a_uv; + +// ... +layout (location = 1) out vec2 out_uv; + +// ... +out_color = a_color; +out_uv = a_uv; +``` + +Add set 1 and the incoming UV coords to the fragment shader, combine the sampled texture color with the vertex color: + +```glsl +layout (set = 1, binding = 0) uniform sampler2D tex; + +// ... +layout (location = 1) in vec2 in_uv; + +// ... +out_color = vec4(in_color, 1.0) * texture(tex, in_uv); +``` + +![RGBY Texture](./rgby_texture.png) + +For generating mip-maps, follow the [sample in the Vulkan docs](https://docs.vulkan.org/samples/latest/samples/api/hpp_texture_mipmap_generation/README.html#_generating_the_mip_chain). The high-level steps are: + +1. Compute mip levels based on image size +1. Create an image with the desired mip levels +1. Copy the source data to the first mip level as usual +1. Transition the first mip level to TransferSrc +1. Iterate through all the remaining mip levels: + 1. Transition the current mip level to TransferDst + 1. Record an image blit operation from previous to current mip levels + 1. Transition the current mip level to TransferSrc +1. Transition all levels (entire image) to ShaderRead diff --git a/guide/translations/ko-KR/src/descriptor_sets/view_matrix.md b/guide/translations/ko-KR/src/descriptor_sets/view_matrix.md new file mode 100644 index 0000000..43cdc32 --- /dev/null +++ b/guide/translations/ko-KR/src/descriptor_sets/view_matrix.md @@ -0,0 +1,79 @@ +# View Matrix + +Integrating the view matrix will be quite simple and short. First, transformations for objects and cameras/views can be encapsulated into a single struct: + +```cpp +struct Transform { + glm::vec2 position{}; + float rotation{}; + glm::vec2 scale{1.0f}; + + [[nodiscard]] auto model_matrix() const -> glm::mat4; + [[nodiscard]] auto view_matrix() const -> glm::mat4; +}; +``` + +Extracting the common logic into a helper, both member functions can be implemented easily: + +```cpp +namespace { +struct Matrices { + glm::mat4 translation; + glm::mat4 orientation; + glm::mat4 scale; +}; + +[[nodiscard]] auto to_matrices(glm::vec2 const position, float rotation, + glm::vec2 const scale) -> Matrices { + static constexpr auto mat_v = glm::identity(); + static constexpr auto axis_v = glm::vec3{0.0f, 0.0f, 1.0f}; + return Matrices{ + .translation = glm::translate(mat_v, glm::vec3{position, 0.0f}), + .orientation = glm::rotate(mat_v, glm::radians(rotation), axis_v), + .scale = glm::scale(mat_v, glm::vec3{scale, 1.0f}), + }; +} +} // namespace + +auto Transform::model_matrix() const -> glm::mat4 { + auto const [t, r, s] = to_matrices(position, rotation, scale); + // right to left: scale first, then rotate, then translate. + return t * r * s; +} + +auto Transform::view_matrix() const -> glm::mat4 { + // view matrix is the inverse of the model matrix. + // instead, perform translation and rotation in reverse order and with + // negative values. or, use glm::lookAt(). + // scale is kept unchanged as the first transformation for + // "intuitive" scaling on cameras. + auto const [t, r, s] = to_matrices(-position, -rotation, scale); + return r * t * s; +} +``` + +Add a `Transform` member to `App` to represent the view/camera, inspect its members, and combine with the existing projection matrix: + +```cpp +Transform m_view_transform{}; // generates view matrix. + +// ... +ImGui::Separator(); +if (ImGui::TreeNode("View")) { + ImGui::DragFloat2("position", &m_view_transform.position.x); + ImGui::DragFloat("rotation", &m_view_transform.rotation); + ImGui::DragFloat2("scale", &m_view_transform.scale.x); + ImGui::TreePop(); +} + +// ... +auto const mat_view = m_view_transform.view_matrix(); +auto const mat_vp = mat_projection * mat_view; +auto const bytes = + std::bit_cast>(mat_vp); +m_view_ubo->write_at(m_frame_index, bytes); +``` + +Naturally, moving the view left moves everything else - currently only a single RGBY quad - to the _right_. + +![View Matrix](./view_matrix.png) diff --git a/guide/translations/ko-KR/src/descriptor_sets/view_matrix.png b/guide/translations/ko-KR/src/descriptor_sets/view_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..5070b917bf99f95c88bb3a99679970da7c55cff0 GIT binary patch literal 27789 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 literal 0 HcmV?d00001 diff --git a/guide/translations/ko-KR/src/descriptor_sets/view_ubo.png b/guide/translations/ko-KR/src/descriptor_sets/view_ubo.png new file mode 100644 index 0000000000000000000000000000000000000000..0a56b53ceb2572223437a910ca035ce24e278a61 GIT binary patch literal 52258 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 VKKoT( 이것이 내장 GPU를 지원하지 않는다는 뜻은 아닙니다. 다만 특별히 그에 맞게 설계하거나 최적화하지는 않습니다. + +## 요구사항 + +1. Vulkan 1.3 버전 이상을 지원하는 GPU와 로더 +1. [Vulkan 1.3 이상의 SDK](https://vulkan.lunarg.com/sdk/home) + 1. 이는 검증 레이어에 필요하며, Vulkan 애플리케이션 개발 시 중요한 구성요소입니다. 단, 프로젝트 자체는 SDK에 직접 의존하지 않습니다. + 1. 항상 최신 SDK 사용이 권장됩니다. (이 문서를 작성하는 시점 기준으로는 1.4) +1. Vulkan을 기본적으로 지원하는 데스크탑 운영체제 + 1. Windows 혹은 최신 패키지를 제공하는 Linux 배포판 사용이 권장됩니다. + 2. MacOS는 Vulkan을 기본적으로 지원하지 않습니다. MoltenVk를 통해 사용할 수는 있으나, 작성 시점 기준 MoltenVk는 Vulkan 1.3을 완전히 지원하지 않기 때문에, 이 환경에서는 제약이 있을 수 있습니다. +2. C++23을 지원하는 컴파일러 및 표준 라이브러리 + 1. GCC14+, Clang18+, 최신 MSVC가 권장되며, MinGW/MSYS는 권장되지 않습니다. + 2. C++20을 사용하고 C++23의 특정 기능을 대체하는 것도 가능합니다.(예: `std::print()` 대신 `fmt::print()` 사용, 람다식에 `()` 추가 등) +3. CMake 3.24 이상 + +## 개요 + +C++ 모듈에 대한 지원은 점차 확대되고 있지만, 우리가 목표로 하는 모든 플랫폼과 IDE에서는 아직 완전히 지원되지 않습니다. 따라서 당분간은 헤더 파일을 사용할 수 밖에 없습니다. 이는 가까운 미래에 도구들이 개선되면, 가이드를 리팩토링하면서 변경될 수 있습니다. + +이 프로젝트는 "Build the World" 접근 방식을 사용합니다. 이는 Sanitizer 사용을 가능하게 하고, 모든 지원 플랫폼에서 재현 가능한 빌드를 제공하며, 대상 시스템에서의 사전 설치 요구사항을 최소화합니다. 물론, 미리 빌드된 바이너리를 사용하는 것도 가능하며, Vulkan을 사용하는 방식에는 영향을 주지 않습니다. + +## 라이브러리 + +1. 창과 입력, Surface를 위한 [GLFW](https://github.com/glfw/glfw) +1. Vulkan과 상호작용하기 위한 [VulkanHPP](https://github.com/KhronosGroup/Vulkan-Hpp), [Vulkan-Headers](https://github.com/KhronosGroup/Vulkan-Headers)를 통해 사용. + 1. Vulkan은 C API이지만, 공식 C++ 래핑 라이브러리가 제공되어 많은 편리한 기능을 제공합니다. 이 가이드는 C API를 사용하는 다른 라이브러리들(예: GLFW,VMA)을 사용할 때를 제외하고는 거의 C++만 사용합니다. +2. Vulkan 메모리 힙을 다루기 위한 [Vulkan Memory Allocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/) +3. C++에서 GLSL과 유사한 선형대수학을 위한 [GLM](https://github.com/g-truc/glm) +4. UI를 위한 [Dear ImGui](https://github.com/ocornut/imgui) diff --git a/guide/translations/ko-KR/src/getting_started/class_app.md b/guide/translations/ko-KR/src/getting_started/class_app.md new file mode 100644 index 0000000..25924ca --- /dev/null +++ b/guide/translations/ko-KR/src/getting_started/class_app.md @@ -0,0 +1,39 @@ +# Application + +`class App`은 전체 애플리케이션의 소유자이자 실행 주체 역할을 합니다. 인스턴스는 하나뿐이지만, 클래스를 사용함으로써 RAII의 이점을 활용해 자원을 올바른 순서로 자동 해제할 수 있으며, 전역 변수를 사용할 필요도 없습니다. + +```cpp +// app.hpp +namespace lvk { +class App { + public: + void run(); +}; +} // namespace lvk + +// app.cpp +namespace lvk { +void App::run() { + // TODO +} +} // namespace lvk +``` + +## Main + +`main.cpp`는 많은 역할을 하지 않습니다. 주로 실제 진입점으로 제어를 넘기고, 치명적인 예외를 처리하는 역할을 합니다. + +```cpp +// main.cpp +auto main() -> int { + try { + lvk::App{}.run(); + } catch (std::exception const& e) { + std::println(stderr, "PANIC: {}", e.what()); + return EXIT_FAILURE; + } catch (...) { + std::println("PANIC!"); + return EXIT_FAILURE; + } +} +``` diff --git a/guide/translations/ko-KR/src/getting_started/high_level_loader.png b/guide/translations/ko-KR/src/getting_started/high_level_loader.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfd3b625dd247c0ccdf63db3f96c519746815ec GIT binary patch literal 191966 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 literal 0 HcmV?d00001 diff --git a/guide/translations/ko-KR/src/getting_started/project_layout.md b/guide/translations/ko-KR/src/getting_started/project_layout.md new file mode 100644 index 0000000..3e61b2d --- /dev/null +++ b/guide/translations/ko-KR/src/getting_started/project_layout.md @@ -0,0 +1,22 @@ +# 프로젝트 레이아웃 + +이 페이지는 이 가이드에서 사용하는 코드 레이아웃에 대해 설명합니다. 여기서 설명하는 내용은 이 가이드에서의 참고사항일 뿐이며, Vulkan 사용과는 관련이 없습니다. + +외부 의존성은 zip파일로 묶여있으며, CMake가 구성(configure) 단계에서 이를 압축 해제합니다. FetchContent를 사용하는 것도 유효한 대안입니다. + +`Ninja Multi-Config`는 OS나 컴파일러에 관계없이 사용되는 기본 생성기로 가정합니다. 이는 프로젝트 루트 디렉토리에 있는 `CMakePresets.json`파일에 설정되어 있으며, 사용자 정의 프리셋은 `CMakeUserPresets.json`을 통해 추가할 수 있습니다. + +> Windows에서는 Visual Studio의 CMake Mode가 이 생성기를 사용하며, 자동으로 프리셋을 불러옵니다. Visual Studio Code에서는 CMake Tools 확장이 자동으로 프리셋을 사용합니다. 그 외의 IDE에서는 CMake 프리셋 사용 방법에 대한 해당 IDE의 문서를 참고하세요. + +**Filesystem** + +``` +. +|-- CMakeLists.txt <== executable target +|-- CMakePresets.json +|-- [other project files] +|-- ext/ +│ |-- CMakeLists.txt <== external dependencies target +|-- src/ + |-- [sources and headers] +``` \ No newline at end of file diff --git a/guide/translations/ko-KR/src/getting_started/validation_layers.md b/guide/translations/ko-KR/src/getting_started/validation_layers.md new file mode 100644 index 0000000..dbbc529 --- /dev/null +++ b/guide/translations/ko-KR/src/getting_started/validation_layers.md @@ -0,0 +1,11 @@ +# 검증 레이어 + +애플리케이션이 Vulkan과 상호작용할 때 거치는 영역인 로더(loader)는 매우 강력하고 유연합니다. [여기](https://github.com/KhronosGroup/Vulkan-Loader/blob/main/docs/LoaderInterfaceArchitecture.md)에서 더 자세한 내용을 확인할 수 있습니다. 이 로더의 설계는 API 호출을 구성 가능한 레이어를 통해 연결할 수 있게 해주며, 이는 예를 들어 오버레이 구현에 사용될 수 있고, 이 중 우리에게 가장 중요한 것은 [검증 레이어](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/main/docs/README.md) 입니다. + +![Vulkan Loader](high_level_loader.png) + +크로노스 그룹의 [권장사항](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/main/docs/khronos_validation_layer.md#vkconfig)대로, 검증 레이어를 사용할 때는 [Vulkan Configurator (GUI)](https://github.com/LunarG/VulkanTools/tree/main/vkconfig_gui)를 사용하는 것이 좋습니다. 이 애플리케이션은 Vulkan SDK에 포함되어 있으며, 애플리케이션을 개발하는 동안 실행 상태로 유지해야 합니다. 또한, 이 툴이 감지된 애플리케이션에 검증 레이어를 주입하고, 동기화 검증 기능이 활성화되어 있는지 확인하세요. 이 접근 방식은 런타임 시 많은 유연성을 제공하며, 예를 들어 오류 발생 시 디버거 중단 설정(VkConfig가 디버거를 중단시킴) 같은 기능도 포함됩니다. 이와 더불어, 애플리케이션 내부에 별도의 검증 레이어 관련 코드를 작성할 필요가 없어집니다. + +> 주의 : 개발(또는 데스크탑) 환경의 `PATH` 환경 변수를 수정하거나, 지원되는 시스템에서는 `LD_LIBRARY_PATH`를 사용하여 SDK의 바이너리 경로가 우선적으로 인식되도록 설정해야 합니다. + +![Vulkan Configurator](./vkconfig_gui.png) diff --git a/guide/translations/ko-KR/src/getting_started/vkconfig_gui.png b/guide/translations/ko-KR/src/getting_started/vkconfig_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..4ebe0fa008189191a2695e94ecd458d7b5ae92e0 GIT binary patch literal 155155 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 Iyn6lr0M`bkm;e9( literal 0 HcmV?d00001 diff --git a/guide/translations/ko-KR/src/initialization/README.md b/guide/translations/ko-KR/src/initialization/README.md new file mode 100644 index 0000000..79597c5 --- /dev/null +++ b/guide/translations/ko-KR/src/initialization/README.md @@ -0,0 +1,12 @@ +# Initialization + +This section deals with initialization of all the systems needed, including: + +- Initializing GLFW and creating a Window +- Creating a Vulkan Instance +- Creating a Vulkan Surface +- Selecting a Vulkan Physical Device +- Creating a Vulkan logical Device +- Creating a Vulkan Swapchain + +If any step here fails, it is a fatal error as we can't do anything meaningful beyond that point. diff --git a/guide/translations/ko-KR/src/initialization/device.md b/guide/translations/ko-KR/src/initialization/device.md new file mode 100644 index 0000000..5cb2530 --- /dev/null +++ b/guide/translations/ko-KR/src/initialization/device.md @@ -0,0 +1,66 @@ +# Vulkan Device + +A [Vulkan Device](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-devices) is a logical instance of a Physical Device, and will the primary interface for everything Vulkan now onwards. [Vulkan Queues](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-queues) are owned by the Device, we will need one from the queue family stored in the `Gpu` to submit recorded command buffers. We also need to explicitly declare all features we want to use, eg [Dynamic Rendering](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_dynamic_rendering.html) and [Synchronization2](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_synchronization2.html). + +Setup a `vk::QueueCreateInfo` object: + +```cpp +auto queue_ci = vk::DeviceQueueCreateInfo{}; +// since we use only one queue, it has the entire priority range, ie, 1.0 +static constexpr auto queue_priorities_v = std::array{1.0f}; +queue_ci.setQueueFamilyIndex(m_gpu.queue_family) + .setQueueCount(1) + .setQueuePriorities(queue_priorities_v); +``` + +Setup the core device features: + +```cpp +// nice-to-have optional core features, enable if GPU supports them. +auto enabled_features = vk::PhysicalDeviceFeatures{}; +enabled_features.fillModeNonSolid = m_gpu.features.fillModeNonSolid; +enabled_features.wideLines = m_gpu.features.wideLines; +enabled_features.samplerAnisotropy = m_gpu.features.samplerAnisotropy; +enabled_features.sampleRateShading = m_gpu.features.sampleRateShading; +``` + +Setup the additional features, using `setPNext()` to chain them: + +```cpp +// extra features that need to be explicitly enabled. +auto sync_feature = vk::PhysicalDeviceSynchronization2Features{vk::True}; +auto dynamic_rendering_feature = + vk::PhysicalDeviceDynamicRenderingFeatures{vk::True}; +// sync_feature.pNext => dynamic_rendering_feature, +// and later device_ci.pNext => sync_feature. +// this is 'pNext chaining'. +sync_feature.setPNext(&dynamic_rendering_feature); +``` + +Setup a `vk::DeviceCreateInfo` object: + +```cpp +auto device_ci = vk::DeviceCreateInfo{}; +// we only need one device extension: Swapchain. +static constexpr auto extensions_v = + std::array{VK_KHR_SWAPCHAIN_EXTENSION_NAME}; +device_ci.setPEnabledExtensionNames(extensions_v) + .setQueueCreateInfos(queue_ci) + .setPEnabledFeatures(&enabled_features) + .setPNext(&sync_feature); +``` + +Declare a `vk::UniqueDevice` member after `m_gpu`, create it, and initialize the dispatcher against it: + +```cpp +m_device = m_gpu.device.createDeviceUnique(device_ci); +// initialize the dispatcher against the created Device. +VULKAN_HPP_DEFAULT_DISPATCHER.init(*m_device); +``` + +Declare a `vk::Queue` member (order doesn't matter since it's just a handle, the actual Queue is owned by the Device) and initialize it: + +```cpp +static constexpr std::uint32_t queue_index_v{0}; +m_queue = m_device->getQueue(m_gpu.queue_family, queue_index_v); +``` diff --git a/guide/translations/ko-KR/src/initialization/glfw_window.md b/guide/translations/ko-KR/src/initialization/glfw_window.md new file mode 100644 index 0000000..a99b841 --- /dev/null +++ b/guide/translations/ko-KR/src/initialization/glfw_window.md @@ -0,0 +1,89 @@ +# GLFW Window + +We will use GLFW (3.4) for windowing and related events. The library - like all external dependencies - is configured and added to the build tree in `ext/CMakeLists.txt`. `GLFW_INCLUDE_VULKAN` is defined for all consumers, to enable GLFW's Vulkan related functions (known as **Window System Integration (WSI)**). GLFW 3.4 supports Wayland on Linux, and by default it builds backends for both X11 and Wayland. For this reason it will need the development packages for [both platforms](https://www.glfw.org/docs/latest/compile_guide.html#compile_deps_wayland) (and some other Wayland/CMake dependencies) to configure/build successfully. A particular backend can be requested at runtime if desired via `GLFW_PLATFORM`. + +Although it is quite feasible to have multiple windows in a Vulkan-GLFW application, that is out of scope for this guide. For our purposes GLFW (the library) and a single window are a monolithic unit - initialized and destroyed together. This can be encapsulated in a `std::unique_ptr` with a custom deleter, especially since GLFW returns an opaque pointer (`GLFWwindow*`). + +```cpp +// window.hpp +namespace lvk::glfw { +struct Deleter { + void operator()(GLFWwindow* window) const noexcept; +}; + +using Window = std::unique_ptr; + +// Returns a valid Window if successful, else throws. +[[nodiscard]] auto create_window(glm::ivec2 size, char const* title) -> Window; +} // namespace lvk::glfw + +// window.cpp +void Deleter::operator()(GLFWwindow* window) const noexcept { + glfwDestroyWindow(window); + glfwTerminate(); +} +``` + +GLFW can create fullscreen and borderless windows, but we will stick to a standard window with decorations. Since we cannot do anything useful if we are unable to create a window, all other branches throw a fatal exception (caught in main). + +```cpp +auto glfw::create_window(glm::ivec2 const size, char const* title) -> Window { + static auto const on_error = [](int const code, char const* description) { + std::println(stderr, "[GLFW] Error {}: {}", code, description); + }; + glfwSetErrorCallback(on_error); + if (glfwInit() != GLFW_TRUE) { + throw std::runtime_error{"Failed to initialize GLFW"}; + } + // check for Vulkan support. + if (glfwVulkanSupported() != GLFW_TRUE) { + throw std::runtime_error{"Vulkan not supported"}; + } + auto ret = Window{}; + // tell GLFW that we don't want an OpenGL context. + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + ret.reset(glfwCreateWindow(size.x, size.y, title, nullptr, nullptr)); + if (!ret) { throw std::runtime_error{"Failed to create GLFW Window"}; } + return ret; +} +``` + +`App` can now store a `glfw::Window` and keep polling it in `run()` until it gets closed by the user. We will not be able to draw anything to the window for a while, but this is the first step in that journey. + +Declare it as a private member: + +```cpp +private: + glfw::Window m_window{}; +``` + +Add some private member functions to encapsulate each operation: + +```cpp +void create_window(); + +void main_loop(); +``` + +Implement them and call them in `run()`: + +```cpp +void App::run() { + create_window(); + + main_loop(); +} + +void App::create_window() { + m_window = glfw::create_window({1280, 720}, "Learn Vulkan"); +} + +void App::main_loop() { + while (glfwWindowShouldClose(m_window.get()) == GLFW_FALSE) { + glfwPollEvents(); + } +} +``` + +> On Wayland you will not even see a window yet: it is only shown _after_ the application presents a framebuffer to it. + diff --git a/guide/translations/ko-KR/src/initialization/gpu.md b/guide/translations/ko-KR/src/initialization/gpu.md new file mode 100644 index 0000000..e3a5ac6 --- /dev/null +++ b/guide/translations/ko-KR/src/initialization/gpu.md @@ -0,0 +1,94 @@ +# Vulkan Physical Device + +A [Physical Device](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-physical-device-enumeration) represents a single complete implementation of Vulkan, for our intents and purposes a single GPU. (It could also be eg a software renderer like Mesa/lavapipe.) Some machines may have multiple Physical Devices available, like laptops with dual-GPUs. We need to select the one we want to use, given our constraints: + +1. Vulkan 1.3 must be supported +1. Vulkan Swapchains must be supported +1. A Vulkan Queue that supports Graphics and Transfer operations must be available +1. It must be able to present to the previously created Vulkan Surface +1. (Optional) Prefer discrete GPUs + +We wrap the actual Physical Device and a few other useful objects into `struct Gpu`. Since it will be accompanied by a hefty utility function, we put it in its own hpp/cpp files, and move the `vk_version_v` constant to this new header: + +```cpp +constexpr auto vk_version_v = VK_MAKE_VERSION(1, 3, 0); + +struct Gpu { + vk::PhysicalDevice device{}; + vk::PhysicalDeviceProperties properties{}; + vk::PhysicalDeviceFeatures features{}; + std::uint32_t queue_family{}; +}; + +[[nodiscard]] auto get_suitable_gpu(vk::Instance instance, + vk::SurfaceKHR surface) -> Gpu; +``` + +The implementation: + +```cpp +auto lvk::get_suitable_gpu(vk::Instance const instance, + vk::SurfaceKHR const surface) -> Gpu { + auto const supports_swapchain = [](Gpu const& gpu) { + static constexpr std::string_view name_v = + VK_KHR_SWAPCHAIN_EXTENSION_NAME; + static constexpr auto is_swapchain = + [](vk::ExtensionProperties const& properties) { + return properties.extensionName.data() == name_v; + }; + auto const properties = gpu.device.enumerateDeviceExtensionProperties(); + auto const it = std::ranges::find_if(properties, is_swapchain); + return it != properties.end(); + }; + + auto const set_queue_family = [](Gpu& out_gpu) { + static constexpr auto queue_flags_v = + vk::QueueFlagBits::eGraphics | vk::QueueFlagBits::eTransfer; + for (auto const [index, family] : + std::views::enumerate(out_gpu.device.getQueueFamilyProperties())) { + if ((family.queueFlags & queue_flags_v) == queue_flags_v) { + out_gpu.queue_family = static_cast(index); + return true; + } + } + return false; + }; + + auto const can_present = [surface](Gpu const& gpu) { + return gpu.device.getSurfaceSupportKHR(gpu.queue_family, surface) == + vk::True; + }; + + auto fallback = Gpu{}; + for (auto const& device : instance.enumeratePhysicalDevices()) { + auto gpu = Gpu{.device = device, .properties = device.getProperties()}; + if (gpu.properties.apiVersion < vk_version_v) { continue; } + if (!supports_swapchain(gpu)) { continue; } + if (!set_queue_family(gpu)) { continue; } + if (!can_present(gpu)) { continue; } + gpu.features = gpu.device.getFeatures(); + if (gpu.properties.deviceType == vk::PhysicalDeviceType::eDiscreteGpu) { + return gpu; + } + // keep iterating in case we find a Discrete Gpu later. + fallback = gpu; + } + if (fallback.device) { return fallback; } + + throw std::runtime_error{"No suitable Vulkan Physical Devices"}; +} +``` + +Finally, add a `Gpu` member in `App` and initialize it after `create_surface()`: + +```cpp +create_surface(); +select_gpu(); + +// ... +void App::select_gpu() { + m_gpu = get_suitable_gpu(*m_instance, *m_surface); + std::println("Using GPU: {}", + std::string_view{m_gpu.properties.deviceName}); +} +``` diff --git a/guide/translations/ko-KR/src/initialization/instance.md b/guide/translations/ko-KR/src/initialization/instance.md new file mode 100644 index 0000000..da6cef2 --- /dev/null +++ b/guide/translations/ko-KR/src/initialization/instance.md @@ -0,0 +1,87 @@ +# Vulkan Instance + +Instead of linking to Vulkan (via the SDK) at build-time, we will load Vulkan at runtime. This requires a few adjustments: + +1. In the CMake ext target `VK_NO_PROTOTYPES` is defined, which turns API function declarations into function pointers +1. In `app.cpp` this line is added to the global scope: `VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE` +1. Before and during initialization `VULKAN_HPP_DEFAULT_DISPATCHER.init()` is called + +The first thing to do in Vulkan is to create an [Instance](https://docs.vulkan.org/spec/latest/chapters/initialization.html#initialization-instances), which will enable enumeration of physical devices (GPUs) and creation of a logical device. + +Since we require Vulkan 1.3, store that in a constant to be easily referenced: + +```cpp +namespace { +constexpr auto vk_version_v = VK_MAKE_VERSION(1, 3, 0); +} // namespace +``` + +In `App`, create a new member function `create_instance()` and call it after `create_window()` in `run()`. After initializing the dispatcher, check that the loader meets the version requirement: + +```cpp +void App::create_instance() { + // initialize the dispatcher without any arguments. + VULKAN_HPP_DEFAULT_DISPATCHER.init(); + auto const loader_version = vk::enumerateInstanceVersion(); + if (loader_version < vk_version_v) { + throw std::runtime_error{"Loader does not support Vulkan 1.3"}; + } +} +``` + +We will need the WSI instance extensions, which GLFW conveniently provides for us. Add a helper function in `window.hpp/cpp`: + +```cpp +auto glfw::instance_extensions() -> std::span { + auto count = std::uint32_t{}; + auto const* extensions = glfwGetRequiredInstanceExtensions(&count); + return {extensions, static_cast(count)}; +} +``` + +Continuing with instance creation, create a `vk::ApplicationInfo` object and fill it up: + +```cpp +auto app_info = vk::ApplicationInfo{}; +app_info.setPApplicationName("Learn Vulkan").setApiVersion(vk_version_v); +``` + +Create a `vk::InstanceCreateInfo` object and fill it up: + +```cpp +auto instance_ci = vk::InstanceCreateInfo{}; +// need WSI instance extensions here (platform-specific Swapchains). +auto const extensions = glfw::instance_extensions(); +instance_ci.setPApplicationInfo(&app_info).setPEnabledExtensionNames( + extensions); +``` + +Add a `vk::UniqueInstance` member _after_ `m_window`: this must be destroyed before terminating GLFW. Create it, and initialize the dispatcher against it: + +```cpp +glfw::Window m_window{}; +vk::UniqueInstance m_instance{}; + +// ... +// initialize the dispatcher against the created Instance. +m_instance = vk::createInstanceUnique(instance_ci); +VULKAN_HPP_DEFAULT_DISPATCHER.init(*m_instance); +``` + +Make sure VkConfig is running with validation layers enabled, and debug/run the app. If "Information" level loader messages are enabled, you should see quite a bit of console output at this point: information about layers being loaded, physical devices and their ICDs being enumerated, etc. + +If this line or equivalent is not visible in the logs, re-check your Vulkan Configurator setup and `PATH`: + +``` +INFO | LAYER: Insert instance layer "VK_LAYER_KHRONOS_validation" +``` + +For instance, if `libVkLayer_khronos_validation.so` / `VkLayer_khronos_validation.dll` is not visible to the app / loader, you'll see a line similar to: + +``` +INFO | LAYER: Requested layer "VK_LAYER_KHRONOS_validation" failed to load. +``` + +Congratulations, you have successfully initialized a Vulkan Instance! + +> Wayland users: seeing the window is still a long way off, these VkConfig/validation logs are your only feedback for now. diff --git a/guide/translations/ko-KR/src/initialization/scoped_waiter.md b/guide/translations/ko-KR/src/initialization/scoped_waiter.md new file mode 100644 index 0000000..7982c83 --- /dev/null +++ b/guide/translations/ko-KR/src/initialization/scoped_waiter.md @@ -0,0 +1,64 @@ +# Scoped Waiter + +A useful abstraction to have is an object that in its destructor waits/blocks until the Device is idle. It is incorrect usage to destroy Vulkan objects while they are in use by the GPU, such an object helps with making sure the device is idle before some dependent resource gets destroyed. + +Being able to do arbitary things on scope exit will be useful in other spots too, so we encapsulate that in a basic class template `Scoped`. It's somewhat like a `unique_ptr` that stores the value (`Type`) instead of a pointer (`Type*`), with some constraints: + +1. `Type` must be default constructible +1. Assumes a default constructed `Type` is equivalent to null (does not call `Deleter`) + +```cpp +template +concept Scopeable = + std::equality_comparable && std::is_default_constructible_v; + +template +class Scoped { + public: + Scoped(Scoped const&) = delete; + auto operator=(Scoped const&) = delete; + + Scoped() = default; + + constexpr Scoped(Scoped&& rhs) noexcept + : m_t(std::exchange(rhs.m_t, Type{})) {} + + constexpr auto operator=(Scoped&& rhs) noexcept -> Scoped& { + if (&rhs != this) { std::swap(m_t, rhs.m_t); } + return *this; + } + + explicit(false) constexpr Scoped(Type t) : m_t(std::move(t)) {} + + constexpr ~Scoped() { + if (m_t == Type{}) { return; } + Deleter{}(m_t); + } + + [[nodiscard]] constexpr auto get() const -> Type const& { return m_t; } + [[nodiscard]] constexpr auto get() -> Type& { return m_t; } + + private: + Type m_t{}; +}; +``` + +Don't worry if this doesn't make a lot of sense: the implementation isn't important, what it does and how to use it is what matters. + +A `ScopedWaiter` can now be implemented quite easily: + +```cpp +struct ScopedWaiterDeleter { + void operator()(vk::Device const device) const noexcept { + device.waitIdle(); + } +}; + +using ScopedWaiter = Scoped; +``` + +Add a `ScopedWaiter` member to `App` _at the end_ of its member list: this must remain at the end to be the first member that gets destroyed, thus guaranteeing the device will be idle before the destruction of any other members begins. Initialize it after creating the Device: + +```cpp +m_waiter = *m_device; +``` diff --git a/guide/translations/ko-KR/src/initialization/surface.md b/guide/translations/ko-KR/src/initialization/surface.md new file mode 100644 index 0000000..629c55c --- /dev/null +++ b/guide/translations/ko-KR/src/initialization/surface.md @@ -0,0 +1,26 @@ +# Vulkan Surface + +Being platform agnostic, Vulkan interfaces with the WSI via the [`VK_KHR_surface` extension](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_surface.html). A [Surface](https://docs.vulkan.org/guide/latest/wsi.html#_surface) enables displaying images on the window through the presentation engine. + +Add another helper function in `window.hpp/cpp`: + +```cpp +auto glfw::create_surface(GLFWwindow* window, vk::Instance const instance) + -> vk::UniqueSurfaceKHR { + VkSurfaceKHR ret{}; + auto const result = + glfwCreateWindowSurface(instance, window, nullptr, &ret); + if (result != VK_SUCCESS || ret == VkSurfaceKHR{}) { + throw std::runtime_error{"Failed to create Vulkan Surface"}; + } + return vk::UniqueSurfaceKHR{ret, instance}; +} +``` + +Add a `vk::UniqueSurfaceKHR` member to `App` after `m_instance`, and create the surface: + +```cpp +void App::create_surface() { + m_surface = glfw::create_surface(m_window.get(), *m_instance); +} +``` diff --git a/guide/translations/ko-KR/src/initialization/swapchain.md b/guide/translations/ko-KR/src/initialization/swapchain.md new file mode 100644 index 0000000..9fdeccc --- /dev/null +++ b/guide/translations/ko-KR/src/initialization/swapchain.md @@ -0,0 +1,226 @@ +# Swapchain + +A [Vulkan Swapchain](https://docs.vulkan.org/guide/latest/wsi.html#_swapchain) is an array of presentable images associated with a Surface, which acts as a bridge between the application and the platform's presentation engine (compositor / display engine). The Swapchain will be continually used in the main loop to acquire and present images. Since failing to create a Swapchain is a fatal error, its creation is part of the initialization section. + +We shall wrap the Vulkan Swapchain into our own `class Swapchain`. It will also store the a copy of the Images owned by the Vulkan Swapchain, and create (and own) Image Views for each Image. The Vulkan Swapchain may need to be recreated in the main loop, eg when the framebuffer size changes, or an acquire/present operation returns `vk::ErrorOutOfDateKHR`. This will be encapsulated in a `recreate()` function which can simply be called during initialization as well. + +```cpp +// swapchain.hpp +class Swapchain { + public: + explicit Swapchain(vk::Device device, Gpu const& gpu, + vk::SurfaceKHR surface, glm::ivec2 size); + + auto recreate(glm::ivec2 size) -> bool; + + [[nodiscard]] auto get_size() const -> glm::ivec2 { + return {m_ci.imageExtent.width, m_ci.imageExtent.height}; + } + + private: + void populate_images(); + void create_image_views(); + + vk::Device m_device{}; + Gpu m_gpu{}; + + vk::SwapchainCreateInfoKHR m_ci{}; + vk::UniqueSwapchainKHR m_swapchain{}; + std::vector m_images{}; + std::vector m_image_views{}; +}; + +// swapchain.cpp +Swapchain::Swapchain(vk::Device const device, Gpu const& gpu, + vk::SurfaceKHR const surface, glm::ivec2 const size) + : m_device(device), m_gpu(gpu) {} +``` + +## Static Swapchain Properties + +Some Swapchain creation parameters like the image extent (size) and count depend on the surface capabilities, which can change during runtime. We can setup the rest in the constructor, for which we need a helper function to obtain a desired [Surface Format](https://registry.khronos.org/vulkan/specs/latest/man/html/VkSurfaceFormatKHR.html): + +```cpp +constexpr auto srgb_formats_v = std::array{ + vk::Format::eR8G8B8A8Srgb, + vk::Format::eB8G8R8A8Srgb, +}; + +// returns a SurfaceFormat with SrgbNonLinear color space and an sRGB format. +[[nodiscard]] constexpr auto +get_surface_format(std::span supported) + -> vk::SurfaceFormatKHR { + for (auto const desired : srgb_formats_v) { + auto const is_match = [desired](vk::SurfaceFormatKHR const& in) { + return in.format == desired && + in.colorSpace == + vk::ColorSpaceKHR::eVkColorspaceSrgbNonlinear; + }; + auto const it = std::ranges::find_if(supported, is_match); + if (it == supported.end()) { continue; } + return *it; + } + return supported.front(); +} +``` + +An sRGB format is preferred because that is what the screen's color space is in. This is indicated by the fact that the only core [Color Space](https://registry.khronos.org/vulkan/specs/latest/man/html/VkColorSpaceKHR.html) is `vk::ColorSpaceKHR::eVkColorspaceSrgbNonlinear`, which specifies support for the images in sRGB color space. + +The constructor can now be implemented: + +```cpp +auto const surface_format = + get_surface_format(m_gpu.device.getSurfaceFormatsKHR(surface)); +m_ci.setSurface(surface) + .setImageFormat(surface_format.format) + .setImageColorSpace(surface_format.colorSpace) + .setImageArrayLayers(1) + // Swapchain images will be used as color attachments (render targets). + .setImageUsage(vk::ImageUsageFlagBits::eColorAttachment) + // eFifo is guaranteed to be supported. + .setPresentMode(vk::PresentModeKHR::eFifo); +if (!recreate(size)) { + throw std::runtime_error{"Failed to create Vulkan Swapchain"}; +} +``` + +## Swapchain Recreation + +The constraints on Swapchain creation parameters are specified by [Surface Capabilities](https://registry.khronos.org/vulkan/specs/latest/man/html/VkSurfaceCapabilitiesKHR.html). Based on the spec we add two helper functions and a constant: + +```cpp +constexpr std::uint32_t min_images_v{3}; + +// returns currentExtent if specified, else clamped size. +[[nodiscard]] constexpr auto +get_image_extent(vk::SurfaceCapabilitiesKHR const& capabilities, + glm::uvec2 const size) -> vk::Extent2D { + constexpr auto limitless_v = 0xffffffff; + if (capabilities.currentExtent.width < limitless_v && + capabilities.currentExtent.height < limitless_v) { + return capabilities.currentExtent; + } + auto const x = std::clamp(size.x, capabilities.minImageExtent.width, + capabilities.maxImageExtent.width); + auto const y = std::clamp(size.y, capabilities.minImageExtent.height, + capabilities.maxImageExtent.height); + return vk::Extent2D{x, y}; +} + +[[nodiscard]] constexpr auto +get_image_count(vk::SurfaceCapabilitiesKHR const& capabilities) + -> std::uint32_t { + if (capabilities.maxImageCount < capabilities.minImageCount) { + return std::max(min_images_v, capabilities.minImageCount); + } + return std::clamp(min_images_v, capabilities.minImageCount, + capabilities.maxImageCount); +} +``` + +We want at least three images in order to be have the option to set up triple buffering. While it's possible for a Surface to have `maxImageCount < 3`, it is quite unlikely. It is in fact much more likely for `minImageCount > 3`. + +The dimensions of Vulkan Images must be positive, so if the incoming framebuffer size is not, we skip the attempt to recreate. This can happen eg on Windows when the window is minimized. (Until it is restored, rendering will basically be paused.) + +```cpp +auto Swapchain::recreate(glm::ivec2 size) -> bool { + // Image sizes must be positive. + if (size.x <= 0 || size.y <= 0) { return false; } + + auto const capabilities = + m_gpu.device.getSurfaceCapabilitiesKHR(m_ci.surface); + m_ci.setImageExtent(get_image_extent(capabilities, size)) + .setMinImageCount(get_image_count(capabilities)) + .setOldSwapchain(m_swapchain ? *m_swapchain : vk::SwapchainKHR{}) + .setQueueFamilyIndices(m_gpu.queue_family); + assert(m_ci.imageExtent.width > 0 && m_ci.imageExtent.height > 0 && + m_ci.minImageCount >= min_images_v); + + // wait for the device to be idle before destroying the current swapchain. + m_device.waitIdle(); + m_swapchain = m_device.createSwapchainKHRUnique(m_ci); + + return true; +} +``` + +After successful recreation we want to fill up those vectors of images and views. For the images we use a more verbose approach to avoid having to assign the member vector to a newly returned one every time: + +```cpp +void require_success(vk::Result const result, char const* error_msg) { + if (result != vk::Result::eSuccess) { throw std::runtime_error{error_msg}; } +} + +// ... +void Swapchain::populate_images() { + // we use the more verbose two-call API to avoid assigning m_images to a new + // vector on every call. + auto image_count = std::uint32_t{}; + auto result = + m_device.getSwapchainImagesKHR(*m_swapchain, &image_count, nullptr); + require_success(result, "Failed to get Swapchain Images"); + + m_images.resize(image_count); + result = m_device.getSwapchainImagesKHR(*m_swapchain, &image_count, + m_images.data()); + require_success(result, "Failed to get Swapchain Images"); +} +``` + +Creation of the views is fairly straightforward: + +```cpp +void Swapchain::create_image_views() { + auto subresource_range = vk::ImageSubresourceRange{}; + // this is a color image with 1 layer and 1 mip-level (the default). + subresource_range.setAspectMask(vk::ImageAspectFlagBits::eColor) + .setLayerCount(1) + .setLevelCount(1); + auto image_view_ci = vk::ImageViewCreateInfo{}; + // set common parameters here (everything except the Image). + image_view_ci.setViewType(vk::ImageViewType::e2D) + .setFormat(m_ci.imageFormat) + .setSubresourceRange(subresource_range); + m_image_views.clear(); + m_image_views.reserve(m_images.size()); + for (auto const image : m_images) { + image_view_ci.setImage(image); + m_image_views.push_back(m_device.createImageViewUnique(image_view_ci)); + } +} +``` + +We can now call these functions in `recreate()`, before `return true`, and add a log for some feedback: + +```cpp +populate_images(); +create_image_views(); + +size = get_size(); +std::println("[lvk] Swapchain [{}x{}]", size.x, size.y); +return true; +``` + +> The log can get a bit noisy on incessant resizing (especially on Linux). + +To get the framebuffer size, add a helper function in `window.hpp/cpp`: + +```cpp +auto glfw::framebuffer_size(GLFWwindow* window) -> glm::ivec2 { + auto ret = glm::ivec2{}; + glfwGetFramebufferSize(window, &ret.x, &ret.y); + return ret; +} +``` + +Finally, add a `std::optional` member to `App` after `m_device`, add the create function, and call it after `create_device()`: + +```cpp +std::optional m_swapchain{}; + +// ... +void App::create_swapchain() { + auto const size = glfw::framebuffer_size(m_window.get()); + m_swapchain.emplace(*m_device, m_gpu, *m_surface, size); +} +``` diff --git a/guide/translations/ko-KR/src/memory/README.md b/guide/translations/ko-KR/src/memory/README.md new file mode 100644 index 0000000..b58383a --- /dev/null +++ b/guide/translations/ko-KR/src/memory/README.md @@ -0,0 +1,5 @@ +# Memory Allocation + +Being an explicit API, [allocating memory](https://docs.vulkan.org/guide/latest/memory_allocation.html) in Vulkan that can be used by the device is the application's responsibility. The specifics can get quite complicated, but as recommended by the spec, we shall simply defer all that to a library: [Vulkan Memory Allocator (VMA)](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator). + +Vulkan exposes two kinds of objects that use such allocated memory: Buffers and Images, VMA offers transparent support for both: we just have to allocate/free buffers and images through VMA instead of the device directly. Unlike memory allocation / object construction on the CPU, there are many more parameters (than say alignment and size) to provide for the creation of buffers and images. As you might have guessed, we shall constrain ourselves to a subset that's relevant for shader resources: vertex buffers, uniform/storage buffers, and texture images. diff --git a/guide/translations/ko-KR/src/memory/buffers.md b/guide/translations/ko-KR/src/memory/buffers.md new file mode 100644 index 0000000..4c74806 --- /dev/null +++ b/guide/translations/ko-KR/src/memory/buffers.md @@ -0,0 +1,94 @@ +# Buffers + +First add the RAII wrapper components for VMA buffers: + +```cpp +struct RawBuffer { + [[nodiscard]] auto mapped_span() const -> std::span { + return std::span{static_cast(mapped), size}; + } + + auto operator==(RawBuffer const& rhs) const -> bool = default; + + VmaAllocator allocator{}; + VmaAllocation allocation{}; + vk::Buffer buffer{}; + vk::DeviceSize size{}; + void* mapped{}; +}; + +struct BufferDeleter { + void operator()(RawBuffer const& raw_buffer) const noexcept; +}; + +// ... +void BufferDeleter::operator()(RawBuffer const& raw_buffer) const noexcept { + vmaDestroyBuffer(raw_buffer.allocator, raw_buffer.buffer, + raw_buffer.allocation); +} +``` + +Buffers can be backed by host (RAM) or device (VRAM) memory: the former is mappable and thus useful for data that changes every frame, latter is faster to access for the GPU but needs more complex methods to copy data to. Add the related types and a create function: + +```cpp +struct BufferCreateInfo { + VmaAllocator allocator; + vk::BufferUsageFlags usage; + std::uint32_t queue_family; +}; + +enum class BufferMemoryType : std::int8_t { Host, Device }; + +[[nodiscard]] auto create_buffer(BufferCreateInfo const& create_info, + BufferMemoryType memory_type, + vk::DeviceSize size) -> Buffer; + +// ... +auto vma::create_buffer(BufferCreateInfo const& create_info, + BufferMemoryType const memory_type, + vk::DeviceSize const size) -> Buffer { + if (size == 0) { + std::println(stderr, "Buffer cannot be 0-sized"); + return {}; + } + + auto allocation_ci = VmaAllocationCreateInfo{}; + allocation_ci.flags = + VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; + auto usage = create_info.usage; + if (memory_type == BufferMemoryType::Device) { + allocation_ci.usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; + // device buffers need to support TransferDst. + usage |= vk::BufferUsageFlagBits::eTransferDst; + } else { + allocation_ci.usage = VMA_MEMORY_USAGE_AUTO_PREFER_HOST; + // host buffers can provide mapped memory. + allocation_ci.flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT; + } + + auto buffer_ci = vk::BufferCreateInfo{}; + buffer_ci.setQueueFamilyIndices(create_info.queue_family) + .setSize(size) + .setUsage(usage); + auto vma_buffer_ci = static_cast(buffer_ci); + + VmaAllocation allocation{}; + VkBuffer buffer{}; + auto allocation_info = VmaAllocationInfo{}; + auto const result = + vmaCreateBuffer(create_info.allocator, &vma_buffer_ci, &allocation_ci, + &buffer, &allocation, &allocation_info); + if (result != VK_SUCCESS) { + std::println(stderr, "Failed to create VMA Buffer"); + return {}; + } + + return RawBuffer{ + .allocator = create_info.allocator, + .allocation = allocation, + .buffer = buffer, + .size = size, + .mapped = allocation_info.pMappedData, + }; +} +``` diff --git a/guide/translations/ko-KR/src/memory/command_block.md b/guide/translations/ko-KR/src/memory/command_block.md new file mode 100644 index 0000000..6f5812b --- /dev/null +++ b/guide/translations/ko-KR/src/memory/command_block.md @@ -0,0 +1,84 @@ +# Command Block + +Long-lived vertex buffers perform better when backed by Device memory, especially for 3D meshes. Data is transferred to device buffers in two steps: + +1. Allocate a host buffer and copy the data to its mapped memory +1. Allocate a device buffer, record a Buffer Copy operation and submit it + +The second step requires a command buffer and queue submission (_and_ waiting for the submitted work to complete). Encapsulate this behavior into a class, it will also be used for creating images: + +```cpp +class CommandBlock { + public: + explicit CommandBlock(vk::Device device, vk::Queue queue, + vk::CommandPool command_pool); + + [[nodiscard]] auto command_buffer() const -> vk::CommandBuffer { + return *m_command_buffer; + } + + void submit_and_wait(); + + private: + vk::Device m_device{}; + vk::Queue m_queue{}; + vk::UniqueCommandBuffer m_command_buffer{}; +}; +``` + +The constructor takes an existing command pool created for such ad-hoc allocations, and the queue for submission later. This way it can be passed around after creation and used by other code. + +```cpp +CommandBlock::CommandBlock(vk::Device const device, vk::Queue const queue, + vk::CommandPool const command_pool) + : m_device(device), m_queue(queue) { + // allocate a UniqueCommandBuffer which will free the underlying command + // buffer from its owning pool on destruction. + auto allocate_info = vk::CommandBufferAllocateInfo{}; + allocate_info.setCommandPool(command_pool) + .setCommandBufferCount(1) + .setLevel(vk::CommandBufferLevel::ePrimary); + // all the current VulkanHPP functions for UniqueCommandBuffer allocation + // return vectors. + auto command_buffers = m_device.allocateCommandBuffersUnique(allocate_info); + m_command_buffer = std::move(command_buffers.front()); + + // start recording commands before returning. + auto begin_info = vk::CommandBufferBeginInfo{}; + begin_info.setFlags(vk::CommandBufferUsageFlagBits::eOneTimeSubmit); + m_command_buffer->begin(begin_info); +} +``` + +`submit_and_wait()` resets the unique command buffer at the end, to free it from its command pool: + +```cpp +void CommandBlock::submit_and_wait() { + if (!m_command_buffer) { return; } + + // end recording and submit. + m_command_buffer->end(); + auto submit_info = vk::SubmitInfo2KHR{}; + auto const command_buffer_info = + vk::CommandBufferSubmitInfo{*m_command_buffer}; + submit_info.setCommandBufferInfos(command_buffer_info); + auto fence = m_device.createFenceUnique({}); + m_queue.submit2(submit_info, *fence); + + // wait for submit fence to be signaled. + static constexpr auto timeout_v = + static_cast(std::chrono::nanoseconds(30s).count()); + auto const result = m_device.waitForFences(*fence, vk::True, timeout_v); + if (result != vk::Result::eSuccess) { + std::println(stderr, "Failed to submit Command Buffer"); + } + // free the command buffer. + m_command_buffer.reset(); +} +``` + +## Multithreading considerations + +Instead of blocking the main thread on every Command Block's `submit_and_wait()`, you might be wondering if command block usage could be multithreaded. The answer is yes! But with some extra work: each thread will require its own command pool - just using one owned (unique) pool per Command Block (with no need to free the buffer) is a good starting point. All queue operations need to be synchronized, ie a critical section protected by a mutex. This includes Swapchain acquire/present calls, and Queue submissions. A `class Queue` value type that stores a copy of the `vk::Queue` and a pointer/reference to its `std::mutex` - and wraps the submit call - can be passed to command blocks. Just this much will enable asynchronous asset loading etc, as each loading thread will use its own command pool, and queue submissions all around will be critical sections. `VmaAllocator` is internally synchronized (can be disabled at build time), so performing allocations through the same allocator on multiple threads is safe. + +For multi-threaded rendering, use a Secondary command buffer per thread to record rendering commands, accumulate and execute them in the main (Primary) command buffer currently in `RenderSync`. This is not particularly helpful unless you have thousands of expensive draw calls and dozens of render passes, as recording even a hundred draws will likely be faster on a single thread. diff --git a/guide/translations/ko-KR/src/memory/device_buffers.md b/guide/translations/ko-KR/src/memory/device_buffers.md new file mode 100644 index 0000000..804c704 --- /dev/null +++ b/guide/translations/ko-KR/src/memory/device_buffers.md @@ -0,0 +1,133 @@ +# Device Buffers + +This guide will only use device buffers for vertex buffers, where both vertex and index data will be strung together in a single VBO. The create function can thus take the data and perform the buffer copy operation before returning. In essence this return value is a "GPU const" buffer. To enable utilizing separate spans for vertices and indices (instead of forcing allocation of a contiguous bytestream and copying the data), the create function takes a slightly awkward span of spans: + +```cpp +// disparate byte spans. +using ByteSpans = std::span const>; + +// returns a Device Buffer with each byte span sequentially written. +[[nodiscard]] auto create_device_buffer(BufferCreateInfo const& create_info, + CommandBlock command_block, + ByteSpans const& byte_spans) -> Buffer; +``` + +Implement `create_device_buffer()`: + +```cpp +auto vma::create_device_buffer(BufferCreateInfo const& create_info, + CommandBlock command_block, + ByteSpans const& byte_spans) -> Buffer { + auto const total_size = std::accumulate( + byte_spans.begin(), byte_spans.end(), 0uz, + [](std::size_t const n, std::span bytes) { + return n + bytes.size(); + }); + + auto staging_ci = create_info; + staging_ci.usage = vk::BufferUsageFlagBits::eTransferSrc; + + // create staging Host Buffer with TransferSrc usage. + auto staging_buffer = + create_buffer(staging_ci, BufferMemoryType::Host, total_size); + // create the Device Buffer. + auto ret = create_buffer(create_info, BufferMemoryType::Device, total_size); + // can't do anything if either buffer creation failed. + if (!staging_buffer.get().buffer || !ret.get().buffer) { return {}; } + + // copy byte spans into staging buffer. + auto dst = staging_buffer.get().mapped_span(); + for (auto const bytes : byte_spans) { + std::memcpy(dst.data(), bytes.data(), bytes.size()); + dst = dst.subspan(bytes.size()); + } + + // record buffer copy operation. + auto buffer_copy = vk::BufferCopy2{}; + buffer_copy.setSize(total_size); + auto copy_buffer_info = vk::CopyBufferInfo2{}; + copy_buffer_info.setSrcBuffer(staging_buffer.get().buffer) + .setDstBuffer(ret.get().buffer) + .setRegions(buffer_copy); + command_block.command_buffer().copyBuffer2(copy_buffer_info); + + // submit and wait. + // waiting here is necessary to keep the staging buffer alive while the GPU + // accesses it through the recorded commands. + // this is also why the function takes ownership of the passed CommandBlock + // instead of just referencing it / taking a vk::CommandBuffer. + command_block.submit_and_wait(); + + return ret; +} +``` + +Add a command block pool to `App`, and a helper function to create command blocks: + +```cpp +void App::create_cmd_block_pool() { + auto command_pool_ci = vk::CommandPoolCreateInfo{}; + command_pool_ci + .setQueueFamilyIndex(m_gpu.queue_family) + // this flag indicates that the allocated Command Buffers will be + // short-lived. + .setFlags(vk::CommandPoolCreateFlagBits::eTransient); + m_cmd_block_pool = m_device->createCommandPoolUnique(command_pool_ci); +} + +auto App::create_command_block() const -> CommandBlock { + return CommandBlock{*m_device, m_queue, *m_cmd_block_pool}; +} +``` + +Update `create_vertex_buffer()` to create a quad with indices: + +```cpp +template +[[nodiscard]] constexpr auto to_byte_array(T const& t) { + return std::bit_cast>(t); +} + +// ... +void App::create_vertex_buffer() { + // vertices of a quad. + static constexpr auto vertices_v = std::array{ + Vertex{.position = {-0.5f, -0.5f}, .color = {1.0f, 0.0f, 0.0f}}, + Vertex{.position = {0.5f, -0.5f}, .color = {0.0f, 1.0f, 0.0f}}, + Vertex{.position = {0.5f, 0.5f}, .color = {0.0f, 0.0f, 1.0f}}, + Vertex{.position = {-0.5f, 0.5f}, .color = {1.0f, 1.0f, 0.0f}}, + }; + static constexpr auto indices_v = std::array{ + 0u, 1u, 2u, 2u, 3u, 0u, + }; + static constexpr auto vertices_bytes_v = to_byte_array(vertices_v); + static constexpr auto indices_bytes_v = to_byte_array(indices_v); + static constexpr auto total_bytes_v = + std::array, 2>{ + vertices_bytes_v, + indices_bytes_v, + }; + // we want to write total_bytes_v to a Device VertexBuffer | IndexBuffer. + m_vbo = vma::create_device_buffer(m_allocator.get(), + vk::BufferUsageFlagBits::eVertexBuffer | + vk::BufferUsageFlagBits::eIndexBuffer, + create_command_block(), total_bytes_v); +} +``` + +Update `draw()`: + +```cpp +void App::draw(vk::CommandBuffer const command_buffer) const { + m_shader->bind(command_buffer, m_framebuffer_size); + // single VBO at binding 0 at no offset. + command_buffer.bindVertexBuffers(0, m_vbo.get().buffer, vk::DeviceSize{}); + // u32 indices after offset of 4 vertices. + command_buffer.bindIndexBuffer(m_vbo.get().buffer, 4 * sizeof(Vertex), + vk::IndexType::eUint32); + // m_vbo has 6 indices. + command_buffer.drawIndexed(6, 1, 0, 0, 0); +} +``` + +![VBO Quad](./vbo_quad.png) diff --git a/guide/translations/ko-KR/src/memory/images.md b/guide/translations/ko-KR/src/memory/images.md new file mode 100644 index 0000000..583957c --- /dev/null +++ b/guide/translations/ko-KR/src/memory/images.md @@ -0,0 +1,184 @@ +# Images + +Images have a lot more properties and creation parameters than buffers. We shall constrain ourselves to just two kinds: sampled images (textures) for shaders, and depth images for rendering. For now add the foundation types and functions: + +```cpp +struct RawImage { + auto operator==(RawImage const& rhs) const -> bool = default; + + VmaAllocator allocator{}; + VmaAllocation allocation{}; + vk::Image image{}; + vk::Extent2D extent{}; + vk::Format format{}; + std::uint32_t levels{}; +}; + +struct ImageDeleter { + void operator()(RawImage const& raw_image) const noexcept; +}; + +using Image = Scoped; + +struct ImageCreateInfo { + VmaAllocator allocator; + std::uint32_t queue_family; +}; + +[[nodiscard]] auto create_image(ImageCreateInfo const& create_info, + vk::ImageUsageFlags usage, std::uint32_t levels, + vk::Format format, vk::Extent2D extent) + -> Image; +``` + +Implementation: + +```cpp +void ImageDeleter::operator()(RawImage const& raw_image) const noexcept { + vmaDestroyImage(raw_image.allocator, raw_image.image, raw_image.allocation); +} + +// ... +auto vma::create_image(ImageCreateInfo const& create_info, + vk::ImageUsageFlags const usage, + std::uint32_t const levels, vk::Format const format, + vk::Extent2D const extent) -> Image { + if (extent.width == 0 || extent.height == 0) { + std::println(stderr, "Images cannot have 0 width or height"); + return {}; + } + auto image_ci = vk::ImageCreateInfo{}; + image_ci.setImageType(vk::ImageType::e2D) + .setExtent({extent.width, extent.height, 1}) + .setFormat(format) + .setUsage(usage) + .setArrayLayers(1) + .setMipLevels(levels) + .setSamples(vk::SampleCountFlagBits::e1) + .setTiling(vk::ImageTiling::eOptimal) + .setInitialLayout(vk::ImageLayout::eUndefined) + .setQueueFamilyIndices(create_info.queue_family); + auto const vk_image_ci = static_cast(image_ci); + + auto allocation_ci = VmaAllocationCreateInfo{}; + allocation_ci.usage = VMA_MEMORY_USAGE_AUTO; + VkImage image{}; + VmaAllocation allocation{}; + auto const result = vmaCreateImage(create_info.allocator, &vk_image_ci, + &allocation_ci, &image, &allocation, {}); + if (result != VK_SUCCESS) { + std::println(stderr, "Failed to create VMA Image"); + return {}; + } + + return RawImage{ + .allocator = create_info.allocator, + .allocation = allocation, + .image = image, + .extent = extent, + .format = format, + .levels = levels, + }; +} +``` + +For creating sampled images, we need both the image bytes and size (extent). Wrap that into a struct: + +```cpp +struct Bitmap { + std::span bytes{}; + glm::ivec2 size{}; +}; +``` + +The creation process is similar to device buffers: requiring a staging copy, but it also needs layout transitions. In short: + +1. Create the image and staging buffer +1. Transition the layout from Undefined to TransferDst +1. Record a buffer image copy operation +1. Transition the layout from TransferDst to ShaderReadOnlyOptimal + +```cpp +auto vma::create_sampled_image(ImageCreateInfo const& create_info, + CommandBlock command_block, Bitmap const& bitmap) + -> Image { + // create image. + // no mip-mapping right now: 1 level. + auto const mip_levels = 1u; + auto const usize = glm::uvec2{bitmap.size}; + auto const extent = vk::Extent2D{usize.x, usize.y}; + auto const usage = + vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled; + auto ret = create_image(create_info, usage, mip_levels, + vk::Format::eR8G8B8A8Srgb, extent); + + // create staging buffer. + auto const buffer_ci = BufferCreateInfo{ + .allocator = create_info.allocator, + .usage = vk::BufferUsageFlagBits::eTransferSrc, + .queue_family = create_info.queue_family, + }; + auto const staging_buffer = create_buffer(buffer_ci, BufferMemoryType::Host, + bitmap.bytes.size_bytes()); + + // can't do anything if either creation failed. + if (!ret.get().image || !staging_buffer.get().buffer) { return {}; } + + // copy bytes into staging buffer. + std::memcpy(staging_buffer.get().mapped, bitmap.bytes.data(), + bitmap.bytes.size_bytes()); + + // transition image for transfer. + auto dependency_info = vk::DependencyInfo{}; + auto subresource_range = vk::ImageSubresourceRange{}; + subresource_range.setAspectMask(vk::ImageAspectFlagBits::eColor) + .setLayerCount(1) + .setLevelCount(mip_levels); + auto barrier = vk::ImageMemoryBarrier2{}; + barrier.setImage(ret.get().image) + .setSrcQueueFamilyIndex(create_info.queue_family) + .setDstQueueFamilyIndex(create_info.queue_family) + .setOldLayout(vk::ImageLayout::eUndefined) + .setNewLayout(vk::ImageLayout::eTransferDstOptimal) + .setSubresourceRange(subresource_range) + .setSrcStageMask(vk::PipelineStageFlagBits2::eTopOfPipe) + .setSrcAccessMask(vk::AccessFlagBits2::eNone) + .setDstStageMask(vk::PipelineStageFlagBits2::eTransfer) + .setDstAccessMask(vk::AccessFlagBits2::eMemoryRead | + vk::AccessFlagBits2::eMemoryWrite); + dependency_info.setImageMemoryBarriers(barrier); + command_block.command_buffer().pipelineBarrier2(dependency_info); + + // record buffer image copy. + auto buffer_image_copy = vk::BufferImageCopy2{}; + auto subresource_layers = vk::ImageSubresourceLayers{}; + subresource_layers.setAspectMask(vk::ImageAspectFlagBits::eColor) + .setLayerCount(1) + .setLayerCount(mip_levels); + buffer_image_copy.setImageSubresource(subresource_layers) + .setImageExtent(vk::Extent3D{extent.width, extent.height, 1}); + auto copy_info = vk::CopyBufferToImageInfo2{}; + copy_info.setDstImage(ret.get().image) + .setDstImageLayout(vk::ImageLayout::eTransferDstOptimal) + .setSrcBuffer(staging_buffer.get().buffer) + .setRegions(buffer_image_copy); + command_block.command_buffer().copyBufferToImage2(copy_info); + + // transition image for sampling. + barrier.setOldLayout(barrier.newLayout) + .setNewLayout(vk::ImageLayout::eShaderReadOnlyOptimal) + .setSrcStageMask(barrier.dstStageMask) + .setSrcAccessMask(barrier.dstAccessMask) + .setDstStageMask(vk::PipelineStageFlagBits2::eAllGraphics) + .setDstAccessMask(vk::AccessFlagBits2::eMemoryRead | + vk::AccessFlagBits2::eMemoryWrite); + dependency_info.setImageMemoryBarriers(barrier); + command_block.command_buffer().pipelineBarrier2(dependency_info); + + command_block.submit_and_wait(); + + return ret; +} +``` + +Before such images can be used as textures, we need to set up Descriptor Set infrastructure. diff --git a/guide/translations/ko-KR/src/memory/vbo_quad.png b/guide/translations/ko-KR/src/memory/vbo_quad.png new file mode 100644 index 0000000000000000000000000000000000000000..554785ba7c1c950d2c076d7482a9ae3f5a522634 GIT binary patch literal 74756 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 2x 32-bit floats. + vk::VertexInputAttributeDescription2EXT{0, 0, vk::Format::eR32G32Sfloat, + offsetof(Vertex, position)}, + // vec3 => 3x 32-bit floats + vk::VertexInputAttributeDescription2EXT{1, 0, vk::Format::eR32G32B32Sfloat, + offsetof(Vertex, color)}, +}; + +// one vertex binding at location 0. +constexpr auto vertex_bindings_v = std::array{ + // we are using interleaved data with a stride of sizeof(Vertex). + vk::VertexInputBindingDescription2EXT{0, sizeof(Vertex), + vk::VertexInputRate::eVertex, 1}, +}; +``` + +Add the vertex attributes and bindings to the Shader Create Info: + +```cpp +// ... +static constexpr auto vertex_input_v = ShaderVertexInput{ + .attributes = vertex_attributes_v, + .bindings = vertex_bindings_v, +}; +auto const shader_ci = ShaderProgram::CreateInfo{ + .device = *m_device, + .vertex_spirv = vertex_spirv, + .fragment_spirv = fragment_spirv, + .vertex_input = vertex_input_v, + .set_layouts = {}, +}; +// ... +``` + +With the vertex input defined, we can update the vertex shader and recompile it: + +```glsl +#version 450 core + +layout (location = 0) in vec2 a_pos; +layout (location = 1) in vec3 a_color; + +layout (location = 0) out vec3 out_color; + +void main() { + const vec2 position = a_pos; + + out_color = a_color; + gl_Position = vec4(position, 0.0, 1.0); +} +``` + +Add a VBO (Vertex Buffer Object) member and create it: + +```cpp +void App::create_vertex_buffer() { + // vertices moved from the shader. + static constexpr auto vertices_v = std::array{ + Vertex{.position = {-0.5f, -0.5f}, .color = {1.0f, 0.0f, 0.0f}}, + Vertex{.position = {0.5f, -0.5f}, .color = {0.0f, 1.0f, 0.0f}}, + Vertex{.position = {0.0f, 0.5f}, .color = {0.0f, 0.0f, 1.0f}}, + }; + + // we want to write vertices_v to a Host VertexBuffer. + auto const buffer_ci = vma::BufferCreateInfo{ + .allocator = m_allocator.get(), + .usage = vk::BufferUsageFlagBits::eVertexBuffer, + .queue_family = m_gpu.queue_family, + }; + m_vbo = vma::create_buffer(buffer_ci, vma::BufferMemoryType::Host, + sizeof(vertices_v)); + + // host buffers have a memory-mapped pointer available to memcpy data to. + std::memcpy(m_vbo.get().mapped, vertices_v.data(), sizeof(vertices_v)); +} +``` + +Bind the VBO before recording the draw call: + +```cpp +// single VBO at binding 0 at no offset. +command_buffer.bindVertexBuffers(0, m_vbo->get_raw().buffer, + vk::DeviceSize{}); +// m_vbo has 3 vertices. +command_buffer.draw(3, 1, 0, 0); +``` + +You should see the same triangle as before. But now we can use whatever set of vertices we like! The Primitive Topology is Triange List by default, so every three vertices in the array is drawn as a triangle, eg for 9 vertices: `[[0, 1, 2], [3, 4, 5], [6, 7, 8]]`, where each inner `[]` represents a triangle comprised of the vertices at those indices. Try playing around with customized vertices and topologies, use Render Doc to debug unexpected outputs / bugs. + +Host Vertex Buffers are useful for primitives that are temporary and/or frequently changing, such as UI objects. A 2D framework can use such VBOs exclusively: a simple approach would be a pool of buffers per virtual frame where for each draw a buffer is obtained from the current virtual frame's pool and vertices are copied in. diff --git a/guide/translations/ko-KR/src/memory/vma.md b/guide/translations/ko-KR/src/memory/vma.md new file mode 100644 index 0000000..25e90c7 --- /dev/null +++ b/guide/translations/ko-KR/src/memory/vma.md @@ -0,0 +1,66 @@ +# Vulkan Memory Allocator + +VMA has full CMake support, but it is also a single-header library that requires users to "instantiate" it in a single translation unit. Isolating that into a wrapper library to minimize warning pollution etc, we create our own `vma::vma` target that compiles this source file: + +```cpp +// vk_mem_alloc.cpp +#define VMA_IMPLEMENTATION + +#include +``` + +Unlike VulkanHPP, VMA's interface is C only, thus we shall use our `Scoped` class template to wrap objects in RAII types. The first thing we need is a `VmaAllocator`, which is similar to a `vk::Device` or `GLFWwindow*`: + +```cpp +// vma.hpp +namespace lvk::vma { +struct Deleter { + void operator()(VmaAllocator allocator) const noexcept; +}; + +using Allocator = Scoped; + +[[nodiscard]] auto create_allocator(vk::Instance instance, + vk::PhysicalDevice physical_device, + vk::Device device) -> Allocator; +} // namespace lvk::vma + +// vma.cpp +void Deleter::operator()(VmaAllocator allocator) const noexcept { + vmaDestroyAllocator(allocator); +} + +// ... +auto vma::create_allocator(vk::Instance const instance, + vk::PhysicalDevice const physical_device, + vk::Device const device) -> Allocator { + auto const& dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER; + // need to zero initialize C structs, unlike VulkanHPP. + auto vma_vk_funcs = VmaVulkanFunctions{}; + vma_vk_funcs.vkGetInstanceProcAddr = dispatcher.vkGetInstanceProcAddr; + vma_vk_funcs.vkGetDeviceProcAddr = dispatcher.vkGetDeviceProcAddr; + + auto allocator_ci = VmaAllocatorCreateInfo{}; + allocator_ci.physicalDevice = physical_device; + allocator_ci.device = device; + allocator_ci.pVulkanFunctions = &vma_vk_funcs; + allocator_ci.instance = instance; + VmaAllocator ret{}; + auto const result = vmaCreateAllocator(&allocator_ci, &ret); + if (result == VK_SUCCESS) { return ret; } + + throw std::runtime_error{"Failed to create Vulkan Memory Allocator"}; +} +``` + +`App` stores and creates a `vma::Allocator` object: + +```cpp +// ... +vma::Allocator m_allocator{}; // anywhere between m_device and m_shader. + +// ... +void App::create_allocator() { + m_allocator = vma::create_allocator(*m_instance, m_gpu.device, *m_device); +} +``` diff --git a/guide/translations/ko-KR/src/rendering/README.md b/guide/translations/ko-KR/src/rendering/README.md new file mode 100644 index 0000000..ddd1e9f --- /dev/null +++ b/guide/translations/ko-KR/src/rendering/README.md @@ -0,0 +1,3 @@ +# Rendering + +This section implements Render Sync, the Swapchain loop, performs Swapchain image layout transitions, and introduces [Dynamic Rendering](https://docs.vulkan.org/samples/latest/samples/extensions/dynamic_rendering/README.html). Originally Vulkan only supported [Render Passes](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/03_Render_passes.html), which are quite verbose to setup, require somewhat confusing subpass dependencies, and are ironically _less_ explicit: they can perform implicit layout transitions on their framebuffer attachments. They are also tightly coupled to Graphics Pipelines, you need a separate pipeline object for each Render Pass, even if they are identical in all other respects. This RenderPass/Subpass model was primarily beneficial for GPUs with tiled renderers, and in Vulkan 1.3 Dynamic Rendering was promoted to the core API (previously it was an extension) as an alternative to using Render Passes. diff --git a/guide/translations/ko-KR/src/rendering/dynamic_rendering.md b/guide/translations/ko-KR/src/rendering/dynamic_rendering.md new file mode 100644 index 0000000..b913b64 --- /dev/null +++ b/guide/translations/ko-KR/src/rendering/dynamic_rendering.md @@ -0,0 +1,212 @@ +# Dynamic Rendering + +Dynamic Rendering enables us to avoid using Render Passes, which are quite a bit more verbose (but also generally more performant on tiled GPUs). Here we tie together the Swapchain, Render Sync, and rendering. We are not ready to actually render anything yet, but can clear the image to a particular color. + +Add these new members to `App`: + +```cpp +auto acquire_render_target() -> bool; +auto begin_frame() -> vk::CommandBuffer; +void transition_for_render(vk::CommandBuffer command_buffer) const; +void render(vk::CommandBuffer command_buffer); +void transition_for_present(vk::CommandBuffer command_buffer) const; +void submit_and_present(); + +// ... +glm::ivec2 m_framebuffer_size{}; +std::optional m_render_target{}; +``` + +The main loop can now use these to implement the Swapchain and rendering loop: + +```cpp +while (glfwWindowShouldClose(m_window.get()) == GLFW_FALSE) { + glfwPollEvents(); + if (!acquire_render_target()) { continue; } + auto const command_buffer = begin_frame(); + transition_for_render(command_buffer); + render(command_buffer); + transition_for_present(command_buffer); + submit_and_present(); +} +``` + +Before acquiring a Swapchain image, we need to wait for the current frame's fence. If acquisition is successful, reset the fence ('un'signal it): + +```cpp +auto App::acquire_render_target() -> bool { + m_framebuffer_size = glfw::framebuffer_size(m_window.get()); + // minimized? skip loop. + if (m_framebuffer_size.x <= 0 || m_framebuffer_size.y <= 0) { + return false; + } + + auto& render_sync = m_render_sync.at(m_frame_index); + + // wait for the fence to be signaled. + static constexpr auto fence_timeout_v = + static_cast(std::chrono::nanoseconds{3s}.count()); + auto result = + m_device->waitForFences(*render_sync.drawn, vk::True, fence_timeout_v); + if (result != vk::Result::eSuccess) { + throw std::runtime_error{"Failed to wait for Render Fence"}; + } + + m_render_target = m_swapchain->acquire_next_image(*render_sync.draw); + if (!m_render_target) { + // acquire failure => ErrorOutOfDate. Recreate Swapchain. + m_swapchain->recreate(m_framebuffer_size); + return false; + } + + // reset fence _after_ acquisition of image: if it fails, the + // fence remains signaled. + m_device->resetFences(*render_sync.drawn); + + return true; +} +``` + +Since the fence has been reset, a queue submission must be made that signals it before continuing, otherwise the app will deadlock on the next wait (and eventually throw after 3s). Begin Command Buffer recording: + +```cpp +auto App::begin_frame() -> vk::CommandBuffer { + auto const& render_sync = m_render_sync.at(m_frame_index); + + auto command_buffer_bi = vk::CommandBufferBeginInfo{}; + // this flag means recorded commands will not be reused. + command_buffer_bi.setFlags(vk::CommandBufferUsageFlagBits::eOneTimeSubmit); + render_sync.command_buffer.begin(command_buffer_bi); + return render_sync.command_buffer; +} +``` + +Transition the image for rendering, ie Attachment Optimal layout. Set up the image barrier and record it: + +```cpp +void App::transition_for_render(vk::CommandBuffer const command_buffer) const { + auto dependency_info = vk::DependencyInfo{}; + auto barrier = m_swapchain->base_barrier(); + // Undefined => AttachmentOptimal + // the barrier must wait for prior color attachment operations to complete, + // and block subsequent ones. + barrier.setOldLayout(vk::ImageLayout::eUndefined) + .setNewLayout(vk::ImageLayout::eAttachmentOptimal) + .setSrcAccessMask(vk::AccessFlagBits2::eColorAttachmentRead | + vk::AccessFlagBits2::eColorAttachmentWrite) + .setSrcStageMask(vk::PipelineStageFlagBits2::eColorAttachmentOutput) + .setDstAccessMask(barrier.srcAccessMask) + .setDstStageMask(barrier.srcStageMask); + dependency_info.setImageMemoryBarriers(barrier); + command_buffer.pipelineBarrier2(dependency_info); +} +``` + +Create a Rendering Attachment Info using the acquired image as the color target. We use a red clear color, make sure the Load Op clears the image, and Store Op stores the results (currently just the cleared image). Set up a Rendering Info object with the color attachment and the entire image as the render area. Finally, execute the render: + +```cpp +void App::render(vk::CommandBuffer const command_buffer) { + auto color_attachment = vk::RenderingAttachmentInfo{}; + color_attachment.setImageView(m_render_target->image_view) + .setImageLayout(vk::ImageLayout::eAttachmentOptimal) + .setLoadOp(vk::AttachmentLoadOp::eClear) + .setStoreOp(vk::AttachmentStoreOp::eStore) + // temporarily red. + .setClearValue(vk::ClearColorValue{1.0f, 0.0f, 0.0f, 1.0f}); + auto rendering_info = vk::RenderingInfo{}; + auto const render_area = + vk::Rect2D{vk::Offset2D{}, m_render_target->extent}; + rendering_info.setRenderArea(render_area) + .setColorAttachments(color_attachment) + .setLayerCount(1); + + command_buffer.beginRendering(rendering_info); + // draw stuff here. + command_buffer.endRendering(); +} +``` + +Transition the image for presentation: + +```cpp +void App::transition_for_present(vk::CommandBuffer const command_buffer) const { + auto dependency_info = vk::DependencyInfo{}; + auto barrier = m_swapchain->base_barrier(); + // AttachmentOptimal => PresentSrc + // the barrier must wait for prior color attachment operations to complete, + // and block subsequent ones. + barrier.setOldLayout(vk::ImageLayout::eAttachmentOptimal) + .setNewLayout(vk::ImageLayout::ePresentSrcKHR) + .setSrcAccessMask(vk::AccessFlagBits2::eColorAttachmentRead | + vk::AccessFlagBits2::eColorAttachmentWrite) + .setSrcStageMask(vk::PipelineStageFlagBits2::eColorAttachmentOutput) + .setDstAccessMask(barrier.srcAccessMask) + .setDstStageMask(barrier.srcStageMask); + dependency_info.setImageMemoryBarriers(barrier); + command_buffer.pipelineBarrier2(dependency_info); +} +``` + +End the command buffer and submit it. The `draw` Semaphore will be signaled by the Swapchain when the image is ready, which will trigger this command buffer's execution. It will signal the `present` Semaphore and `drawn` Fence on completion, with the latter being waited on the next time this virtual frame is processed. Finally, we increment the frame index, pass the `present` semaphore as the one for the subsequent present operation to wait on: + +```cpp +void App::submit_and_present() { + auto const& render_sync = m_render_sync.at(m_frame_index); + render_sync.command_buffer.end(); + + auto submit_info = vk::SubmitInfo2{}; + auto const command_buffer_info = + vk::CommandBufferSubmitInfo{render_sync.command_buffer}; + auto wait_semaphore_info = vk::SemaphoreSubmitInfo{}; + wait_semaphore_info.setSemaphore(*render_sync.draw) + .setStageMask(vk::PipelineStageFlagBits2::eColorAttachmentOutput); + auto signal_semaphore_info = vk::SemaphoreSubmitInfo{}; + signal_semaphore_info.setSemaphore(*render_sync.present) + .setStageMask(vk::PipelineStageFlagBits2::eColorAttachmentOutput); + submit_info.setCommandBufferInfos(command_buffer_info) + .setWaitSemaphoreInfos(wait_semaphore_info) + .setSignalSemaphoreInfos(signal_semaphore_info); + m_queue.submit2(submit_info, *render_sync.drawn); + + m_frame_index = (m_frame_index + 1) % m_render_sync.size(); + m_render_target.reset(); + + // an eErrorOutOfDateKHR result is not guaranteed if the + // framebuffer size does not match the Swapchain image size, check it + // explicitly. + auto const fb_size_changed = m_framebuffer_size != m_swapchain->get_size(); + auto const out_of_date = + !m_swapchain->present(m_queue, *render_sync.present); + if (fb_size_changed || out_of_date) { + m_swapchain->recreate(m_framebuffer_size); + } +} +``` + +> Wayland users: congratulaions, you can finally see and interact with the window! + +![Cleared Image](./dynamic_rendering_red_clear.png) + +## Render Doc on Wayland + +At the time of writing, RenderDoc doesn't support inspecting Wayland applications. Temporarily force X11 (XWayland) by calling `glfwInitHint()` before `glfwInit()`: + +```cpp +glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_X11); +``` + +Setting up a command line option to conditionally call this is a simple and flexible approach: just set that argument in RenderDoc itself and/or pass it whenever an X11 backend is desired: + +```cpp +// main.cpp +// skip the first argument. +auto args = std::span{argv, static_cast(argc)}.subspan(1); +while (!args.empty()) { + auto const arg = std::string_view{args.front()}; + if (arg == "-x" || arg == "--force-x11") { + glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_X11); + } + args = args.subspan(1); +} +lvk::App{}.run(); +``` diff --git a/guide/translations/ko-KR/src/rendering/dynamic_rendering_red_clear.png b/guide/translations/ko-KR/src/rendering/dynamic_rendering_red_clear.png new file mode 100644 index 0000000000000000000000000000000000000000..b041e29844e6787e7eb6399e9696dab09ba85ca4 GIT binary patch literal 18626 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 Yn5pftbCJtBG;;j=grgn#*yTI_7b2aE`~Uy| literal 0 HcmV?d00001 diff --git a/guide/translations/ko-KR/src/rendering/render_sync.md b/guide/translations/ko-KR/src/rendering/render_sync.md new file mode 100644 index 0000000..f18023d --- /dev/null +++ b/guide/translations/ko-KR/src/rendering/render_sync.md @@ -0,0 +1,75 @@ +# Render Sync + +Create a new header `resource_buffering.hpp`: + +```cpp +// Number of virtual frames. +inline constexpr std::size_t buffering_v{2}; + +// Alias for N-buffered resources. +template +using Buffered = std::array; +``` + +Add a private `struct RenderSync` to `App`: + +```cpp +struct RenderSync { + // signaled when Swapchain image has been acquired. + vk::UniqueSemaphore draw{}; + // signaled when image is ready to be presented. + vk::UniqueSemaphore present{}; + // signaled with present Semaphore, waited on before next render. + vk::UniqueFence drawn{}; + // used to record rendering commands. + vk::CommandBuffer command_buffer{}; +}; +``` + +Add the new members associated with the Swapchain loop: + +```cpp +// command pool for all render Command Buffers. +vk::UniqueCommandPool m_render_cmd_pool{}; +// Sync and Command Buffer for virtual frames. +Buffered m_render_sync{}; +// Current virtual frame index. +std::size_t m_frame_index{}; +``` + +Add, implement, and call the create function: + +```cpp +void App::create_render_sync() { + // Command Buffers are 'allocated' from a Command Pool (which is 'created' + // like all other Vulkan objects so far). We can allocate all the buffers + // from a single pool here. + auto command_pool_ci = vk::CommandPoolCreateInfo{}; + // this flag enables resetting the command buffer for re-recording (unlike a + // single-time submit scenario). + command_pool_ci.setFlags(vk::CommandPoolCreateFlagBits::eResetCommandBuffer) + .setQueueFamilyIndex(m_gpu.queue_family); + m_render_cmd_pool = m_device->createCommandPoolUnique(command_pool_ci); + + auto command_buffer_ai = vk::CommandBufferAllocateInfo{}; + command_buffer_ai.setCommandPool(*m_render_cmd_pool) + .setCommandBufferCount(static_cast(resource_buffering_v)) + .setLevel(vk::CommandBufferLevel::ePrimary); + auto const command_buffers = + m_device->allocateCommandBuffers(command_buffer_ai); + assert(command_buffers.size() == m_render_sync.size()); + + // we create Render Fences as pre-signaled so that on the first render for + // each virtual frame we don't wait on their fences (since there's nothing + // to wait for yet). + static constexpr auto fence_create_info_v = + vk::FenceCreateInfo{vk::FenceCreateFlagBits::eSignaled}; + for (auto [sync, command_buffer] : + std::views::zip(m_render_sync, command_buffers)) { + sync.command_buffer = command_buffer; + sync.draw = m_device->createSemaphoreUnique({}); + sync.present = m_device->createSemaphoreUnique({}); + sync.drawn = m_device->createFenceUnique(fence_create_info_v); + } +} +``` diff --git a/guide/translations/ko-KR/src/rendering/swapchain_loop.md b/guide/translations/ko-KR/src/rendering/swapchain_loop.md new file mode 100644 index 0000000..64f7043 --- /dev/null +++ b/guide/translations/ko-KR/src/rendering/swapchain_loop.md @@ -0,0 +1,28 @@ +# Swapchain Loop + +One part of rendering in the main loop is the Swapchain loop, which at a high level comprises of these steps: + +1. Acquire a Swapchain Image +1. Render to the acquired Image +1. Present the Image (this releases the image back to the Swapchain) + +![WSI Engine](./wsi_engine.png) + +There are a few nuances to deal with, for instance: + +1. Acquiring (and/or presenting) will sometimes fail (eg because the Swapchain is out of date), in which case the remaining steps need to be skipped +1. The acquire command can return before the image is actually ready for use, rendering needs to be synchronized to only start after the image is ready +1. Similarly, presentation needs to be synchronized to only occur after rendering has completed +1. The images need appropriate Layout Transitions at each stage + +Additionally, the number of swapchain images can vary, whereas the engine should use a fixed number of _virtual frames_: 2 for double buffering, 3 for triple (more is usually overkill). More info is available [here](https://docs.vulkan.org/samples/latest/samples/performance/swapchain_images/README.html#_double_buffering_or_triple_buffering). It's also possible for the main loop to acquire the same image before a previous render command has finished (or even started), if the Swapchain is using Mailbox Present Mode. While FIFO will block until the oldest submitted image is available (also known as vsync), we should still synchronize and wait until the acquired image has finished rendering. + +## Virtual Frames + +All the dynamic resources used during the rendering of a frame comprise a virtual frame. The application has a fixed number of virtual frames which it cycles through on each render pass. For synchronization, each frame will be associated with a [`vk::Fence`](https://docs.vulkan.org/spec/latest/chapters/synchronization.html#synchronization-fences) which will be waited on before rendering to it again. It will also have a pair of [`vk::Semaphore`](https://docs.vulkan.org/spec/latest/chapters/synchronization.html#synchronization-semaphores)s to synchronize the acquire, render, and present calls on the GPU (we don't need to wait for them on the CPU side / in C++). For recording commands, there will be a [`vk::CommandBuffer`](https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html) per virtual frame, where all rendering commands for that frame (including layout transitions) will be recorded. + +## Image Layouts + +Vulkan Images have a property known as [Image Layout](https://docs.vulkan.org/spec/latest/chapters/resources.html#resources-image-layouts). Most operations on images and their subresources require them to be in certain specific layouts, requiring transitions before (and after). A layout transition conveniently also functions as a Pipeline Barrier (think memory barrier on the GPU), enabling us to synchronize operations before and after the transition. + +Vulkan Synchronization is arguably the most complicated aspect of the API, a good amount of research is recommended. Here is an [article explaining barriers](https://gpuopen.com/learn/vulkan-barriers-explained/). diff --git a/guide/translations/ko-KR/src/rendering/swapchain_update.md b/guide/translations/ko-KR/src/rendering/swapchain_update.md new file mode 100644 index 0000000..20191d9 --- /dev/null +++ b/guide/translations/ko-KR/src/rendering/swapchain_update.md @@ -0,0 +1,98 @@ +# Swapchain Update + +Swapchain acquire/present operations can have various results. We constrain ourselves to the following: + +- `eSuccess`: all good +- `eSuboptimalKHR`: also all good (not an error, and this is unlikely to occur on a desktop) +- `eErrorOutOfDateKHR`: Swapchain needs to be recreated +- Any other `vk::Result`: fatal/unexpected error + +Expressing as a helper function in `swapchain.cpp`: + +```cpp +auto needs_recreation(vk::Result const result) -> bool { + switch (result) { + case vk::Result::eSuccess: + case vk::Result::eSuboptimalKHR: return false; + case vk::Result::eErrorOutOfDateKHR: return true; + default: break; + } + throw std::runtime_error{"Swapchain Error"}; +} +``` + +We also want to return the Image, Image View, and size upon successful acquisition of the underlying Swapchain Image. Wrapping those in a `struct`: + +```cpp +struct RenderTarget { + vk::Image image{}; + vk::ImageView image_view{}; + vk::Extent2D extent{}; +}; +``` + +VulkanHPP's primary API throws if the `vk::Result` corresponds to an error (based on the spec). `eErrorOutOfDateKHR` is technically an error, but it's quite possible to get it when the framebuffer size doesn't match the Swapchain size. To avoid having to deal with exceptions here, we use the alternate API for the acquire and present calls (overloads distinguished by pointer arguments and/or out parameters, and returning a `vk::Result`). + +Implementing the acquire operation: + +```cpp +auto Swapchain::acquire_next_image(vk::Semaphore const to_signal) + -> std::optional { + assert(!m_image_index); + static constexpr auto timeout_v = std::numeric_limits::max(); + // avoid VulkanHPP ErrorOutOfDateKHR exceptions by using alternate API that + // returns a Result. + auto image_index = std::uint32_t{}; + auto const result = m_device.acquireNextImageKHR( + *m_swapchain, timeout_v, to_signal, {}, &image_index); + if (needs_recreation(result)) { return {}; } + + m_image_index = static_cast(image_index); + return RenderTarget{ + .image = m_images.at(*m_image_index), + .image_view = *m_image_views.at(*m_image_index), + .extent = m_ci.imageExtent, + }; +} +``` + +Similarly, present: + +```cpp +auto Swapchain::present(vk::Queue const queue, vk::Semaphore const to_wait) + -> bool { + auto const image_index = static_cast(m_image_index.value()); + auto present_info = vk::PresentInfoKHR{}; + present_info.setSwapchains(*m_swapchain) + .setImageIndices(image_index) + .setWaitSemaphores(to_wait); + // avoid VulkanHPP ErrorOutOfDateKHR exceptions by using alternate API. + auto const result = queue.presentKHR(&present_info); + m_image_index.reset(); + return !needs_recreation(result); +} +``` + +It is the responsibility of the user (`class App`) to recreate the Swapchain on receiving `std::nullopt` / `false` return values for either operation. Users will also need to transition the layouts of the returned images between acquire and present operations. Add a helper to assist in that process, and extract the Image Subresource Range out as a common constant: + +```cpp +constexpr auto subresource_range_v = [] { + auto ret = vk::ImageSubresourceRange{}; + // this is a color image with 1 layer and 1 mip-level (the default). + ret.setAspectMask(vk::ImageAspectFlagBits::eColor) + .setLayerCount(1) + .setLevelCount(1); + return ret; +}(); + +// ... +auto Swapchain::base_barrier() const -> vk::ImageMemoryBarrier2 { + // fill up the parts common to all barriers. + auto ret = vk::ImageMemoryBarrier2{}; + ret.setImage(m_images.at(m_image_index.value())) + .setSubresourceRange(subresource_range_v) + .setSrcQueueFamilyIndex(m_gpu.queue_family) + .setDstQueueFamilyIndex(m_gpu.queue_family); + return ret; +} +``` diff --git a/guide/translations/ko-KR/src/rendering/wsi_engine.png b/guide/translations/ko-KR/src/rendering/wsi_engine.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d3756545d5c922d41c9313fb2334039d313b45 GIT binary patch literal 41484 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 tBxo6u;z*DnLCcU7M}h fs::path; + +// ... +void create_shader(); + +// ... +std::optional m_shader{}; +``` + +Implement and call `create_shader()` (and `asset_path()`): + +```cpp +void App::create_shader() { + auto const vertex_spirv = to_spir_v(asset_path("shader.vert")); + auto const fragment_spirv = to_spir_v(asset_path("shader.frag")); + auto const shader_ci = ShaderProgram::CreateInfo{ + .device = *m_device, + .vertex_spirv = vertex_spirv, + .fragment_spirv = fragment_spirv, + .vertex_input = {}, + .set_layouts = {}, + }; + m_shader.emplace(shader_ci); +} + +auto App::asset_path(std::string_view const uri) const -> fs::path { + return m_assets_dir / uri; +} +``` + +Before `render()` grows to an unwieldy size, extract the higher level logic into two member functions: + +```cpp +// ImGui code goes here. +void inspect(); +// Issue draw calls here. +void draw(vk::CommandBuffer command_buffer) const; + +// ... +void App::inspect() { + ImGui::ShowDemoWindow(); + // TODO +} + +// ... +command_buffer.beginRendering(rendering_info); +inspect(); +draw(command_buffer); +command_buffer.endRendering(); +``` + +We can now bind the shader and use it to draw the triangle in the shader. Making `draw()` `const` forces us to ensure no `App` state is changed: + +```cpp +void App::draw(vk::CommandBuffer const command_buffer) const { + m_shader->bind(command_buffer, m_framebuffer_size); + // current shader has hard-coded logic for 3 vertices. + command_buffer.draw(3, 1, 0, 0); +} +``` + +![White Triangle](./white_triangle.png) + +Updating the shaders to use interpolated RGB on each vertex: + +```glsl +// shader.vert + +layout (location = 0) out vec3 out_color; + +// ... +const vec3 colors[] = { + vec3(1.0, 0.0, 0.0), + vec3(0.0, 1.0, 0.0), + vec3(0.0, 0.0, 1.0), +}; + +// ... +out_color = colors[gl_VertexIndex]; + +// shader.frag + +layout (location = 0) in vec3 in_color; + +// ... +out_color = vec4(in_color, 1.0); +``` + +> Make sure to recompile both the SPIR-V shaders in assets/. + +And a black clear color: + +```cpp +// ... +.setClearValue(vk::ClearColorValue{0.0f, 0.0f, 0.0f, 1.0f}); +``` + +Gives us the renowned Vulkan sRGB triangle: + +![sRGB Triangle](./srgb_triangle.png) + +## Modifying Dynamic State + +We can use an ImGui window to inspect / tweak some pipeline state: + +```cpp +ImGui::SetNextWindowSize({200.0f, 100.0f}, ImGuiCond_Once); +if (ImGui::Begin("Inspect")) { + if (ImGui::Checkbox("wireframe", &m_wireframe)) { + m_shader->polygon_mode = + m_wireframe ? vk::PolygonMode::eLine : vk::PolygonMode::eFill; + } + if (m_wireframe) { + auto const& line_width_range = + m_gpu.properties.limits.lineWidthRange; + ImGui::SetNextItemWidth(100.0f); + ImGui::DragFloat("line width", &m_shader->line_width, 0.25f, + line_width_range[0], line_width_range[1]); + } +} +ImGui::End(); +``` + +![sRGB Triangle (wireframe)](./srgb_triangle_wireframe.png) + diff --git a/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md b/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md new file mode 100644 index 0000000..6bdd049 --- /dev/null +++ b/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md @@ -0,0 +1,71 @@ +# GLSL to SPIR-V + +Shaders work in NDC space: -1 to +1 for X and Y. We output a triangle's coordinates in a new vertex shader and save it to `src/glsl/shader.vert`: + +```glsl +#version 450 core + +void main() { + const vec2 positions[] = { + vec2(-0.5, -0.5), + vec2(0.5, -0.5), + vec2(0.0, 0.5), + }; + + const vec2 position = positions[gl_VertexIndex]; + + gl_Position = vec4(position, 0.0, 1.0); +} +``` + +The fragment shader just outputs white for now, in `src/glsl/shader.frag`: + +```glsl +#version 450 core + +layout (location = 0) out vec4 out_color; + +void main() { + out_color = vec4(1.0); +} +``` + +Compile both shaders into `assets/`: + +``` +glslc src/glsl/shader.vert -o assets/shader.vert +glslc src/glsl/shader.frag -o assets/shader.frag +``` + +> glslc is part of the Vulkan SDK. + +## Loading SPIR-V + +SPIR-V shaders are binary files with a stride/alignment of 4 bytes. As we have seen, the Vulkan API accepts a span of `std::uint32_t`s, so we need to load it into such a buffer (and _not_ `std::vector` or other 1-byte equivalents). Add a helper function in `app.cpp`: + +```cpp +[[nodiscard]] auto to_spir_v(fs::path const& path) + -> std::vector { + // open the file at the end, to get the total size. + auto file = std::ifstream{path, std::ios::binary | std::ios::ate}; + if (!file.is_open()) { + throw std::runtime_error{ + std::format("Failed to open file: '{}'", path.generic_string())}; + } + + auto const size = file.tellg(); + auto const usize = static_cast(size); + // file data must be uint32 aligned. + if (usize % sizeof(std::uint32_t) != 0) { + throw std::runtime_error{std::format("Invalid SPIR-V size: {}", usize)}; + } + + // seek to the beginning before reading. + file.seekg({}, std::ios::beg); + auto ret = std::vector{}; + ret.resize(usize / sizeof(std::uint32_t)); + void* data = ret.data(); + file.read(static_cast(data), size); + return ret; +} +``` diff --git a/guide/translations/ko-KR/src/shader_objects/locating_assets.md b/guide/translations/ko-KR/src/shader_objects/locating_assets.md new file mode 100644 index 0000000..eba5416 --- /dev/null +++ b/guide/translations/ko-KR/src/shader_objects/locating_assets.md @@ -0,0 +1,49 @@ +# Locating Assets + +Before we can use shaders, we need to load them as asset/data files. To do that correctly, first the asset directory needs to be located. There are a few ways to go about this, we will use the approach of looking for a particular subdirectory, starting from the working directory and walking up the parent directory tree. This enables `app` in any project/build subdirectory to locate `assets/` in the various examples below: + +``` +. +|-- assets/ +|-- app +|-- build/ + |-- app +|-- out/ + |-- default/Release/ + |-- app + |-- ubsan/Debug/ + |-- app +``` + +In a release package you would want to use the path to the executable instead (and probably not perform an "upfind" walk), the working directory could be anywhere whereas assets shipped with the package will be in the vicinity of the executable. + +## Assets Directory + +Add a member to `App` to store this path to `assets/`: + +```cpp +namespace fs = std::filesystem; + +// ... +fs::path m_assets_dir{}; +``` + +Add a helper function to locate the assets dir, and assign `m_assets_dir` to its return value at the top of `run()`: + +```cpp +[[nodiscard]] auto locate_assets_dir() -> fs::path { + // look for '/assets/', starting from the working + // directory and walking up the parent directory tree. + static constexpr std::string_view dir_name_v{"assets"}; + for (auto path = fs::current_path(); + !path.empty() && path.has_parent_path(); path = path.parent_path()) { + auto ret = path / dir_name_v; + if (fs::is_directory(ret)) { return ret; } + } + std::println("[lvk] Warning: could not locate '{}' directory", dir_name_v); + return fs::current_path(); +} + +// ... +m_assets_dir = locate_assets_dir(); +``` diff --git a/guide/translations/ko-KR/src/shader_objects/pipelines.md b/guide/translations/ko-KR/src/shader_objects/pipelines.md new file mode 100644 index 0000000..a9e23b0 --- /dev/null +++ b/guide/translations/ko-KR/src/shader_objects/pipelines.md @@ -0,0 +1,254 @@ +# Graphics Pipelines + +This page describes the usage of Graphics Pipelines _instead of_ Shader Objects. While the guide assumes Shader Object usage, not much should change in the rest of the code if you instead choose to use Graphics Pipelines. A notable exception is the setup of Descriptor Set Layouts: with pipelines it needs to be specified as part of the Pipeline Layout, whereas with Shader Objects it is part of each ShaderEXT's CreateInfo. + +## Pipeline State + +Most dynamic state with Shader Objects is static with pipelines: specified at pipeline creation time. Pipelines also require additional parameters, like attachment formats and sample count: these will be considered constant and stored in the builder later. Expose a subset of dynamic states through a struct: + +```cpp +// bit flags for various binary Pipeline States. +struct PipelineFlag { + enum : std::uint8_t { + None = 0, + AlphaBlend = 1 << 0, // turn on alpha blending. + DepthTest = 1 << 1, // turn on depth write and test. + }; +}; + +// specification of a unique Graphics Pipeline. +struct PipelineState { + using Flag = PipelineFlag; + + [[nodiscard]] static constexpr auto default_flags() -> std::uint8_t { + return Flag::AlphaBlend | Flag::DepthTest; + } + + vk::ShaderModule vertex_shader; // required. + vk::ShaderModule fragment_shader; // required. + + std::span vertex_attributes{}; + std::span vertex_bindings{}; + + vk::PrimitiveTopology topology{vk::PrimitiveTopology::eTriangleList}; + vk::PolygonMode polygon_mode{vk::PolygonMode::eFill}; + vk::CullModeFlags cull_mode{vk::CullModeFlagBits::eNone}; + vk::CompareOp depth_compare{vk::CompareOp::eLess}; + std::uint8_t flags{default_flags()}; +}; +``` + +Encapsulate building pipelines into a class: + +```cpp +struct PipelineBuilderCreateInfo { + vk::Device device{}; + vk::SampleCountFlagBits samples{}; + vk::Format color_format{}; + vk::Format depth_format{}; +}; + +class PipelineBuilder { + public: + using CreateInfo = PipelineBuilderCreateInfo; + + explicit PipelineBuilder(CreateInfo const& create_info) + : m_info(create_info) {} + + [[nodiscard]] auto build(vk::PipelineLayout layout, + PipelineState const& state) const + -> vk::UniquePipeline; + + private: + CreateInfo m_info{}; +}; +``` + +The implementation is quite verbose, splitting it into multiple functions helps a bit: + +```cpp +// single viewport and scissor. +constexpr auto viewport_state_v = + vk::PipelineViewportStateCreateInfo({}, 1, {}, 1); + +// these dynamic states are guaranteed to be available. +constexpr auto dynamic_states_v = std::array{ + vk::DynamicState::eViewport, + vk::DynamicState::eScissor, + vk::DynamicState::eLineWidth, +}; + +[[nodiscard]] auto create_shader_stages(vk::ShaderModule const vertex, + vk::ShaderModule const fragment) { + // set vertex (0) and fragment (1) shader stages. + auto ret = std::array{}; + ret[0] + .setStage(vk::ShaderStageFlagBits::eVertex) + .setPName("main") + .setModule(vertex); + ret[1] + .setStage(vk::ShaderStageFlagBits::eFragment) + .setPName("main") + .setModule(fragment); + return ret; +} + +[[nodiscard]] constexpr auto +create_depth_stencil_state(std::uint8_t flags, + vk::CompareOp const depth_compare) { + auto ret = vk::PipelineDepthStencilStateCreateInfo{}; + auto const depth_test = + (flags & PipelineFlag::DepthTest) == PipelineFlag::DepthTest; + ret.setDepthTestEnable(depth_test ? vk::True : vk::False) + .setDepthCompareOp(depth_compare); + return ret; +} + +[[nodiscard]] constexpr auto +create_color_blend_attachment(std::uint8_t const flags) { + auto ret = vk::PipelineColorBlendAttachmentState{}; + auto const alpha_blend = + (flags & PipelineFlag::AlphaBlend) == PipelineFlag::AlphaBlend; + using CCF = vk::ColorComponentFlagBits; + ret.setColorWriteMask(CCF::eR | CCF::eG | CCF::eB | CCF::eA) + .setBlendEnable(alpha_blend ? vk::True : vk::False) + // standard alpha blending: + // (alpha * src) + (1 - alpha) * dst + .setSrcColorBlendFactor(vk::BlendFactor::eSrcAlpha) + .setDstColorBlendFactor(vk::BlendFactor::eOneMinusSrcAlpha) + .setColorBlendOp(vk::BlendOp::eAdd) + .setSrcAlphaBlendFactor(vk::BlendFactor::eOne) + .setDstAlphaBlendFactor(vk::BlendFactor::eZero) + .setAlphaBlendOp(vk::BlendOp::eAdd); + return ret; +} + +// ... +auto PipelineBuilder::build(vk::PipelineLayout const layout, + PipelineState const& state) const + -> vk::UniquePipeline { + auto const shader_stage_ci = + create_shader_stages(state.vertex_shader, state.fragment_shader); + + auto vertex_input_ci = vk::PipelineVertexInputStateCreateInfo{}; + vertex_input_ci.setVertexAttributeDescriptions(state.vertex_attributes) + .setVertexBindingDescriptions(state.vertex_bindings); + + auto multisample_state_ci = vk::PipelineMultisampleStateCreateInfo{}; + multisample_state_ci.setRasterizationSamples(m_info.samples) + .setSampleShadingEnable(vk::False); + + auto const input_assembly_ci = + vk::PipelineInputAssemblyStateCreateInfo{{}, state.topology}; + + auto rasterization_state_ci = vk::PipelineRasterizationStateCreateInfo{}; + rasterization_state_ci.setPolygonMode(state.polygon_mode) + .setCullMode(state.cull_mode); + + auto const depth_stencil_state_ci = + create_depth_stencil_state(state.flags, state.depth_compare); + + auto const color_blend_attachment = + create_color_blend_attachment(state.flags); + auto color_blend_state_ci = vk::PipelineColorBlendStateCreateInfo{}; + color_blend_state_ci.setAttachments(color_blend_attachment); + + auto dynamic_state_ci = vk::PipelineDynamicStateCreateInfo{}; + dynamic_state_ci.setDynamicStates(dynamic_states_v); + + // Dynamic Rendering requires passing this in the pNext chain. + auto rendering_ci = vk::PipelineRenderingCreateInfo{}; + // could be a depth-only pass, argument is span-like (notice the plural + // `Formats()`), only set if not Undefined. + if (m_info.color_format != vk::Format::eUndefined) { + rendering_ci.setColorAttachmentFormats(m_info.color_format); + } + // single depth attachment format, ok to set to Undefined. + rendering_ci.setDepthAttachmentFormat(m_info.depth_format); + + auto pipeline_ci = vk::GraphicsPipelineCreateInfo{}; + pipeline_ci.setLayout(layout) + .setStages(shader_stage_ci) + .setPVertexInputState(&vertex_input_ci) + .setPViewportState(&viewport_state_v) + .setPMultisampleState(&multisample_state_ci) + .setPInputAssemblyState(&input_assembly_ci) + .setPRasterizationState(&rasterization_state_ci) + .setPDepthStencilState(&depth_stencil_state_ci) + .setPColorBlendState(&color_blend_state_ci) + .setPDynamicState(&dynamic_state_ci) + .setPNext(&rendering_ci); + + auto ret = vk::Pipeline{}; + // use non-throwing API. + if (m_info.device.createGraphicsPipelines({}, 1, &pipeline_ci, {}, &ret) != + vk::Result::eSuccess) { + std::println(stderr, "[lvk] Failed to create Graphics Pipeline"); + return {}; + } + + return vk::UniquePipeline{ret, m_info.device}; +} +``` + +`App` will need to store a builder, a Pipeline Layout, and the Pipeline(s): + +```cpp +std::optional m_pipeline_builder{}; +vk::UniquePipelineLayout m_pipeline_layout{}; +vk::UniquePipeline m_pipeline{}; + +// ... +void create_pipeline() { + auto const vertex_spirv = to_spir_v(asset_path("shader.vert")); + auto const fragment_spirv = to_spir_v(asset_path("shader.frag")); + if (vertex_spirv.empty() || fragment_spirv.empty()) { + throw std::runtime_error{"Failed to load shaders"}; + } + + auto pipeline_layout_ci = vk::PipelineLayoutCreateInfo{}; + pipeline_layout_ci.setSetLayouts({}); + m_pipeline_layout = + m_device->createPipelineLayoutUnique(pipeline_layout_ci); + + auto const pipeline_builder_ci = PipelineBuilder::CreateInfo{ + .device = *m_device, + .samples = vk::SampleCountFlagBits::e1, + .color_format = m_swapchain->get_format(), + }; + m_pipeline_builder.emplace(pipeline_builder_ci); + + auto vertex_ci = vk::ShaderModuleCreateInfo{}; + vertex_ci.setCode(vertex_spirv); + auto fragment_ci = vk::ShaderModuleCreateInfo{}; + fragment_ci.setCode(fragment_spirv); + + auto const vertex_shader = + m_device->createShaderModuleUnique(vertex_ci); + auto const fragment_shader = + m_device->createShaderModuleUnique(fragment_ci); + auto const pipeline_state = PipelineState{ + .vertex_shader = *vertex_shader, + .fragment_shader = *fragment_shader, + }; + m_pipeline = + m_pipeline_builder->build(*m_pipeline_layout, pipeline_state); +} +``` + +Finally, `App::draw()`: + +```cpp +void draw(vk::CommandBuffer const command_buffer) const { + command_buffer.bindPipeline(vk::PipelineBindPoint::eGraphics, + *m_pipeline); + auto viewport = vk::Viewport{}; + viewport.setX(0.0f) + .setY(static_cast(m_render_target->extent.height)) + .setWidth(static_cast(m_render_target->extent.width)) + .setHeight(-viewport.y); + command_buffer.setViewport(0, viewport); + command_buffer.setScissor(0, vk::Rect2D{{}, m_render_target->extent}); + command_buffer.draw(3, 1, 0, 0); +} +``` diff --git a/guide/translations/ko-KR/src/shader_objects/shader_program.md b/guide/translations/ko-KR/src/shader_objects/shader_program.md new file mode 100644 index 0000000..fa99475 --- /dev/null +++ b/guide/translations/ko-KR/src/shader_objects/shader_program.md @@ -0,0 +1,304 @@ +# Shader Program + +To use Shader Objects we need to enable the corresponding feature and extension during device creation: + +```cpp +auto shader_object_feature = + vk::PhysicalDeviceShaderObjectFeaturesEXT{vk::True}; +dynamic_rendering_feature.setPNext(&shader_object_feature); + +// ... +// we need two device extensions: Swapchain and Shader Object. +static constexpr auto extensions_v = std::array{ + VK_KHR_SWAPCHAIN_EXTENSION_NAME, + "VK_EXT_shader_object", +}; +``` + +## Emulation Layer + +It's possible device creation now fails because the driver or physical device does not support `VK_EXT_shader_object` (especially likely with Intel). Vulkan SDK provides a layer that implements this extension: [`VK_LAYER_KHRONOS_shader_object`](https://github.com/KhronosGroup/Vulkan-ExtensionLayer/blob/main/docs/shader_object_layer.md). Adding this layer to the Instance Create Info should unblock usage of this feature: + +```cpp +// ... +// add the Shader Object emulation layer. +static constexpr auto layers_v = std::array{ + "VK_LAYER_KHRONOS_shader_object", +}; +instance_ci.setPEnabledLayerNames(layers_v); + +m_instance = vk::createInstanceUnique(instance_ci); +// ... +``` + +

+ +Since desired layers may not be available, we can set up a defensive check: + +```cpp +[[nodiscard]] auto get_layers(std::span desired) + -> std::vector { + auto ret = std::vector{}; + ret.reserve(desired.size()); + auto const available = vk::enumerateInstanceLayerProperties(); + for (char const* layer : desired) { + auto const pred = [layer = std::string_view{layer}]( + vk::LayerProperties const& properties) { + return properties.layerName == layer; + }; + if (std::ranges::find_if(available, pred) == available.end()) { + std::println("[lvk] [WARNING] Vulkan Layer '{}' not found", layer); + continue; + } + ret.push_back(layer); + } + return ret; +} + +// ... +auto const layers = get_layers(layers_v); +instance_ci.setPEnabledLayerNames(layers); +``` + +## `class ShaderProgram` + +We will encapsulate both vertex and fragment shaders into a single `ShaderProgram`, which will also bind the shaders before a draw, and expose/set various dynamic states. + +In `shader_program.hpp`, first add a `ShaderProgramCreateInfo` struct: + +```cpp +struct ShaderProgramCreateInfo { + vk::Device device; + std::span vertex_spirv; + std::span fragment_spirv; + std::span set_layouts; +}; +``` + +> Descriptor Sets and their Layouts will be covered later. + +Start with a skeleton definition: + +```cpp +class ShaderProgram { + public: + using CreateInfo = ShaderProgramCreateInfo; + + explicit ShaderProgram(CreateInfo const& create_info); + + private: + std::vector m_shaders{}; + + ScopedWaiter m_waiter{}; +}; +``` + +The definition of the constructor is fairly straightforward: + +```cpp +ShaderProgram::ShaderProgram(CreateInfo const& create_info) { + auto const create_shader_ci = + [&create_info](std::span spirv) { + auto ret = vk::ShaderCreateInfoEXT{}; + ret.setCodeSize(spirv.size_bytes()) + .setPCode(spirv.data()) + // set common parameters. + .setSetLayouts(create_info.set_layouts) + .setCodeType(vk::ShaderCodeTypeEXT::eSpirv) + .setPName("main"); + return ret; + }; + + auto shader_cis = std::array{ + create_shader_ci(create_info.vertex_spirv), + create_shader_ci(create_info.fragment_spirv), + }; + shader_cis[0] + .setStage(vk::ShaderStageFlagBits::eVertex) + .setNextStage(vk::ShaderStageFlagBits::eFragment); + shader_cis[1].setStage(vk::ShaderStageFlagBits::eFragment); + + auto result = create_info.device.createShadersEXTUnique(shader_cis); + if (result.result != vk::Result::eSuccess) { + throw std::runtime_error{"Failed to create Shader Objects"}; + } + m_shaders = std::move(result.value); + m_waiter = create_info.device; +} +``` + +Expose some dynamic states via public members: + +```cpp +static constexpr auto color_blend_equation_v = [] { + auto ret = vk::ColorBlendEquationEXT{}; + ret.setColorBlendOp(vk::BlendOp::eAdd) + // standard alpha blending: + // (alpha * src) + (1 - alpha) * dst + .setSrcColorBlendFactor(vk::BlendFactor::eSrcAlpha) + .setDstColorBlendFactor(vk::BlendFactor::eOneMinusSrcAlpha); + return ret; +}(); + +// ... +vk::PrimitiveTopology topology{vk::PrimitiveTopology::eTriangleList}; +vk::PolygonMode polygon_mode{vk::PolygonMode::eFill}; +float line_width{1.0f}; +vk::ColorBlendEquationEXT color_blend_equation{color_blend_equation_v}; +vk::CompareOp depth_compare_op{vk::CompareOp::eLessOrEqual}; +``` + +Encapsulate booleans into bit flags: + +```cpp +// bit flags for various binary states. +enum : std::uint8_t { + None = 0, + AlphaBlend = 1 << 0, // turn on alpha blending. + DepthTest = 1 << 1, // turn on depth write and test. +}; + +// ... +static constexpr auto flags_v = AlphaBlend | DepthTest; + +// ... +std::uint8_t flags{flags_v}; +``` + +There is one more piece of pipeline state needed: vertex input. We will consider this to be constant per shader and store it in the constructor: + +```cpp +// shader_program.hpp + +// vertex attributes and bindings. +struct ShaderVertexInput { + std::span attributes{}; + std::span bindings{}; +}; + +struct ShaderProgramCreateInfo { + // ... + ShaderVertexInput vertex_input{}; + // ... +}; + +class ShaderProgram { + // ... + ShaderVertexInput m_vertex_input{}; + std::vector m_shaders{}; + // ... +}; + +// shader_program.cpp +ShaderProgram::ShaderProgram(CreateInfo const& create_info) + : m_vertex_input(create_info.vertex_input) { + // ... +} +``` + +The API to bind will take the command buffer and the framebuffer size (to set the viewport and scissor): + +```cpp +void bind(vk::CommandBuffer command_buffer, + glm::ivec2 framebuffer_size) const; +``` + +Add helper member functions and implement `bind()` by calling them in succession: + +```cpp +static void set_viewport_scissor(vk::CommandBuffer command_buffer, + glm::ivec2 framebuffer); +static void set_static_states(vk::CommandBuffer command_buffer); +void set_common_states(vk::CommandBuffer command_buffer) const; +void set_vertex_states(vk::CommandBuffer command_buffer) const; +void set_fragment_states(vk::CommandBuffer command_buffer) const; +void bind_shaders(vk::CommandBuffer command_buffer) const; + +// ... +void ShaderProgram::bind(vk::CommandBuffer const command_buffer, + glm::ivec2 const framebuffer_size) const { + set_viewport_scissor(command_buffer, framebuffer_size); + set_static_states(command_buffer); + set_common_states(command_buffer); + set_vertex_states(command_buffer); + set_fragment_states(command_buffer); + bind_shaders(command_buffer); +} +``` + +Implementations are long but straightforward: + +```cpp +namespace { +constexpr auto to_vkbool(bool const value) { + return value ? vk::True : vk::False; +} +} // namespace + +// ... +void ShaderProgram::set_viewport_scissor(vk::CommandBuffer const command_buffer, + glm::ivec2 const framebuffer_size) { + auto const fsize = glm::vec2{framebuffer_size}; + auto viewport = vk::Viewport{}; + // flip the viewport about the X-axis (negative height): + // https://www.saschawillems.de/blog/2019/03/29/flipping-the-vulkan-viewport/ + viewport.setX(0.0f).setY(fsize.y).setWidth(fsize.x).setHeight(-fsize.y); + command_buffer.setViewportWithCount(viewport); + + auto const usize = glm::uvec2{framebuffer_size}; + auto const scissor = + vk::Rect2D{vk::Offset2D{}, vk::Extent2D{usize.x, usize.y}}; + command_buffer.setScissorWithCount(scissor); +} + +void ShaderProgram::set_static_states(vk::CommandBuffer const command_buffer) { + command_buffer.setRasterizerDiscardEnable(vk::False); + command_buffer.setRasterizationSamplesEXT(vk::SampleCountFlagBits::e1); + command_buffer.setSampleMaskEXT(vk::SampleCountFlagBits::e1, 0xff); + command_buffer.setAlphaToCoverageEnableEXT(vk::False); + command_buffer.setCullMode(vk::CullModeFlagBits::eNone); + command_buffer.setFrontFace(vk::FrontFace::eCounterClockwise); + command_buffer.setDepthBiasEnable(vk::False); + command_buffer.setStencilTestEnable(vk::False); + command_buffer.setPrimitiveRestartEnable(vk::False); + command_buffer.setColorWriteMaskEXT(0, ~vk::ColorComponentFlags{}); +} + +void ShaderProgram::set_common_states( + vk::CommandBuffer const command_buffer) const { + auto const depth_test = to_vkbool((flags & DepthTest) == DepthTest); + command_buffer.setDepthWriteEnable(depth_test); + command_buffer.setDepthTestEnable(depth_test); + command_buffer.setDepthCompareOp(depth_compare_op); + command_buffer.setPolygonModeEXT(polygon_mode); + command_buffer.setLineWidth(line_width); +} + +void ShaderProgram::set_vertex_states( + vk::CommandBuffer const command_buffer) const { + command_buffer.setVertexInputEXT(m_vertex_input.bindings, + m_vertex_input.attributes); + command_buffer.setPrimitiveTopology(topology); +} + +void ShaderProgram::set_fragment_states( + vk::CommandBuffer const command_buffer) const { + auto const alpha_blend = to_vkbool((flags & AlphaBlend) == AlphaBlend); + command_buffer.setColorBlendEnableEXT(0, alpha_blend); + command_buffer.setColorBlendEquationEXT(0, color_blend_equation); +} + +void ShaderProgram::bind_shaders(vk::CommandBuffer const command_buffer) const { + static constexpr auto stages_v = std::array{ + vk::ShaderStageFlagBits::eVertex, + vk::ShaderStageFlagBits::eFragment, + }; + auto const shaders = std::array{ + *m_shaders[0], + *m_shaders[1], + }; + command_buffer.bindShadersEXT(stages_v, shaders); +} +``` diff --git a/guide/translations/ko-KR/src/shader_objects/srgb_triangle.png b/guide/translations/ko-KR/src/shader_objects/srgb_triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..a160a616a082361d1436e0ee8ed3870c8b5c035c GIT binary patch literal 84213 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⋘zCv$mqyah3mE0n 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

x4Yz&1iGz3fCU(!^KQ_ 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 literal 0 HcmV?d00001 From 26bad619c458ac1e2167884ed67c579a7a9d2dde Mon Sep 17 00:00:00 2001 From: CDDing Date: Thu, 17 Apr 2025 18:14:42 +0900 Subject: [PATCH 2/9] ko-translate initialization.md --- guide/translations/ko-KR/src/SUMMARY.md | 6 ++-- .../ko-KR/src/initialization/README.md | 18 +++++----- .../ko-KR/src/initialization/device.md | 14 ++++---- .../ko-KR/src/initialization/glfw_window.md | 17 +++++----- .../ko-KR/src/initialization/gpu.md | 18 +++++----- .../ko-KR/src/initialization/instance.md | 33 ++++++++++--------- .../ko-KR/src/initialization/scoped_waiter.md | 14 ++++---- .../ko-KR/src/initialization/surface.md | 6 ++-- .../ko-KR/src/initialization/swapchain.md | 31 ++++++++--------- 9 files changed, 79 insertions(+), 78 deletions(-) diff --git a/guide/translations/ko-KR/src/SUMMARY.md b/guide/translations/ko-KR/src/SUMMARY.md index fbc6ee8..e8a2291 100644 --- a/guide/translations/ko-KR/src/SUMMARY.md +++ b/guide/translations/ko-KR/src/SUMMARY.md @@ -1,8 +1,8 @@ # Summary -[Introduction](README.md) +[소개](README.md) -# Basics +# 기초 - [Getting Started](getting_started/README.md) - [Project Layout](getting_started/project_layout.md) @@ -34,7 +34,7 @@ - [Drawing a Triangle](shader_objects/drawing_triangle.md) - [Graphics Pipelines](shader_objects/pipelines.md) -# Shader Resources +# 셰이더 자원 - [Memory Allocation](memory/README.md) - [Vulkan Memory Allocator](memory/vma.md) diff --git a/guide/translations/ko-KR/src/initialization/README.md b/guide/translations/ko-KR/src/initialization/README.md index 79597c5..839ee01 100644 --- a/guide/translations/ko-KR/src/initialization/README.md +++ b/guide/translations/ko-KR/src/initialization/README.md @@ -1,12 +1,12 @@ -# Initialization +# 초기화 -This section deals with initialization of all the systems needed, including: +여기서는 다음을 포함하여, 애플리케이션 실행에 필요한 모든 시스템의 초기화 과정을 다룹니다. -- Initializing GLFW and creating a Window -- Creating a Vulkan Instance -- Creating a Vulkan Surface -- Selecting a Vulkan Physical Device -- Creating a Vulkan logical Device -- Creating a Vulkan Swapchain +- GLFW를 초기화하고 창 생성하기 +- Vulkan Instance 생성하기 +- Vulkan Surface 생성하기 +- Vulkan Physical Device 선택하기 +- Vulkan logical Device 생성하기 +- Vulkan Swapchain 생성하기 -If any step here fails, it is a fatal error as we can't do anything meaningful beyond that point. +여기서 어느 한 단계라도 실패하면, 그 이후에는 의미 있는 작업을 진행할 수 없기 때문에 치명적인 오류로 간주됩니다. diff --git a/guide/translations/ko-KR/src/initialization/device.md b/guide/translations/ko-KR/src/initialization/device.md index 5cb2530..415604d 100644 --- a/guide/translations/ko-KR/src/initialization/device.md +++ b/guide/translations/ko-KR/src/initialization/device.md @@ -1,8 +1,8 @@ # Vulkan Device -A [Vulkan Device](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-devices) is a logical instance of a Physical Device, and will the primary interface for everything Vulkan now onwards. [Vulkan Queues](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-queues) are owned by the Device, we will need one from the queue family stored in the `Gpu` to submit recorded command buffers. We also need to explicitly declare all features we want to use, eg [Dynamic Rendering](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_dynamic_rendering.html) and [Synchronization2](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_synchronization2.html). +[Device](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-devices)는 Physical Device의 논리적 인스턴스이며, 이후의 모든 Vulkan 작업에서 주요 인터페이스 역할을 하게 됩니다. [Queue](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-queues)는 Device가 소유하는 것으로, `Gpu` 구조체에 저장된 큐 패밀리에서 하나를 가져와 기록된 커맨드 버퍼를 제출하는 데 사용할 것입니다. 또한 사용하기를 원하는 [Dynamic Rendering](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_dynamic_rendering.html) 과 [Synchronization2](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_synchronization2.html)같은 기능들을 명시적으로 선언해야 합니다. -Setup a `vk::QueueCreateInfo` object: +`vk::QueueCreateInfo`객체를 설정합시다. ```cpp auto queue_ci = vk::DeviceQueueCreateInfo{}; @@ -13,7 +13,7 @@ queue_ci.setQueueFamilyIndex(m_gpu.queue_family) .setQueuePriorities(queue_priorities_v); ``` -Setup the core device features: +핵심 디바이스 기능을 설정합니다. ```cpp // nice-to-have optional core features, enable if GPU supports them. @@ -24,7 +24,7 @@ enabled_features.samplerAnisotropy = m_gpu.features.samplerAnisotropy; enabled_features.sampleRateShading = m_gpu.features.sampleRateShading; ``` -Setup the additional features, using `setPNext()` to chain them: +추가 기능을 설정하기 위해 `setPNext()`를 사용해 묶습니다. ```cpp // extra features that need to be explicitly enabled. @@ -37,7 +37,7 @@ auto dynamic_rendering_feature = sync_feature.setPNext(&dynamic_rendering_feature); ``` -Setup a `vk::DeviceCreateInfo` object: +`vk::DeviceCreateInfo` 구조체를 설정합니다. ```cpp auto device_ci = vk::DeviceCreateInfo{}; @@ -50,7 +50,7 @@ device_ci.setPEnabledExtensionNames(extensions_v) .setPNext(&sync_feature); ``` -Declare a `vk::UniqueDevice` member after `m_gpu`, create it, and initialize the dispatcher against it: +`vk::UniqueDevice` 멤버를 `m_gpu` 이후에 선언하고, 이를 생성한 다음 디스패쳐를 해당 디바이스로 다시 초기화합니다. ```cpp m_device = m_gpu.device.createDeviceUnique(device_ci); @@ -58,7 +58,7 @@ m_device = m_gpu.device.createDeviceUnique(device_ci); VULKAN_HPP_DEFAULT_DISPATCHER.init(*m_device); ``` -Declare a `vk::Queue` member (order doesn't matter since it's just a handle, the actual Queue is owned by the Device) and initialize it: +`vk::Queue` 멤버도 선언하고 초기화합니다(순서는 중요하지 않습니다. 이는 단순한 핸들이며 실제 큐는 디바이스가 관리하기 때문입니다). ```cpp static constexpr std::uint32_t queue_index_v{0}; diff --git a/guide/translations/ko-KR/src/initialization/glfw_window.md b/guide/translations/ko-KR/src/initialization/glfw_window.md index a99b841..5dc7261 100644 --- a/guide/translations/ko-KR/src/initialization/glfw_window.md +++ b/guide/translations/ko-KR/src/initialization/glfw_window.md @@ -1,8 +1,8 @@ # GLFW Window -We will use GLFW (3.4) for windowing and related events. The library - like all external dependencies - is configured and added to the build tree in `ext/CMakeLists.txt`. `GLFW_INCLUDE_VULKAN` is defined for all consumers, to enable GLFW's Vulkan related functions (known as **Window System Integration (WSI)**). GLFW 3.4 supports Wayland on Linux, and by default it builds backends for both X11 and Wayland. For this reason it will need the development packages for [both platforms](https://www.glfw.org/docs/latest/compile_guide.html#compile_deps_wayland) (and some other Wayland/CMake dependencies) to configure/build successfully. A particular backend can be requested at runtime if desired via `GLFW_PLATFORM`. +창 생성과 이벤트 처리를 위해 GLFW 3.4를 사용할 것입니다. 모든 외부 의존 라이브러리들은 `ext/CMakeLists.txt`에 구성되어 빌드 트리에 추가됩니다. `GLFW_INCLUDE_VULKAN`은 GLFW의 Vulkan 관련 기능(WSI, Window System Integration)을 활성화하기 위해 GLFW를 사용하는 측에서 정의되어야 합니다. GLFW 3.4는 Linux에서 Wayland를 지원하며, 기본적으로 X11과 Wayland 모두를 위한 백엔드를 빌드합니다. 따라서 빌드를 성공적으로 진행하려면 두 플랫폼 모두에 필요한 패키지와 일부 Wayland 및 CMake 의존성이 필요합니다. 특정 백엔드를 사용하고자 할 경우, 런타임에서 `GLFW_PLATFORM`을 통해 지정할 수 있습니다. -Although it is quite feasible to have multiple windows in a Vulkan-GLFW application, that is out of scope for this guide. For our purposes GLFW (the library) and a single window are a monolithic unit - initialized and destroyed together. This can be encapsulated in a `std::unique_ptr` with a custom deleter, especially since GLFW returns an opaque pointer (`GLFWwindow*`). +Vulkan-GLFW 애플리케이션에서 다중 창을 사용할 수는 있지만, 이 가이드에서는 다루지 않습니다. 여기서는 GLFW 라이브러리와 단일 창을 하나의 단위로 보고 함께 초기화하고 해제하는 방식으로 구성합니다. GLFW는 구조를 알 수 없는(Opaque) 포인터 `GLFWwindow*`를 반환하므로, 이를 `std::unique_ptr`과 커스텀 파괴자를 사용해 캡슐화하는 것이 적절합니다. ```cpp // window.hpp @@ -24,7 +24,7 @@ void Deleter::operator()(GLFWwindow* window) const noexcept { } ``` -GLFW can create fullscreen and borderless windows, but we will stick to a standard window with decorations. Since we cannot do anything useful if we are unable to create a window, all other branches throw a fatal exception (caught in main). +GLFW는 전체 화면이나 테두리 없는 창을 만들 수 있지만, 이 가이드에서는 일반 창을 사용합니다. 창을 생성하지 못하면 이후 작업이 불가능하기 때문에, 실패한 경우에는 모두 치명적인 예외를 발생시키도록 되어 있습니다. ```cpp auto glfw::create_window(glm::ivec2 const size, char const* title) -> Window { @@ -48,16 +48,16 @@ auto glfw::create_window(glm::ivec2 const size, char const* title) -> Window { } ``` -`App` can now store a `glfw::Window` and keep polling it in `run()` until it gets closed by the user. We will not be able to draw anything to the window for a while, but this is the first step in that journey. +`App`은 이제 `glfw::Window`를 멤버로 저장해 사용자가 창을 닫을 때 까지 `run()`에서 이를 사용할 수 있습니다. 아직은 창에 아무것도 그릴 수 없지만, 이는 앞으로의 과정을 시작하는 첫 단계입니다. -Declare it as a private member: +이를 private 멤버로 선언합니다. ```cpp private: glfw::Window m_window{}; ``` -Add some private member functions to encapsulate each operation: +각 작업을 캡슐화하는 몇 가지 private 멤버 함수를 추가합니다. ```cpp void create_window(); @@ -65,7 +65,7 @@ void create_window(); void main_loop(); ``` -Implement them and call them in `run()`: +이를 구현하고 `run()`에서 호출합니다. ```cpp void App::run() { @@ -85,5 +85,4 @@ void App::main_loop() { } ``` -> On Wayland you will not even see a window yet: it is only shown _after_ the application presents a framebuffer to it. - +> Wayland에서는 아직 창이 보이지 않을 수 있습니다. 창은 애플리케이션이 프레임버퍼를 렌더링한 후에야 화면에 표시됩니다. diff --git a/guide/translations/ko-KR/src/initialization/gpu.md b/guide/translations/ko-KR/src/initialization/gpu.md index e3a5ac6..5291a39 100644 --- a/guide/translations/ko-KR/src/initialization/gpu.md +++ b/guide/translations/ko-KR/src/initialization/gpu.md @@ -1,14 +1,14 @@ # Vulkan Physical Device -A [Physical Device](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-physical-device-enumeration) represents a single complete implementation of Vulkan, for our intents and purposes a single GPU. (It could also be eg a software renderer like Mesa/lavapipe.) Some machines may have multiple Physical Devices available, like laptops with dual-GPUs. We need to select the one we want to use, given our constraints: +[Physical Device](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-physical-device-enumeration)는 Vulkan의 완전한 구현체를 나타내며, 일반적으로 하나의 GPU를 의미합니다(단, Mesa/lavapipe와 같은 소프트웨어 렌더러일 수도 있습니다). 여러 GPU가 장착된 랩탑과 같은 일부 기기에서는 여러 개의 Physical Device가 존재할 수 있습니다. 이 중에서 다음 조건을 만족하는 것을 하나 선택해야 합니다. -1. Vulkan 1.3 must be supported -1. Vulkan Swapchains must be supported -1. A Vulkan Queue that supports Graphics and Transfer operations must be available -1. It must be able to present to the previously created Vulkan Surface -1. (Optional) Prefer discrete GPUs +1. Vulkan 1.3을 지원해야 합니다. +2. Vulkan Swapchain을 지원해야 합니다. +3. Graphics와 Transfer작업을 지원하는 Vulkan Queue가 존재해야 합니다. +4. 이전에 생성한 Vulkan Surface로 출력(present)할 수 있어야 합니다. +5. (선택 사항) 외장 GPU를 우선적으로 고려합니다. -We wrap the actual Physical Device and a few other useful objects into `struct Gpu`. Since it will be accompanied by a hefty utility function, we put it in its own hpp/cpp files, and move the `vk_version_v` constant to this new header: +실제 Physical Device와 몇 가지 유용한 객체들을 `struct Gpu`로 묶겠습니다. 많은 유틸리티 함수가 함께 정의될 것이므로 이를 별도의 hpp, cpp파일에 구현하고 기존의 `vk_version_v` 상수를 이 새로운 헤더로 옮기겠습니다. ```cpp constexpr auto vk_version_v = VK_MAKE_VERSION(1, 3, 0); @@ -24,7 +24,7 @@ struct Gpu { vk::SurfaceKHR surface) -> Gpu; ``` -The implementation: +아래는 구현부입니다. ```cpp auto lvk::get_suitable_gpu(vk::Instance const instance, @@ -79,7 +79,7 @@ auto lvk::get_suitable_gpu(vk::Instance const instance, } ``` -Finally, add a `Gpu` member in `App` and initialize it after `create_surface()`: +마지막으로 `Gpu` 멤버를 `App`에 추가하고 `create_surface()`이후에 초기화합니다. ```cpp create_surface(); diff --git a/guide/translations/ko-KR/src/initialization/instance.md b/guide/translations/ko-KR/src/initialization/instance.md index da6cef2..9331fc9 100644 --- a/guide/translations/ko-KR/src/initialization/instance.md +++ b/guide/translations/ko-KR/src/initialization/instance.md @@ -1,14 +1,15 @@ # Vulkan Instance -Instead of linking to Vulkan (via the SDK) at build-time, we will load Vulkan at runtime. This requires a few adjustments: +Vulkan을 SDK를 통해 빌드 시점에 링킹하는 대신, 런타임에 동적으로 로드할 것입니다. 이를 위해 몇 가지 조정이 필요합니다. -1. In the CMake ext target `VK_NO_PROTOTYPES` is defined, which turns API function declarations into function pointers -1. In `app.cpp` this line is added to the global scope: `VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE` -1. Before and during initialization `VULKAN_HPP_DEFAULT_DISPATCHER.init()` is called +1. CMake의 ext target에서 `VK_NO_PROTOTYPES`를 정의해, Vulkan API 함수 선언이 함수 포인터로 변환되도록 합니다. +2. `app.cpp`에서 전역에 `VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE`를 추가합니다. +3. 초기화 이전과 초기화 과정 중에 `VULKAN_HPP_DEFAULT_DISPATCHER.init()`을 호출합니다. -The first thing to do in Vulkan is to create an [Instance](https://docs.vulkan.org/spec/latest/chapters/initialization.html#initialization-instances), which will enable enumeration of physical devices (GPUs) and creation of a logical device. +Vulkan에서 가장 먼저 해야할 것은 [Instance](https://docs.vulkan.org/spec/latest/chapters/initialization.html#initialization-instances)를 생성하는 것입니다. 이는 물리 디바이스(GPU)의 목록을 가져오거나, 논리 디바이스를 생성할 수 있습니다. +Instance -Since we require Vulkan 1.3, store that in a constant to be easily referenced: +Vulkan 1.3 버전을 필요로 하므로, 이를 상수로 정의해 쉽게 참조할 수 있도록 합니다. ```cpp namespace { @@ -16,7 +17,7 @@ constexpr auto vk_version_v = VK_MAKE_VERSION(1, 3, 0); } // namespace ``` -In `App`, create a new member function `create_instance()` and call it after `create_window()` in `run()`. After initializing the dispatcher, check that the loader meets the version requirement: +`App`클래스에 새로운 멤버 함수 `create_instance()`를 추가하고, `run()`함수 내에서 `create_window()`호출 직후에 이를 호출하세요. 디스패쳐를 초기화한 후에는, 로더가 요구하는 Vulkan 버전을 충족하는지 확인합니다. ```cpp void App::create_instance() { @@ -29,7 +30,7 @@ void App::create_instance() { } ``` -We will need the WSI instance extensions, which GLFW conveniently provides for us. Add a helper function in `window.hpp/cpp`: +WSI 관련 인스턴스 확장이 필요하며, 이는 GLFW가 제공해줍니다. 관련 확장을 받아오는 함수를 `window.hpp/cpp`에 추가합니다. ```cpp auto glfw::instance_extensions() -> std::span { @@ -39,14 +40,14 @@ auto glfw::instance_extensions() -> std::span { } ``` -Continuing with instance creation, create a `vk::ApplicationInfo` object and fill it up: +인스턴스 생성에 이어서, `vk::ApplicationInfo`객체를 생성하고 필요한 정보를 채워 넣습니다. ```cpp auto app_info = vk::ApplicationInfo{}; app_info.setPApplicationName("Learn Vulkan").setApiVersion(vk_version_v); ``` -Create a `vk::InstanceCreateInfo` object and fill it up: +`vk::InstanceCreateInfo` 구조체를 생성하고 초기화합니다. ```cpp auto instance_ci = vk::InstanceCreateInfo{}; @@ -56,7 +57,7 @@ instance_ci.setPApplicationInfo(&app_info).setPEnabledExtensionNames( extensions); ``` -Add a `vk::UniqueInstance` member _after_ `m_window`: this must be destroyed before terminating GLFW. Create it, and initialize the dispatcher against it: +`m_window`멤버 다음에 `vk::UniqueInstance` 멤버를 추가하세요. 이는 GLFW 종료 전에 반드시 파괴되어야 하므로 순서를 지키는 것이 중요합니다. 인스턴스를 생성한 뒤, 해당 인스턴스를 기반으로 디스패쳐를 다시 초기화합니다. ```cpp glfw::Window m_window{}; @@ -68,20 +69,20 @@ m_instance = vk::createInstanceUnique(instance_ci); VULKAN_HPP_DEFAULT_DISPATCHER.init(*m_instance); ``` -Make sure VkConfig is running with validation layers enabled, and debug/run the app. If "Information" level loader messages are enabled, you should see quite a bit of console output at this point: information about layers being loaded, physical devices and their ICDs being enumerated, etc. +VkConfig가 검증 레이어가 활성화된 상태인지 확인한 후, 애플리케이션을 디버그 혹은 실행하세요. 만약 로더 메시지의 "Information" 레벨 로그가 활성화되어 있다면, 이 시점에서 로드된 레이어 정보, 물리 디바이스 및 해당 ICD의 열거 등 다양한 콘솔 출력이 보일 것입니다. -If this line or equivalent is not visible in the logs, re-check your Vulkan Configurator setup and `PATH`: +해당 메시지 또는 유사한 로그가 보이지 않는다면, Vulkan Configurator 설정과 환경변수 `PATH`를 다시 확인해보세요. ``` INFO | LAYER: Insert instance layer "VK_LAYER_KHRONOS_validation" ``` -For instance, if `libVkLayer_khronos_validation.so` / `VkLayer_khronos_validation.dll` is not visible to the app / loader, you'll see a line similar to: +예를 들어, `libVkLayer_khronos_validation.so` / `VkLayer_khronos_validation.dll`이 애플리케이션 / 로더에 보이지 않는다면 다음과 같은 메시지가 출력될 수 있습니다 ``` INFO | LAYER: Requested layer "VK_LAYER_KHRONOS_validation" failed to load. ``` -Congratulations, you have successfully initialized a Vulkan Instance! +축하합니다! 성공적으로 Vulkan Instance를 초기화하였습니다. -> Wayland users: seeing the window is still a long way off, these VkConfig/validation logs are your only feedback for now. +> Wayland 사용자의 경우 아직 창이 보이지 않을 것이기 때문에 현재로서는 VkConfig/Validation 유일한 확인 수단입니다. \ No newline at end of file diff --git a/guide/translations/ko-KR/src/initialization/scoped_waiter.md b/guide/translations/ko-KR/src/initialization/scoped_waiter.md index 7982c83..9548a17 100644 --- a/guide/translations/ko-KR/src/initialization/scoped_waiter.md +++ b/guide/translations/ko-KR/src/initialization/scoped_waiter.md @@ -1,11 +1,11 @@ # Scoped Waiter -A useful abstraction to have is an object that in its destructor waits/blocks until the Device is idle. It is incorrect usage to destroy Vulkan objects while they are in use by the GPU, such an object helps with making sure the device is idle before some dependent resource gets destroyed. +소멸자에서 디바이스가 Idle한 상태가 될 때까지 기다리거나 블록하는 객체는 매우 유용한 추상화입니다. GPU가 Vulkan 객체를 사용 중일 때 해당 객체를 파괴하는 것은 잘못된 사용입니다. 이 객체는 의존성이 있는 자원이 파괴되기 전에 디바이스가 idle 상태임을 보장하는 데 도움이 됩니다. -Being able to do arbitary things on scope exit will be useful in other spots too, so we encapsulate that in a basic class template `Scoped`. It's somewhat like a `unique_ptr` that stores the value (`Type`) instead of a pointer (`Type*`), with some constraints: +스코프가 끝날 때 임의의 작업을 수행할 수 있는 기능은 다른 곳에서도 유용할 수 있기 때문에, 이를 기본 템플릿 클래스 `Scoped`로 캡슐화합니다. 이 클래스는 포인터 타입 `Type*` 대신에 값 `Type`을 담는 `unique_ptr`와 유사하지만, 다음과 같은 제약이 있습니다. -1. `Type` must be default constructible -1. Assumes a default constructed `Type` is equivalent to null (does not call `Deleter`) +1. `Type`은 기본 생성자가 있어야 합니다. +2. 기본 생성자를 통한 `Type`은 null과 동일하다고 가정하며, 이 경우 `Deleter`를 호출하지 않습니다. ```cpp template @@ -43,9 +43,9 @@ class Scoped { }; ``` -Don't worry if this doesn't make a lot of sense: the implementation isn't important, what it does and how to use it is what matters. +이 내용이 이해가 되지 않더라도 걱정하지 마세요. 구현 자체는 중요하지 않고, 이 객체가 무엇을 하는지, 그리고 어떻게 사용하는지가 중요합니다. -A `ScopedWaiter` can now be implemented quite easily: +`ScopeWaiter`는 이제 비교적 간단하게 구현할 수 있습니다. ```cpp struct ScopedWaiterDeleter { @@ -57,7 +57,7 @@ struct ScopedWaiterDeleter { using ScopedWaiter = Scoped; ``` -Add a `ScopedWaiter` member to `App` _at the end_ of its member list: this must remain at the end to be the first member that gets destroyed, thus guaranteeing the device will be idle before the destruction of any other members begins. Initialize it after creating the Device: +`ScopeWaiter` 멤버를 `App`의 멤버 리스트 맨 마지막에 추가하세요. 이는 반드시 마지막에 선언되어야 하며, 그렇게 해야 이 멤버가 가장 먼저 파괴되기 때문에 다른 멤버들이 파괴되기 전에 idle 상태가 되는 것을 보장할 수 있습니다. 이를 디바이스 생성 후에 초기화합니다. ```cpp m_waiter = *m_device; diff --git a/guide/translations/ko-KR/src/initialization/surface.md b/guide/translations/ko-KR/src/initialization/surface.md index 629c55c..cde3f23 100644 --- a/guide/translations/ko-KR/src/initialization/surface.md +++ b/guide/translations/ko-KR/src/initialization/surface.md @@ -1,8 +1,8 @@ # Vulkan Surface -Being platform agnostic, Vulkan interfaces with the WSI via the [`VK_KHR_surface` extension](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_surface.html). A [Surface](https://docs.vulkan.org/guide/latest/wsi.html#_surface) enables displaying images on the window through the presentation engine. +Vulkan은 플랫폼과 독립적으로 작동하기 위해 [`VK_KHR_surface` 확장](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_surface.html)을 통해 WSI와 상호작용합니다. [Surface](https://docs.vulkan.org/guide/latest/wsi.html#_surface)는 프레젠테이션 엔진을 통해 창에 이미지를 표시할 수 있게 해줍니다. -Add another helper function in `window.hpp/cpp`: +`window.hpp/cpp`에 또 다른 함수를 추가합시다. ```cpp auto glfw::create_surface(GLFWwindow* window, vk::Instance const instance) @@ -17,7 +17,7 @@ auto glfw::create_surface(GLFWwindow* window, vk::Instance const instance) } ``` -Add a `vk::UniqueSurfaceKHR` member to `App` after `m_instance`, and create the surface: +`App`에 `vk::UniqueSurfaceKHR`이라는 멤버를 `m_instance` 이후에 추가하고 Surface를 생성합니다. ```cpp void App::create_surface() { diff --git a/guide/translations/ko-KR/src/initialization/swapchain.md b/guide/translations/ko-KR/src/initialization/swapchain.md index 9fdeccc..eb41780 100644 --- a/guide/translations/ko-KR/src/initialization/swapchain.md +++ b/guide/translations/ko-KR/src/initialization/swapchain.md @@ -1,8 +1,8 @@ # Swapchain -A [Vulkan Swapchain](https://docs.vulkan.org/guide/latest/wsi.html#_swapchain) is an array of presentable images associated with a Surface, which acts as a bridge between the application and the platform's presentation engine (compositor / display engine). The Swapchain will be continually used in the main loop to acquire and present images. Since failing to create a Swapchain is a fatal error, its creation is part of the initialization section. +[Swapchain](https://docs.vulkan.org/guide/latest/wsi.html#_swapchain)은 Surface와 연결된, 화면에 표시 가능한 이미지들의 배열입니다. 이는 애플리케이션과 플랫폼의 프레젠테이션 엔진 사이를 이어주는 다리 역할을 합니다. 스왑체인은 메인 루프에서 이미지를 받아오고 화면에 표시하기 위해 지속적으로 사용됩니다. 스왑체인 생성에 실패하는 것은 치명적인 오류이므로, 그 생성 과정은 초기화 단계에 포함됩니다. -We shall wrap the Vulkan Swapchain into our own `class Swapchain`. It will also store the a copy of the Images owned by the Vulkan Swapchain, and create (and own) Image Views for each Image. The Vulkan Swapchain may need to be recreated in the main loop, eg when the framebuffer size changes, or an acquire/present operation returns `vk::ErrorOutOfDateKHR`. This will be encapsulated in a `recreate()` function which can simply be called during initialization as well. +스왑체인을 우리가 정의한 `class Swapchain`으로 감쌀 것입니다. 이 클래스는 스왑체인이 소유한 이미지의 복사본을 저장하고, 각 이미지에 맞는 이미지 뷰를 생성하고 소유합니다. 스왑체인은 프레임 버퍼 크기가 변경되거나, acquire/present 작업이 `vk::ErrorOutOfDataKHR`를 반환하는 경우처럼, 메인 루프 중에 재생성이 필요할 수 있습니다. 이를 `recreate()` 함수로 캡슐화하여 초기화 시점에도 간단히 호출할 수 있도록 하겠습니다. ```cpp // swapchain.hpp @@ -36,9 +36,9 @@ Swapchain::Swapchain(vk::Device const device, Gpu const& gpu, : m_device(device), m_gpu(gpu) {} ``` -## Static Swapchain Properties +## 정적 스왑체인 속성 -Some Swapchain creation parameters like the image extent (size) and count depend on the surface capabilities, which can change during runtime. We can setup the rest in the constructor, for which we need a helper function to obtain a desired [Surface Format](https://registry.khronos.org/vulkan/specs/latest/man/html/VkSurfaceFormatKHR.html): +이미지 크기나 개수와 같은 몇몇 스왑체인 생성 파라미터는 surface capabilities에 따라 결정되며, 이는 런타임 중 변경될 수 있습니다. 나머지 설정은 생성자에서 처리할 수 있으며, 이때 필요한 [Surface Format](https://registry.khronos.org/vulkan/specs/latest/man/html/VkSurfaceFormatKHR.html)을 얻기 위한 함수가 필요합니다. ```cpp constexpr auto srgb_formats_v = std::array{ @@ -64,9 +64,9 @@ get_surface_format(std::span supported) } ``` -An sRGB format is preferred because that is what the screen's color space is in. This is indicated by the fact that the only core [Color Space](https://registry.khronos.org/vulkan/specs/latest/man/html/VkColorSpaceKHR.html) is `vk::ColorSpaceKHR::eVkColorspaceSrgbNonlinear`, which specifies support for the images in sRGB color space. +sRGB 포맷이 선호되는 이유는 화면의 색상 공간이 sRGB이기 때문입니다. 이는 Vulkan의 기본 [색상 영역](https://registry.khronos.org/vulkan/specs/latest/man/html/VkColorSpaceKHR.html)이 `vk::ColorSpaceKHR::eVkColorspaceSrgbNonlinear` 하나 뿐이라는 사실에서 알 수 있습니다. 이 값은 sRGB 색상 공간의 이미지를 지원함을 나타냅니다. -The constructor can now be implemented: +이제 생성자를 구현할 수 있습니다. ```cpp auto const surface_format = @@ -84,9 +84,10 @@ if (!recreate(size)) { } ``` -## Swapchain Recreation +## 스왑체인 재생성 The constraints on Swapchain creation parameters are specified by [Surface Capabilities](https://registry.khronos.org/vulkan/specs/latest/man/html/VkSurfaceCapabilitiesKHR.html). Based on the spec we add two helper functions and a constant: +스왑체인 생성 파라미터의 제약은 Surface Capabilities에 지정됩니다. 스펙에 따라 함수 두 개와 상수 하나를 추가하겠습니다. ```cpp constexpr std::uint32_t min_images_v{3}; @@ -118,9 +119,9 @@ get_image_count(vk::SurfaceCapabilitiesKHR const& capabilities) } ``` -We want at least three images in order to be have the option to set up triple buffering. While it's possible for a Surface to have `maxImageCount < 3`, it is quite unlikely. It is in fact much more likely for `minImageCount > 3`. +트리플 버퍼링을 설정할 수 있도록 최소한 세 개의 이미지가 필요합니다. Surface의 `maxImageCount < 3`일 가능성도 있지만, 그럴 일은 거의 없습니다. 오히려 `minImageCount > 3`인 경우가 더 흔합니다. -The dimensions of Vulkan Images must be positive, so if the incoming framebuffer size is not, we skip the attempt to recreate. This can happen eg on Windows when the window is minimized. (Until it is restored, rendering will basically be paused.) +Vulkan 이미지의 차원은 양수여야만 하므로, 전달받은 프레임 버퍼 크기가 유효하지 않다면 재생성을 생략합니다. 예를 들어 윈도우가 최소화된 경우 이런 상황이 발생할 수 있습니다(이때는 창이 복원될 때까지 렌더링이 일시 중지됩니다). ```cpp auto Swapchain::recreate(glm::ivec2 size) -> bool { @@ -144,7 +145,7 @@ auto Swapchain::recreate(glm::ivec2 size) -> bool { } ``` -After successful recreation we want to fill up those vectors of images and views. For the images we use a more verbose approach to avoid having to assign the member vector to a newly returned one every time: +재생성에 성공한 후에는 이미지와 이미지 뷰 벡터를 채워야 합니다. 이미지의 경우, 매번 새로 반환된 벡터를 멤버 변수에 할당하지 않기 위해 약간 더 복잡한 방식으로 접근합니다. ```cpp void require_success(vk::Result const result, char const* error_msg) { @@ -167,7 +168,7 @@ void Swapchain::populate_images() { } ``` -Creation of the views is fairly straightforward: +이미지 뷰 생성은 비교적 간단합니다. ```cpp void Swapchain::create_image_views() { @@ -190,7 +191,7 @@ void Swapchain::create_image_views() { } ``` -We can now call these functions in `recreate()`, before `return true`, and add a log for some feedback: +이제 이 함수를 `recreate()`에서 `return true` 직전에 호출하고 로그를 찍어봅시다. ```cpp populate_images(); @@ -201,9 +202,9 @@ std::println("[lvk] Swapchain [{}x{}]", size.x, size.y); return true; ``` -> The log can get a bit noisy on incessant resizing (especially on Linux). +> 창 크기를 계속해서 바꿀 경우 로그가 많이 찍힐 수 있습니다(특히 Linux에서). -To get the framebuffer size, add a helper function in `window.hpp/cpp`: +프레임 버퍼 크기를 얻기 위해 `window.hpp/cpp`에 함수를 추가합니다. ```cpp auto glfw::framebuffer_size(GLFWwindow* window) -> glm::ivec2 { @@ -213,7 +214,7 @@ auto glfw::framebuffer_size(GLFWwindow* window) -> glm::ivec2 { } ``` -Finally, add a `std::optional` member to `App` after `m_device`, add the create function, and call it after `create_device()`: +마지막으로, `std::optional` 멤버를 `App`의 `m_device` 이후에 추가하고, 생성 함수를 추가하여 `create_device()` 이후에 이를 호출합니다. ```cpp std::optional m_swapchain{}; From 94dc44023f441a4903750dcafbfcb1c28fbb8b3e Mon Sep 17 00:00:00 2001 From: CDDing Date: Tue, 22 Apr 2025 01:44:32 +0900 Subject: [PATCH 3/9] ko-translate rendering --- .../ko-KR/src/rendering/README.md | 4 +-- .../ko-KR/src/rendering/dynamic_rendering.md | 28 +++++++-------- .../ko-KR/src/rendering/render_sync.md | 10 +++--- .../ko-KR/src/rendering/swapchain_loop.md | 34 ++++++++++--------- .../ko-KR/src/rendering/swapchain_update.md | 23 +++++++------ 5 files changed, 51 insertions(+), 48 deletions(-) diff --git a/guide/translations/ko-KR/src/rendering/README.md b/guide/translations/ko-KR/src/rendering/README.md index ddd1e9f..326e43c 100644 --- a/guide/translations/ko-KR/src/rendering/README.md +++ b/guide/translations/ko-KR/src/rendering/README.md @@ -1,3 +1,3 @@ -# Rendering +# 렌더링 -This section implements Render Sync, the Swapchain loop, performs Swapchain image layout transitions, and introduces [Dynamic Rendering](https://docs.vulkan.org/samples/latest/samples/extensions/dynamic_rendering/README.html). Originally Vulkan only supported [Render Passes](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/03_Render_passes.html), which are quite verbose to setup, require somewhat confusing subpass dependencies, and are ironically _less_ explicit: they can perform implicit layout transitions on their framebuffer attachments. They are also tightly coupled to Graphics Pipelines, you need a separate pipeline object for each Render Pass, even if they are identical in all other respects. This RenderPass/Subpass model was primarily beneficial for GPUs with tiled renderers, and in Vulkan 1.3 Dynamic Rendering was promoted to the core API (previously it was an extension) as an alternative to using Render Passes. +여기서는 렌더 싱크, 스왑체인 루프의 구현, 스왑체인 이미지의 레이아웃 전환을 수행하고, [동적 렌더링(Dynamic Rendering)](https://docs.vulkan.org/samples/latest/samples/extensions/dynamic_rendering/README.html)을 소개합니다. 초기 Vulkan은 [렌더 패스(Render Passes)](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/03_Render_passes.html)만을 지원했습니다. 렌더 패스는 설정이 장황하고, (subpass 의존성 같은) 다소 혼란스러운 요소들을 요구하며, 아이러니하게도 오히려 명시적이지 않은 부분이 있습니다. 예를 들어 렌더패스는 프레임버퍼 어태치먼트의 레이아웃을 암시적으로 전환할 수 있습니다. 또한 렌더 패스는 그래픽스 파이프라인과 밀접하게 결합되어 있어, 다른 모든 조건이 같더라도 렌더 패스마다 별도의 파이프라인 객체가 필요합니다. 이 렌더 패스/서브 패스 모델은 타일 기반 렌더러를 사용하는 GPU에 주로 유리한 모델이었습니다. 그리고 Vulkan 1.3에서는 동적 렌더링이 렌더 패스를 대체하는 핵심 API로 부상했습니다(이전에는 확장일 뿐이었습니다). diff --git a/guide/translations/ko-KR/src/rendering/dynamic_rendering.md b/guide/translations/ko-KR/src/rendering/dynamic_rendering.md index b913b64..e7e5be3 100644 --- a/guide/translations/ko-KR/src/rendering/dynamic_rendering.md +++ b/guide/translations/ko-KR/src/rendering/dynamic_rendering.md @@ -1,8 +1,8 @@ -# Dynamic Rendering +# 동적 렌더링 -Dynamic Rendering enables us to avoid using Render Passes, which are quite a bit more verbose (but also generally more performant on tiled GPUs). Here we tie together the Swapchain, Render Sync, and rendering. We are not ready to actually render anything yet, but can clear the image to a particular color. +동적 렌더링을 활성화하면 비교적 복잡한 렌더 패스를 사용하지 않아도 됩니다. 다만 렌더 패스는 타일 기반 GPU에서 조금 더 이점을 갖습니다. 여기서는 스왑체인, 렌더 싱크, 그리고 렌더링 자체를 하나로 묶는 작업을 진행하겠습니다. 아직 실제로 화면에 무언가를 렌더링할 준비가 된 것은 아니지만, 특정 색상으로 이미지를 초기화할 수는 있습니다. -Add these new members to `App`: +아래와 같은 멤버를 `App`에 추가하겠습니다. ```cpp auto acquire_render_target() -> bool; @@ -17,7 +17,7 @@ glm::ivec2 m_framebuffer_size{}; std::optional m_render_target{}; ``` -The main loop can now use these to implement the Swapchain and rendering loop: +이제 메인 루프는 이 멤버들을 활용하여 스왑체인과 렌더링 루프를 구현할 수 있습니다. ```cpp while (glfwWindowShouldClose(m_window.get()) == GLFW_FALSE) { @@ -31,7 +31,7 @@ while (glfwWindowShouldClose(m_window.get()) == GLFW_FALSE) { } ``` -Before acquiring a Swapchain image, we need to wait for the current frame's fence. If acquisition is successful, reset the fence ('un'signal it): +스왑체인 이미지를 받아오기 전에, 현재 프레임의 펜스를 대기해야 합니다. 이미지를 받아오는 것이 성공하면 해당 펜스를 리셋(unsignal)합니다. ```cpp auto App::acquire_render_target() -> bool { @@ -67,7 +67,7 @@ auto App::acquire_render_target() -> bool { } ``` -Since the fence has been reset, a queue submission must be made that signals it before continuing, otherwise the app will deadlock on the next wait (and eventually throw after 3s). Begin Command Buffer recording: +펜스가 리셋되었기 때문에, 다음 동작을 진행하기 전에 해당 펜스를 signal하도록 반드시 큐에 커맨드 버퍼가 제출되어야 합니다. 그렇지 않으면 다음 루프에서 펜스를 기다리는 과정에서 교착 상태에 빠지고, 결국 3초 후 예외가 발생하게 됩니다. 이제 커맨드 버퍼 기록을 시작하겠습니다. ```cpp auto App::begin_frame() -> vk::CommandBuffer { @@ -81,7 +81,7 @@ auto App::begin_frame() -> vk::CommandBuffer { } ``` -Transition the image for rendering, ie Attachment Optimal layout. Set up the image barrier and record it: +렌더링에 사용할 이미지의 레이아웃을 AttachmentOptimal 레이아웃으로 전환합니다. 이를 위해 이미지 배리어를 설정하고 커맨드 버퍼에 기록합니다. ```cpp void App::transition_for_render(vk::CommandBuffer const command_buffer) const { @@ -102,7 +102,7 @@ void App::transition_for_render(vk::CommandBuffer const command_buffer) const { } ``` -Create a Rendering Attachment Info using the acquired image as the color target. We use a red clear color, make sure the Load Op clears the image, and Store Op stores the results (currently just the cleared image). Set up a Rendering Info object with the color attachment and the entire image as the render area. Finally, execute the render: +받아온 이미지를 색상 타겟으로 사용하는 RenderingAttachmentInfo를 생성합니다. 빨간 색을 초기화 색상으로 사용하고, LoadOp가 이미지를 초기화하며, StoreOp는 결과를 담도록 해야 합니다(현재는 초기화된 이미지만 저장합니다). 이 colorAttachment와 전체 이미지를 렌더링 영역으로 설정한 RenderingInfo 구조체를 생성합니다. 마지막으로 렌더링을 실행합니다. ```cpp void App::render(vk::CommandBuffer const command_buffer) { @@ -126,7 +126,7 @@ void App::render(vk::CommandBuffer const command_buffer) { } ``` -Transition the image for presentation: +렌더링이 끝나면 이미지를 표시하기 위해 레이아웃을 전환합니다. ```cpp void App::transition_for_present(vk::CommandBuffer const command_buffer) const { @@ -147,7 +147,7 @@ void App::transition_for_present(vk::CommandBuffer const command_buffer) const { } ``` -End the command buffer and submit it. The `draw` Semaphore will be signaled by the Swapchain when the image is ready, which will trigger this command buffer's execution. It will signal the `present` Semaphore and `drawn` Fence on completion, with the latter being waited on the next time this virtual frame is processed. Finally, we increment the frame index, pass the `present` semaphore as the one for the subsequent present operation to wait on: +커맨드 버퍼를 끝내고(End) 이를 제출합니다. 스왑체인 이미지를 사용할 준비가 되면 `draw`세마포어가 시그널 되고, 이로 인해 커맨드 버퍼가 실행됩니다. 렌더링이 완료되면 `present` 세마포어와 `drawn` 펜스가 시그널됩니다. 이후 동일한 가상 프레임이 다시 처리될 때 이 펜스를 기다리게 됩니다. 마지막으로 프레임 인덱스를 증가시키고, 다음 표시 작업이 대기할 수 있도록 `present` 세마포어를 전달합니다. ```cpp void App::submit_and_present() { @@ -183,19 +183,19 @@ void App::submit_and_present() { } ``` -> Wayland users: congratulaions, you can finally see and interact with the window! +> Wayland 사용자라면 이제 마침내 창과 상호작용할 수 있습니다! ![Cleared Image](./dynamic_rendering_red_clear.png) -## Render Doc on Wayland +## Wayland에서의 RenderDoc -At the time of writing, RenderDoc doesn't support inspecting Wayland applications. Temporarily force X11 (XWayland) by calling `glfwInitHint()` before `glfwInit()`: +이 글을 작성하는 시점에서는 RenderDoc이 Wayland 애플리케이션을 지원하지 않습니다. `glfwInit()` 이전에 `glfwInitHint()`를 호출하여 임시로 X11(XWayland)를 사용하도록 강제할 수 있습니다. ```cpp glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_X11); ``` -Setting up a command line option to conditionally call this is a simple and flexible approach: just set that argument in RenderDoc itself and/or pass it whenever an X11 backend is desired: +커맨드라인 옵션을 활용해 이 설정을 조건적으로 적용하는 것이 간단하고 유연한 방식입니다. RenderDoc에서 해당 인자를 설정하거나, X11 백엔드를 사용하고자 할 때마다 넘겨주는 식으로 처리하면 됩니다. ```cpp // main.cpp diff --git a/guide/translations/ko-KR/src/rendering/render_sync.md b/guide/translations/ko-KR/src/rendering/render_sync.md index f18023d..46520ef 100644 --- a/guide/translations/ko-KR/src/rendering/render_sync.md +++ b/guide/translations/ko-KR/src/rendering/render_sync.md @@ -1,6 +1,6 @@ -# Render Sync +# 렌더 싱크 -Create a new header `resource_buffering.hpp`: +새로운 헤더 `resource_buffering.hpp`를 생성합니다. ```cpp // Number of virtual frames. @@ -11,7 +11,7 @@ template using Buffered = std::array; ``` -Add a private `struct RenderSync` to `App`: +`App`에 private 멤버 `struct RenderSync`를 추가합니다. ```cpp struct RenderSync { @@ -26,7 +26,7 @@ struct RenderSync { }; ``` -Add the new members associated with the Swapchain loop: +스왑체인 루프와 관련있는 새로운 멤버를 추가합니다. ```cpp // command pool for all render Command Buffers. @@ -37,7 +37,7 @@ Buffered m_render_sync{}; std::size_t m_frame_index{}; ``` -Add, implement, and call the create function: +생성 함수를 추가하고, 구현한 다음 호출합니다. ```cpp void App::create_render_sync() { diff --git a/guide/translations/ko-KR/src/rendering/swapchain_loop.md b/guide/translations/ko-KR/src/rendering/swapchain_loop.md index 64f7043..c506322 100644 --- a/guide/translations/ko-KR/src/rendering/swapchain_loop.md +++ b/guide/translations/ko-KR/src/rendering/swapchain_loop.md @@ -1,28 +1,30 @@ -# Swapchain Loop +# 스왑체인 루프 -One part of rendering in the main loop is the Swapchain loop, which at a high level comprises of these steps: +렌더링 루프의 핵심 요소 중 하나는 스왑체인 루프입니다. 이는 다음과 같은 고수준 단계로 구성됩니다. -1. Acquire a Swapchain Image -1. Render to the acquired Image -1. Present the Image (this releases the image back to the Swapchain) +1. 스왑체인으로부터 이미지를 받아옵니다. +2. 받아온 이미지에 렌더링합니다. +3. 렌더링이 끝난 이미지를 표시합니다(이미지를 다시 스왑체인으로 돌려줍니다). ![WSI Engine](./wsi_engine.png) -There are a few nuances to deal with, for instance: +여기서 몇 가지 고려해야할 점이 있습니다. -1. Acquiring (and/or presenting) will sometimes fail (eg because the Swapchain is out of date), in which case the remaining steps need to be skipped -1. The acquire command can return before the image is actually ready for use, rendering needs to be synchronized to only start after the image is ready -1. Similarly, presentation needs to be synchronized to only occur after rendering has completed -1. The images need appropriate Layout Transitions at each stage +1. 이미지를 받아오거나 표시하는 과정은 실패할 수 있습니다(스왑체인을 사용할 수 없는 경우). 이 때 남은 단계들은 생략해야 합니다. +2. 받아오는 명령은 이미지가 실제로 사용할 준비가 되기 전에 반환될 수 있으며, 렌더링은 해당 이미지를 받아온 이후에 시작하도록 동기화되어야 합니다. +3. 마찬가지로, 표시하는 작업 또한 렌더링이 끝난 이후에 수행되도록 동기화해야 합니다. +4. 이미지들은 각 단계에 맞는 적절한 레이아웃으로 전환되어야 합니다. -Additionally, the number of swapchain images can vary, whereas the engine should use a fixed number of _virtual frames_: 2 for double buffering, 3 for triple (more is usually overkill). More info is available [here](https://docs.vulkan.org/samples/latest/samples/performance/swapchain_images/README.html#_double_buffering_or_triple_buffering). It's also possible for the main loop to acquire the same image before a previous render command has finished (or even started), if the Swapchain is using Mailbox Present Mode. While FIFO will block until the oldest submitted image is available (also known as vsync), we should still synchronize and wait until the acquired image has finished rendering. +또한, 스왑체인의 이미지의 수는 시스템에 따라 달라질 수 있지만, 엔진은 일반적으로 고정된 개수의 가상 프레임을 사용합니다. 더블 버퍼링에는 2개의 가상 프레임, 트리플 버퍼링에는 3개(보통은 3개로 충분합니다). 자세한 내용은 [여기](https://docs.vulkan.org/samples/latest/samples/performance/swapchain_images/README.html#_double_buffering_or_triple_buffering)서 확인할 수 있습니다. 또한 스왑체인이 (Vsync라 알려진)Mailbox Present 모드를 사용중이라면 메인 루프 중에 이전 렌더링 명령이 끝나기 전 동일한 이미지를 가져오는 것도 가능합니다. -## Virtual Frames +## 가상 프레임 -All the dynamic resources used during the rendering of a frame comprise a virtual frame. The application has a fixed number of virtual frames which it cycles through on each render pass. For synchronization, each frame will be associated with a [`vk::Fence`](https://docs.vulkan.org/spec/latest/chapters/synchronization.html#synchronization-fences) which will be waited on before rendering to it again. It will also have a pair of [`vk::Semaphore`](https://docs.vulkan.org/spec/latest/chapters/synchronization.html#synchronization-semaphores)s to synchronize the acquire, render, and present calls on the GPU (we don't need to wait for them on the CPU side / in C++). For recording commands, there will be a [`vk::CommandBuffer`](https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html) per virtual frame, where all rendering commands for that frame (including layout transitions) will be recorded. +프레임마다 사용되는 모든 동적 자원들은 가상 프레임에 포함됩니다. 애플리케이션은 고정된 개수의 가상 프레임을 가지고 있으며, 매 렌더 패스마다 이를 순환하며 사용합니다. 동기화를 위해 각 프레임은 이전 프레임의 렌더링이 끝날 때 까지 대기하게 만드는 [`vk::Fence`](https://docs.vulkan.org/spec/latest/chapters/synchronization.html#synchronization-fences)가 있어야 합니다. 또한 GPU에서의 이미지를 받아오고, 렌더링, 화면에 나타내는 작업을 동기화하기 위한 2개의[`vk::Semaphore`](https://docs.vulkan.org/spec/latest/chapters/synchronization.html#synchronization-semaphores)가 필요합니다(이 작업들은 CPU측에서 대기할 필요는 없습니다). 명령을 기록하기 위해 가상 프레임마다 [`vk::CommandBuffer`](https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html)를 두어 해당 프레임의 (레이아웃 전환을 포함한) 모든 렌더링 명령을 기록할 것입니다. -## Image Layouts +## 이미지 레이아웃 -Vulkan Images have a property known as [Image Layout](https://docs.vulkan.org/spec/latest/chapters/resources.html#resources-image-layouts). Most operations on images and their subresources require them to be in certain specific layouts, requiring transitions before (and after). A layout transition conveniently also functions as a Pipeline Barrier (think memory barrier on the GPU), enabling us to synchronize operations before and after the transition. -Vulkan Synchronization is arguably the most complicated aspect of the API, a good amount of research is recommended. Here is an [article explaining barriers](https://gpuopen.com/learn/vulkan-barriers-explained/). +Vulkan 이미지에는 [이미지 레이아웃](https://docs.vulkan.org/spec/latest/chapters/resources.html#resources-image-layouts)이라 알려진 속성이 있습니다. 대부분의 이미지 작업과 이미지의 서브리소스는 특정 레이아웃에서만 수행될 수 있으므로, 작업 전후에 레이아웃 전환이 필요합니다. 레이아웃 전환은 파이프라인 배리어(GPU의 메모리 배리어를 생각하세요)역할도 수행하며, 전환 전후의 작업을 동기화할수 있게 합니다. + +Vulkan 동기화는 아마도 API의 가장 복잡한 부분 중 하나일 것입니다. 충분한 학습이 권장되며, [이 글](https://gpuopen.com/learn/vulkan-barriers-explained/)에서 배리어에 대해 자세히 설명하고 있습니다. + diff --git a/guide/translations/ko-KR/src/rendering/swapchain_update.md b/guide/translations/ko-KR/src/rendering/swapchain_update.md index 20191d9..696d82d 100644 --- a/guide/translations/ko-KR/src/rendering/swapchain_update.md +++ b/guide/translations/ko-KR/src/rendering/swapchain_update.md @@ -1,13 +1,14 @@ -# Swapchain Update +# 스왑체인 업데이트 Swapchain acquire/present operations can have various results. We constrain ourselves to the following: +스왑체인에서 이미지를 받아오고 표시하는 작업은 다양한 결과를 반환할 수 있습니다. 우리는 다음과 같은 경우에 한정하여 처리합니다. -- `eSuccess`: all good -- `eSuboptimalKHR`: also all good (not an error, and this is unlikely to occur on a desktop) -- `eErrorOutOfDateKHR`: Swapchain needs to be recreated -- Any other `vk::Result`: fatal/unexpected error +- `eSuccess` : 문제가 없습니다. +- `eSuboptimalKHR` : 역시 문제가 없습니다(에러는 아니며, 데스크탑 환경에서는 드물게 발생합니다). +- `eErrorOutOfDateKHR` : 스왑체인을 재생성해야 합니다. +- 그 외의 모든 `vk::Result` : 치명적이거나 예기치 않은 오류입니다. -Expressing as a helper function in `swapchain.cpp`: +`swapchain.cpp`에 함수를 생성합시다. ```cpp auto needs_recreation(vk::Result const result) -> bool { @@ -21,7 +22,7 @@ auto needs_recreation(vk::Result const result) -> bool { } ``` -We also want to return the Image, Image View, and size upon successful acquisition of the underlying Swapchain Image. Wrapping those in a `struct`: +스왑체인으로부터 이미지를 성공적으로 받아오면 이미지와 이미지 뷰, 그리고 크기를 반환해야 합니다. 이를 `struct`로 감싸겠습니다. ```cpp struct RenderTarget { @@ -31,9 +32,9 @@ struct RenderTarget { }; ``` -VulkanHPP's primary API throws if the `vk::Result` corresponds to an error (based on the spec). `eErrorOutOfDateKHR` is technically an error, but it's quite possible to get it when the framebuffer size doesn't match the Swapchain size. To avoid having to deal with exceptions here, we use the alternate API for the acquire and present calls (overloads distinguished by pointer arguments and/or out parameters, and returning a `vk::Result`). +VulkanHPP의 기본 API는 `vk::Result`가 오류에 해당되면 (사양에 따라) 예외를 던집니다. `eErrorOutOfDateKHR`은 기술적으로는 오류이지만, 프레임버퍼와 스왑체인의 크기가 일치하지 않을 때 일어날 수 있습니다. 이러한 예외 처리를 피하기 위해, 우리는 포인터 인자 또는 출력 인자를 사용하는 오버로드 버전 API를 사용하여 `vk::Result`를 직접 반환받는 방식으로 대체하겠습니다. -Implementing the acquire operation: +이미지를 가져오는 함수를 작성하겠습니다. ```cpp auto Swapchain::acquire_next_image(vk::Semaphore const to_signal) @@ -56,7 +57,7 @@ auto Swapchain::acquire_next_image(vk::Semaphore const to_signal) } ``` -Similarly, present: +표시하는 함수도 마찬가지입니다. ```cpp auto Swapchain::present(vk::Queue const queue, vk::Semaphore const to_wait) @@ -73,7 +74,7 @@ auto Swapchain::present(vk::Queue const queue, vk::Semaphore const to_wait) } ``` -It is the responsibility of the user (`class App`) to recreate the Swapchain on receiving `std::nullopt` / `false` return values for either operation. Users will also need to transition the layouts of the returned images between acquire and present operations. Add a helper to assist in that process, and extract the Image Subresource Range out as a common constant: +각 작업에서 `std::nullopt` 혹은 `false`가 반환될 경우, 스왑체인을 재생성하는 것은 사용자(`class App`)의 책임입니다. 사용자는 또한 받아오는 것과 표시하는 작업 사이에 이미지의 레이아웃을 전환해야 합니다. 이 과정을 돕는 함수를 추가하고 공통 상수로 사용할 수 있도록 ImageSubresourceRange 분리해 정의합니다. ```cpp constexpr auto subresource_range_v = [] { From 5903fa195e8f46e3a2d6a6fb70cd3756d77039e2 Mon Sep 17 00:00:00 2001 From: CDDing Date: Wed, 23 Apr 2025 00:18:19 +0900 Subject: [PATCH 4/9] ko-translate ImGui --- guide/translations/ko-KR/src/dear_imgui/README.md | 2 +- .../translations/ko-KR/src/dear_imgui/dear_imgui.md | 12 ++++++------ .../ko-KR/src/dear_imgui/imgui_integration.md | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/guide/translations/ko-KR/src/dear_imgui/README.md b/guide/translations/ko-KR/src/dear_imgui/README.md index 324cd8f..61b039f 100644 --- a/guide/translations/ko-KR/src/dear_imgui/README.md +++ b/guide/translations/ko-KR/src/dear_imgui/README.md @@ -1,3 +1,3 @@ # Dear ImGui -Dear ImGui does not have native CMake support, and while adding the sources to the executable is an option, we will add it as an external library target: `imgui` to isolate it (and compile warnings etc) from our own code. This requires some changes to the `ext` target structure, since `imgui` will itself need to link to GLFW and Vulkan-Headers, have `VK_NO_PROTOTYPES` defined, etc. `learn-vk-ext` then links to `imgui` and any other libraries (currently only `glm`). We are using Dear ImGui v1.91.9, which has decent support for Dynamic Rendering. +Dear ImGui는 네이티브 CMake를 지원하지 않기 때문에, 소스를 실행 파일에 직접 추가하는 방법도 있지만, 컴파일 경고 등에서 우리 코드와 분리하기 위해 외부 라이브러리 타겟인 `imgui`로 추가할 예정입니다. 이를 위해 `imgui`는 GLFW 및 Vulkan-Headers에 연결되어야 하고, `VK_NO_PROTOTYPES`도 정의되어야 하므로 `ext` 타겟 구조에 약간의 변경이 필요합니다. 이후 `learn-vk-ext`는 `imgui` 및 기타 라이브러리들(현재는 `glm`만 있음)과 연결됩니다. 우리는 동적 렌더링을 지원하는 Dear ImGui v1.91.9 버전을 사용할 예정입니다. diff --git a/guide/translations/ko-KR/src/dear_imgui/dear_imgui.md b/guide/translations/ko-KR/src/dear_imgui/dear_imgui.md index 69e18a2..ef19b91 100644 --- a/guide/translations/ko-KR/src/dear_imgui/dear_imgui.md +++ b/guide/translations/ko-KR/src/dear_imgui/dear_imgui.md @@ -1,6 +1,6 @@ # class DearImGui -Dear ImGui has its own initialization and loop, which we encapsulate into `class DearImGui`: +Dear ImGui는 자체적인 초기화 과정과 렌더링 루프를 가지고 있으며, 이를 `class DearImGui`로 캡슐화하겠습니다. ```cpp struct DearImGuiCreateInfo { @@ -38,7 +38,7 @@ class DearImGui { }; ``` -In the constructor, we start by creating the ImGui Context, loading Vulkan functions, and initializing GLFW for Vulkan: +생성자에서는 ImGui 컨텍스트를 생성하고, Vulkan 함수를 불러와 Vulkan을 위한 GLFW 초기화를 진행합니다 ```cpp IMGUI_CHECKVERSION(); @@ -57,7 +57,7 @@ if (!ImGui_ImplGlfw_InitForVulkan(create_info.window, true)) { } ``` -Then initialize Dear ImGui for Vulkan: +그 후 Vulkan용 Dear ImGui를 초기화합니다. ```cpp auto init_info = ImGui_ImplVulkan_InitInfo{}; @@ -83,7 +83,7 @@ if (!ImGui_ImplVulkan_Init(&init_info)) { ImGui_ImplVulkan_CreateFontsTexture(); ``` -Since we are using an sRGB format and Dear ImGui is not color-space aware, we need to convert its style colors to linear space (so that they shift back to the original values by gamma correction): +sRGB 포맷을 사용하고 있지만 Dear ImGui는 색상 공간에 대한 인식이 없기 때문에, 스타일 색상들을 선형 공간으로 변환해주어야 합니다. 이렇게 하면 감마 보정 과정을 통해 의도한 색상이 출력됩니다. ```cpp ImGui::StyleColorsDark(); @@ -96,7 +96,7 @@ for (auto& colour : ImGui::GetStyle().Colors) { ImGui::GetStyle().Colors[ImGuiCol_WindowBg].w = 0.99f; // more opaque ``` -Finally, create the deleter and its implementation: +마지막으로 삭제자(Deleter)를 생성하고 구현합니다. ```cpp m_device = Scoped{create_info.device}; @@ -111,7 +111,7 @@ void DearImGui::Deleter::operator()(vk::Device const device) const { } ``` -The remaining functions are straightforward: +이 외의 나머지 함수들은 비교적 단순합니다. ```cpp void DearImGui::new_frame() { diff --git a/guide/translations/ko-KR/src/dear_imgui/imgui_integration.md b/guide/translations/ko-KR/src/dear_imgui/imgui_integration.md index 97d9c28..44029c1 100644 --- a/guide/translations/ko-KR/src/dear_imgui/imgui_integration.md +++ b/guide/translations/ko-KR/src/dear_imgui/imgui_integration.md @@ -1,6 +1,6 @@ -# ImGui Integration +# ImGui 통합 -Update `Swapchain` to expose its image format: +`Swapchain`이 이미지 포맷을 외부에 노출하도록 수정하겠습니다. ```cpp [[nodiscard]] auto get_format() const -> vk::Format { @@ -8,7 +8,7 @@ Update `Swapchain` to expose its image format: } ``` -`class App` can now store a `std::optional` member and add/call its create function: +`class App`은 이제 `std::optional` 멤버를 담을 수 있으며, 이를 생성하는 함수를 추가하고 호출할 수 있습니다. ```cpp void App::create_imgui() { @@ -27,7 +27,7 @@ void App::create_imgui() { } ``` -Start a new ImGui frame after resetting the render fence, and show the demo window: +렌더 패스를 리셋한 이후에 새로운 ImGui 프레임을 시작하고, 데모 창을 띄워봅시다. ```cpp m_device->resetFences(*render_sync.drawn); @@ -40,9 +40,9 @@ ImGui::ShowDemoWindow(); command_buffer.endRendering(); ``` -ImGui doesn't draw anything here (the actual draw command requires the Command Buffer), it's just a good customization point for all higher level logic. +ImGui는 이 시점에서는 아무것도 그리지 않습니다(실제 그리기 명령은 커맨드 버퍼가 필요합니다). 이 부분은 상위 로직을 구성하기 위한 커스터마이징 지점입니다. -We use a separate render pass for Dear ImGui, again for isolation, and to enable us to change the main render pass later, eg by adding a depth buffer attachment (`DearImGui` is setup assuming its render pass will only use a single color attachment). +우리는 Dear ImGui를 위한 별도의 렌더 패스를 사용합니다. 이는 코드의 분리를 위한 목적도 있고, 메인 렌더 패스를 나중에 깊이 버퍼를 추가하는 것과 같은 상황에 변경할 수 있도록 하기 위함입니다 `DearImGui`는 하나의 색상 어태치먼트만 사용하는 전용 렌더 패스를 설정한다고 간주합니다. ```cpp m_imgui->end_frame(); From 45860e624b9225a67d01f4ce9d37c9b38a88dddc Mon Sep 17 00:00:00 2001 From: CDDing Date: Tue, 29 Apr 2025 01:58:37 +0900 Subject: [PATCH 5/9] ko-translate shader_objects --- .../ko-KR/src/shader_objects/README.md | 6 ++-- .../src/shader_objects/drawing_triangle.md | 22 ++++++------ .../src/shader_objects/glsl_to_spir_v.md | 9 +++-- .../src/shader_objects/locating_assets.md | 14 ++++---- .../ko-KR/src/shader_objects/pipelines.md | 15 ++++---- .../src/shader_objects/shader_program.md | 35 ++++++++++--------- 6 files changed, 54 insertions(+), 47 deletions(-) diff --git a/guide/translations/ko-KR/src/shader_objects/README.md b/guide/translations/ko-KR/src/shader_objects/README.md index 88e169b..b07983d 100644 --- a/guide/translations/ko-KR/src/shader_objects/README.md +++ b/guide/translations/ko-KR/src/shader_objects/README.md @@ -1,5 +1,5 @@ -# Shader Objects +# 셰이더 객체 -A [Vulkan Graphics Pipeline](https://docs.vulkan.org/spec/latest/chapters/pipelines.html) is a large object that encompasses the entire graphics pipeline. It consists of many stages - all this happens during a single `draw()` call. There is however an extension called [`VK_EXT_shader_object`](https://www.khronos.org/blog/you-can-use-vulkan-without-pipelines-today) which enables avoiding graphics pipelines entirely. Almost all pipeline state becomes dynamic, ie set at draw time, and the only Vulkan handles to own are `ShaderEXT` objects. For a comprehensive guide, check out the [Vulkan Sample from Khronos](https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/extensions/shader_object). +[Vulkan의 그래픽스 파이프라인](https://docs.vulkan.org/spec/latest/chapters/pipelines.html)은 전체 렌더링 과정을 아우르는 거대한 객체로, `draw()` 호출 한 번에 여러 단계를 수행합니다. 하지만 [`VK_EXT_shader_object`](https://www.khronos.org/blog/you-can-use-vulkan-without-pipelines-today)라는 확장을 사용하면, 이러한 그래픽스 파이프라인 자체를 완전히 생략할 수 있습니다. 이 확장을 사용할 경우 대부분의 파이프라인 상태가 동적으로 설정되며, 그리는 시점에 설정됩니다. 이때 개발자가 직접 다뤄야할 Vulkan 핸들은 `ShaderEXT` 객체뿐입니다. 더 자세한 정보는 [여기](https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/extensions/shader_object)를 참고하세요. -Vulkan requires shader code to be provided as SPIR-V (IR). We shall use `glslc` (part of the Vulkan SDK) to compile GLSL to SPIR-V manually when required. +Vulkan에서는 셰이더 코드를 SPIR-V 형태로 제공해야 합니다. 우리는 Vulkan SDK에 포함된 `glslc`를 사용해 GLSL 코드를 필요할 때 수동으로 SPIR-V 파일로 컴파일하겠습니다. diff --git a/guide/translations/ko-KR/src/shader_objects/drawing_triangle.md b/guide/translations/ko-KR/src/shader_objects/drawing_triangle.md index ecb757f..bee5e66 100644 --- a/guide/translations/ko-KR/src/shader_objects/drawing_triangle.md +++ b/guide/translations/ko-KR/src/shader_objects/drawing_triangle.md @@ -1,6 +1,6 @@ -# Drawing a Triangle +# 삼각형 그리기 -Add a `ShaderProgram` to `App` and its create function: +`App` 클래스에 `ShaderProgram`과 이를 생성하는 함수를 추가합니다. ```cpp [[nodiscard]] auto asset_path(std::string_view uri) const -> fs::path; @@ -12,7 +12,7 @@ void create_shader(); std::optional m_shader{}; ``` -Implement and call `create_shader()` (and `asset_path()`): +`asset_path()`와 `create_shader()`를 구현하고 호출합니다. ```cpp void App::create_shader() { @@ -33,7 +33,7 @@ auto App::asset_path(std::string_view const uri) const -> fs::path { } ``` -Before `render()` grows to an unwieldy size, extract the higher level logic into two member functions: +`render()`가 걷잡을 수 없이 커지기 전에, 고수준 로직을 두 멤버 함수로 분리합니다. ```cpp // ImGui code goes here. @@ -54,7 +54,7 @@ draw(command_buffer); command_buffer.endRendering(); ``` -We can now bind the shader and use it to draw the triangle in the shader. Making `draw()` `const` forces us to ensure no `App` state is changed: +이제 셰이더를 바인딩하고 이를 삼각형을 그리는 데 사용할 수 있습니다. `draw()`함수를 `const`로 만들어 `App`을 건드리지 않도록 합니다. ```cpp void App::draw(vk::CommandBuffer const command_buffer) const { @@ -66,7 +66,7 @@ void App::draw(vk::CommandBuffer const command_buffer) const { ![White Triangle](./white_triangle.png) -Updating the shaders to use interpolated RGB on each vertex: +셰이더를 각 정점에 대해 보간된 RGB를 사용하도록 업데이트합니다. ```glsl // shader.vert @@ -91,22 +91,22 @@ layout (location = 0) in vec3 in_color; out_color = vec4(in_color, 1.0); ``` -> Make sure to recompile both the SPIR-V shaders in assets/. +> `assets/`에 있는 두 SPIR-V 파일을 다시 컴파일하는 것을 잊지 마세요. -And a black clear color: +그리고 초기화 색상을 검은 색으로 설정합니다. ```cpp // ... .setClearValue(vk::ClearColorValue{0.0f, 0.0f, 0.0f, 1.0f}); ``` -Gives us the renowned Vulkan sRGB triangle: +이제 Vulkan에서 sRGB 포맷으로 표현되는 삼각형을 볼 수 있습니다. ![sRGB Triangle](./srgb_triangle.png) -## Modifying Dynamic State +## 동적 상태 변경하기 -We can use an ImGui window to inspect / tweak some pipeline state: +ImGui 창을 사용해 파이프라인 상태를 관찰하거나 일부 설정을 변경할 수 있습니다. ```cpp ImGui::SetNextWindowSize({200.0f, 100.0f}, ImGuiCond_Once); diff --git a/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md b/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md index 6bdd049..1596cb1 100644 --- a/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md +++ b/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md @@ -1,6 +1,7 @@ -# GLSL to SPIR-V +# GLSL 에서 SPIR-V Shaders work in NDC space: -1 to +1 for X and Y. We output a triangle's coordinates in a new vertex shader and save it to `src/glsl/shader.vert`: +셰이더는 NDC 공간 X축과 Y축에서 -1에서 1까지 작동합니다. 새로운 정점 셰이더의 삼각형 좌표계를 출력하고 이를 `src/glsl/shader.vert`에 저장합니다. ```glsl #version 450 core @@ -19,6 +20,7 @@ void main() { ``` The fragment shader just outputs white for now, in `src/glsl/shader.frag`: +`src/glsl/shader.frag`의 프래그먼트 셰이더는 지금은 흰 색을 출력하기만 할 것입니다. ```glsl #version 450 core @@ -31,6 +33,7 @@ void main() { ``` Compile both shaders into `assets/`: +이 둘을 `assets/`로 컴파일합니다. ``` glslc src/glsl/shader.vert -o assets/shader.vert @@ -38,10 +41,12 @@ glslc src/glsl/shader.frag -o assets/shader.frag ``` > glslc is part of the Vulkan SDK. +> glslc는 Vulkan SDK의 일부입니다. -## Loading SPIR-V +## SPIR-V 불러오기 SPIR-V shaders are binary files with a stride/alignment of 4 bytes. As we have seen, the Vulkan API accepts a span of `std::uint32_t`s, so we need to load it into such a buffer (and _not_ `std::vector` or other 1-byte equivalents). Add a helper function in `app.cpp`: +SPIR-V 셰이더는 4바이트 단위로 정렬이 되어있는 바이너리 파일입니다. 지금까지 봐왔던 대로, Vulkan API는 `std::uint32_t`의 묶음을 받습니다. 따라서 이러한 종류의 버퍼(단, `std::vector` 혹은 다른 종류의 1바이트 컨테이너는 아닙니다)에 담습니다. 이를 돕는 함수를 `app.cpp`에 추가합니다. ```cpp [[nodiscard]] auto to_spir_v(fs::path const& path) diff --git a/guide/translations/ko-KR/src/shader_objects/locating_assets.md b/guide/translations/ko-KR/src/shader_objects/locating_assets.md index eba5416..1753bb9 100644 --- a/guide/translations/ko-KR/src/shader_objects/locating_assets.md +++ b/guide/translations/ko-KR/src/shader_objects/locating_assets.md @@ -1,6 +1,6 @@ -# Locating Assets +# 에셋 위치 -Before we can use shaders, we need to load them as asset/data files. To do that correctly, first the asset directory needs to be located. There are a few ways to go about this, we will use the approach of looking for a particular subdirectory, starting from the working directory and walking up the parent directory tree. This enables `app` in any project/build subdirectory to locate `assets/` in the various examples below: +셰이더를 사용하기 전에, 에셋 파일들을 불러와야 합니다. 이를 제대로 수행하려면 우선 에셋들이 위치한 경로를 알아야 합니다. 에셋 경로를 찾는 방법에는 여러 가지가 있지만, 우리는 현재 작업 디렉토리에서 시작하여 상위 디렉토리로 올라가며 특정 하위 폴더(`assets/`)를 찾는 방식을 사용할 것입니다. 이렇게 하면 프로젝트나 빌드 디렉토리 어디에서 `app`이 실행되더라도 `assets/` 디렉토리를 자동으로 찾아 접근할 수 있게 됩니다. ``` . @@ -15,11 +15,11 @@ Before we can use shaders, we need to load them as asset/data files. To do that |-- app ``` -In a release package you would want to use the path to the executable instead (and probably not perform an "upfind" walk), the working directory could be anywhere whereas assets shipped with the package will be in the vicinity of the executable. +릴리즈 패키지에서는 일반적으로 실행 파일의 경로를 기준으로 에셋 경로를 설정하며, 상위 경로로 거슬러 올라가는 방식은 사용하지 않는 것이 보통입니다. 작업 경로에 상관없이 패키지에 포함된 에셋은 보통 실행 파일과 같은 위치나 그 주변에 위치하기 때문입니다. -## Assets Directory - -Add a member to `App` to store this path to `assets/`: +## 에셋 경로 +: +`App`에 `assets/` 경로를 담을 멤버를 추가합니다. ```cpp namespace fs = std::filesystem; @@ -28,7 +28,7 @@ namespace fs = std::filesystem; fs::path m_assets_dir{}; ``` -Add a helper function to locate the assets dir, and assign `m_assets_dir` to its return value at the top of `run()`: +에셋 경로를 찾는 함수를 추가하고, 그 반환값을 `run()` 함수 상단에서 `m_assets_dir`에 저장하세요. ```cpp [[nodiscard]] auto locate_assets_dir() -> fs::path { diff --git a/guide/translations/ko-KR/src/shader_objects/pipelines.md b/guide/translations/ko-KR/src/shader_objects/pipelines.md index a9e23b0..8934e61 100644 --- a/guide/translations/ko-KR/src/shader_objects/pipelines.md +++ b/guide/translations/ko-KR/src/shader_objects/pipelines.md @@ -1,10 +1,10 @@ -# Graphics Pipelines +# 그래픽스 파이프라인 -This page describes the usage of Graphics Pipelines _instead of_ Shader Objects. While the guide assumes Shader Object usage, not much should change in the rest of the code if you instead choose to use Graphics Pipelines. A notable exception is the setup of Descriptor Set Layouts: with pipelines it needs to be specified as part of the Pipeline Layout, whereas with Shader Objects it is part of each ShaderEXT's CreateInfo. +여기서는 셰이더 오브젝트 대신 그래픽스 파이프라인을 사용하는 방법을 설명합니다. 이 가이드는 셰이더 오브젝트를 사용한다고 가정하지만, 그래픽스 파이프라인을 대신 사용하더라도 나머지 코드에는 큰 변화가 없을 것입니다. 다만, 알아둬야할 예외 사항은 디스크립터 셋 레이아웃 설정 방식입니다. 셰이더 오브젝트에서는 ShaderEXT의 CreateInfo에 포함되지만, 파이프라인을 사용할 경우 파이프라인 레이아웃에 지정해야 합니다. -## Pipeline State +## 파이프라인 상태 -Most dynamic state with Shader Objects is static with pipelines: specified at pipeline creation time. Pipelines also require additional parameters, like attachment formats and sample count: these will be considered constant and stored in the builder later. Expose a subset of dynamic states through a struct: +셰이더 오브젝트는 대부분의 동적 상태를 런타임에 설정할 수 있었지만, 파이프라인에서는 파이프라인 생성 시점에 고정되기 때문에 정적입니다. 파이프라인은 또한 어태치먼트 포맷과 샘플 수 같은 추가 파라미터를 요구합니다. 이러한 값들은 상수로 간주되어 이후의 추상화 클래스에 담길 것입니다. 동적 상태의 일부를 구조체를 통해 나타냅시다. ```cpp // bit flags for various binary Pipeline States. @@ -38,7 +38,7 @@ struct PipelineState { }; ``` -Encapsulate building pipelines into a class: +파이프라인을 구성하는 과정을 클래스로 캡슐화합시다. ```cpp struct PipelineBuilderCreateInfo { @@ -64,7 +64,7 @@ class PipelineBuilder { }; ``` -The implementation is quite verbose, splitting it into multiple functions helps a bit: +구현은 다소 길어질 수 있으니, 여러 함수로 나누어 작성하는 것이 좋습니다. ```cpp // single viewport and scissor. @@ -192,6 +192,7 @@ auto PipelineBuilder::build(vk::PipelineLayout const layout, ``` `App` will need to store a builder, a Pipeline Layout, and the Pipeline(s): +`App`은 빌더, 파이프라인 레이아웃, 그리고 파이프라인을 담아야 합니다. ```cpp std::optional m_pipeline_builder{}; @@ -236,7 +237,7 @@ void create_pipeline() { } ``` -Finally, `App::draw()`: +마지막으로 `App::draw()`를 구현합니다. ```cpp void draw(vk::CommandBuffer const command_buffer) const { diff --git a/guide/translations/ko-KR/src/shader_objects/shader_program.md b/guide/translations/ko-KR/src/shader_objects/shader_program.md index fa99475..8b9ebfb 100644 --- a/guide/translations/ko-KR/src/shader_objects/shader_program.md +++ b/guide/translations/ko-KR/src/shader_objects/shader_program.md @@ -1,6 +1,6 @@ -# Shader Program +# 셰이더 프로그램 -To use Shader Objects we need to enable the corresponding feature and extension during device creation: +셰이더 오브젝트를 사용하려면 디바이스 생성 시 대응되는 기능과 확장을 활성화해야 합니다. ```cpp auto shader_object_feature = @@ -15,9 +15,10 @@ static constexpr auto extensions_v = std::array{ }; ``` -## Emulation Layer +## 에뮬레이션 레이어 + +현재 사용중인 드라이버나 물리 디바이스가 `VK_EXT_shader_object`를 지원하지 않을 수 있기 때문에(특히 인텔에서 자주 발생합니다) 디바이스 생성이 실패할 수 있습니다. Vulkan SDK는 이 확장을 구현하는 레이어 [`VK_LAYER_KHRONOS_shader_object`](https://github.com/KhronosGroup/Vulkan-ExtensionLayer/blob/main/docs/shader_object_layer.md)를 제공합니다. 이 레이어를 InstanceCreateInfo에 추가하면 해당 기능을 사용할 수 있습니다. -It's possible device creation now fails because the driver or physical device does not support `VK_EXT_shader_object` (especially likely with Intel). Vulkan SDK provides a layer that implements this extension: [`VK_LAYER_KHRONOS_shader_object`](https://github.com/KhronosGroup/Vulkan-ExtensionLayer/blob/main/docs/shader_object_layer.md). Adding this layer to the Instance Create Info should unblock usage of this feature: ```cpp // ... @@ -32,10 +33,10 @@ m_instance = vk::createInstanceUnique(instance_ci); ```

-This layer is not part of standard Vulkan driver installs, you must package the layer with the application for it to run on environments without Vulkan SDK / Vulkan Configurator. Read more here. +이 레이어는 표준 Vulkan 드라이버 설치에 포함되어 있지 않기 때문에, Vulkan SDK나 Vulkan Configurator가 없는 환경에서도 실행할 수 있도록 애플리케이션과 함께 패키징해야 합니다. 자세한 내용은여기를 참고하세요.
-Since desired layers may not be available, we can set up a defensive check: +원하는 레이어가 사용 불가능할 수 있으므로, 이를 확인하는 코드를 추가하는 것이 좋습니다. ```cpp [[nodiscard]] auto get_layers(std::span desired) @@ -64,9 +65,9 @@ instance_ci.setPEnabledLayerNames(layers); ## `class ShaderProgram` -We will encapsulate both vertex and fragment shaders into a single `ShaderProgram`, which will also bind the shaders before a draw, and expose/set various dynamic states. +정점 셰이더와 프래그먼트 셰이더를 하나의 `ShaderProgram`으로 캡슐화하여, 그리기 전에 셰이더를 바인딩하고 다양한 동적 상태를 설정할 수 있도록 하겠습니다. -In `shader_program.hpp`, first add a `ShaderProgramCreateInfo` struct: +`shader_program.hpp`에서 가장 먼저 `ShaderProgramCreateInfo` 구조체를 추가합니다. ```cpp struct ShaderProgramCreateInfo { @@ -77,9 +78,9 @@ struct ShaderProgramCreateInfo { }; ``` -> Descriptor Sets and their Layouts will be covered later. +> 디스크립터 셋과 레이아웃은 이후에 다루겠습니다. -Start with a skeleton definition: +간단한 형태의 정의부터 시작합니다. ```cpp class ShaderProgram { @@ -95,7 +96,7 @@ class ShaderProgram { }; ``` -The definition of the constructor is fairly straightforward: +생성자의 정의는 꽤 단순합니다. ```cpp ShaderProgram::ShaderProgram(CreateInfo const& create_info) { @@ -129,7 +130,7 @@ ShaderProgram::ShaderProgram(CreateInfo const& create_info) { } ``` -Expose some dynamic states via public members: +몇 가지 동적 상태를 public 멤버를 통해 나타냅니다. ```cpp static constexpr auto color_blend_equation_v = [] { @@ -150,7 +151,7 @@ vk::ColorBlendEquationEXT color_blend_equation{color_blend_equation_v}; vk::CompareOp depth_compare_op{vk::CompareOp::eLessOrEqual}; ``` -Encapsulate booleans into bit flags: +불 값을 비트 플래그로 캡슐화합니다. ```cpp // bit flags for various binary states. @@ -167,7 +168,7 @@ static constexpr auto flags_v = AlphaBlend | DepthTest; std::uint8_t flags{flags_v}; ``` -There is one more piece of pipeline state needed: vertex input. We will consider this to be constant per shader and store it in the constructor: +파이프라인 상태에 필요한 요소가 하나 남아있습니다. 정점 입력입니다. 이는 셰이더마다 고정된 값이 될 것이므로 생성자에 저장할 것입니다. ```cpp // shader_program.hpp @@ -198,14 +199,14 @@ ShaderProgram::ShaderProgram(CreateInfo const& create_info) } ``` -The API to bind will take the command buffer and the framebuffer size (to set the viewport and scissor): +바인딩할 API는 Viewport와 Scissor 설정을 위해 커맨드 버퍼와 프레임 버퍼 크기를 받습니다 ```cpp void bind(vk::CommandBuffer command_buffer, glm::ivec2 framebuffer_size) const; ``` -Add helper member functions and implement `bind()` by calling them in succession: +멤버 함수를 추가하고 순차적으로 이를 호출하여 `bind()`를 구현합니다. ```cpp static void set_viewport_scissor(vk::CommandBuffer command_buffer, @@ -228,7 +229,7 @@ void ShaderProgram::bind(vk::CommandBuffer const command_buffer, } ``` -Implementations are long but straightforward: +구현은 길지만 꽤 단순합니다. ```cpp namespace { From 71bf89752646047b2c379bb8f02d7f95bea82129 Mon Sep 17 00:00:00 2001 From: CDDing Date: Wed, 30 Apr 2025 21:41:03 +0900 Subject: [PATCH 6/9] ko-translate memory --- guide/translations/ko-KR/src/memory/README.md | 6 +++--- .../translations/ko-KR/src/memory/buffers.md | 6 +++--- .../ko-KR/src/memory/command_block.md | 18 ++++++++--------- .../ko-KR/src/memory/device_buffers.md | 12 +++++------ guide/translations/ko-KR/src/memory/images.md | 20 +++++++++---------- .../ko-KR/src/memory/vertex_buffer.md | 18 ++++++++--------- guide/translations/ko-KR/src/memory/vma.md | 6 +++--- 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/guide/translations/ko-KR/src/memory/README.md b/guide/translations/ko-KR/src/memory/README.md index b58383a..bb442d5 100644 --- a/guide/translations/ko-KR/src/memory/README.md +++ b/guide/translations/ko-KR/src/memory/README.md @@ -1,5 +1,5 @@ -# Memory Allocation +# 메모리 할당 -Being an explicit API, [allocating memory](https://docs.vulkan.org/guide/latest/memory_allocation.html) in Vulkan that can be used by the device is the application's responsibility. The specifics can get quite complicated, but as recommended by the spec, we shall simply defer all that to a library: [Vulkan Memory Allocator (VMA)](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator). +명시적인 API인 Vulkan에서는 디바이스가 사용할 메모리를 애플리케이션이 직접 [메모리 할당](https://docs.vulkan.org/guide/latest/memory_allocation.html)을 해야 합니다. 이 과정은 다소 복잡할 수 있기 때문에, Vulkan 사양에서 권장하듯이 이 모든 세부 사항을 [Vulkan Memory Allocator (VMA)](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)에 맡겨 간단하게 처리할 것입니다. -Vulkan exposes two kinds of objects that use such allocated memory: Buffers and Images, VMA offers transparent support for both: we just have to allocate/free buffers and images through VMA instead of the device directly. Unlike memory allocation / object construction on the CPU, there are many more parameters (than say alignment and size) to provide for the creation of buffers and images. As you might have guessed, we shall constrain ourselves to a subset that's relevant for shader resources: vertex buffers, uniform/storage buffers, and texture images. +Vulkan은 할당된 메모리를 사용하는 두 가지 객체 유형을 제공합니다. 버퍼와 이미지입니다. VMA는 이 둘에 대해 투명한(transparent) 지원을 제공합니다. 우리는 그저 버퍼와 이미지를 디바이스를 통해 직접 할당하는 대신, VMA를 통해 할당 및 해제하면 됩니다. CPU에서의 메모리 할당과 객체 생성과는 달리, Vulkan에는 버퍼와 이미지 생성에는 정렬(alignment)이나 크기(size) 외에도 훨씬 더 많은 파라미터가 필요합니다. 예상하셨겠지만, 여기서는 정점 버퍼, 유니폼/스토리지 버퍼, 그리고 텍스쳐 이미지와 같은 셰이더 자원과 관련된 하위 집합만을 다룰 예정입니다. diff --git a/guide/translations/ko-KR/src/memory/buffers.md b/guide/translations/ko-KR/src/memory/buffers.md index 4c74806..d43fbc2 100644 --- a/guide/translations/ko-KR/src/memory/buffers.md +++ b/guide/translations/ko-KR/src/memory/buffers.md @@ -1,6 +1,6 @@ -# Buffers +# 버퍼 -First add the RAII wrapper components for VMA buffers: +먼저 VMA 버퍼를 위한 RAII 래퍼 컴포넌트를 추가합니다. ```cpp struct RawBuffer { @@ -28,7 +28,7 @@ void BufferDeleter::operator()(RawBuffer const& raw_buffer) const noexcept { } ``` -Buffers can be backed by host (RAM) or device (VRAM) memory: the former is mappable and thus useful for data that changes every frame, latter is faster to access for the GPU but needs more complex methods to copy data to. Add the related types and a create function: +버퍼는 호스트(RAM)와 디바이스(VRAM) 메모리를 기반으로 할당될 수 있습니다. 호스트 메모리는 매핑이 가능하므로 매 프레임마다 바뀌는 정보를 담기에 적합하며, 디바이스 메모리는 GPU에서 접근하기에 빠르지만 데이터를 복사하는 데 더 복잡한 절차가 필요합니다. 이를 고려하여 관련된 타입과 생성 함수를 추가하겠습니다. ```cpp struct BufferCreateInfo { diff --git a/guide/translations/ko-KR/src/memory/command_block.md b/guide/translations/ko-KR/src/memory/command_block.md index 6f5812b..6ed20ab 100644 --- a/guide/translations/ko-KR/src/memory/command_block.md +++ b/guide/translations/ko-KR/src/memory/command_block.md @@ -1,11 +1,11 @@ # Command Block -Long-lived vertex buffers perform better when backed by Device memory, especially for 3D meshes. Data is transferred to device buffers in two steps: +오래 유지되는 정점 버퍼의 경우 디바이스 메모리에 위치하는 편이 더 나은 성능을 보입니다. 특히 3D 메시와 같은 경우에 그렇습니다. 데이터를 디바이스 버퍼로 전송하려면 두 단계가 필요합니다. -1. Allocate a host buffer and copy the data to its mapped memory -1. Allocate a device buffer, record a Buffer Copy operation and submit it +1. 호스트 버퍼를 할당하고 데이터를 매핑된 메모리로 복사합니다. +2. 디바이스 버퍼를 할당하고 메모리 복사 명령을 기록한 뒤, 이를 제출합니다. -The second step requires a command buffer and queue submission (_and_ waiting for the submitted work to complete). Encapsulate this behavior into a class, it will also be used for creating images: +두 번째 단계는 커맨드 버퍼와 큐 제출이 필요하며, 제출된 작업이 완료될 때까지 기다려야 합니다. 이 동작을 클래스로 캡슐화하겠습니다. 이 구조는 이미지를 생성할때에도 쓰일 수 있습니다. ```cpp class CommandBlock { @@ -26,7 +26,7 @@ class CommandBlock { }; ``` -The constructor takes an existing command pool created for such ad-hoc allocations, and the queue for submission later. This way it can be passed around after creation and used by other code. +이 클래스의 생성자는 임시 할당용으로 미리 생성된 커맨드 풀과, 나중에 명령을 제출할 큐를 인자로 받습니다. 이렇게 하면 해당 객체를 생성 후 다른 코드로 전달해 재사용할 수 있습니다. ```cpp CommandBlock::CommandBlock(vk::Device const device, vk::Queue const queue, @@ -50,7 +50,7 @@ CommandBlock::CommandBlock(vk::Device const device, vk::Queue const queue, } ``` -`submit_and_wait()` resets the unique command buffer at the end, to free it from its command pool: +`submit_and_wait()`은 커맨드 버퍼의 작업이 끝난 뒤 리셋하여 커맨드 풀로 반환합니다. ```cpp void CommandBlock::submit_and_wait() { @@ -77,8 +77,8 @@ void CommandBlock::submit_and_wait() { } ``` -## Multithreading considerations +## 멀티쓰레딩 시 고려사항 -Instead of blocking the main thread on every Command Block's `submit_and_wait()`, you might be wondering if command block usage could be multithreaded. The answer is yes! But with some extra work: each thread will require its own command pool - just using one owned (unique) pool per Command Block (with no need to free the buffer) is a good starting point. All queue operations need to be synchronized, ie a critical section protected by a mutex. This includes Swapchain acquire/present calls, and Queue submissions. A `class Queue` value type that stores a copy of the `vk::Queue` and a pointer/reference to its `std::mutex` - and wraps the submit call - can be passed to command blocks. Just this much will enable asynchronous asset loading etc, as each loading thread will use its own command pool, and queue submissions all around will be critical sections. `VmaAllocator` is internally synchronized (can be disabled at build time), so performing allocations through the same allocator on multiple threads is safe. +"`submit_and_wait()`를 호출할 때마다 메인 쓰레드를 블록하는 대신, 멀티쓰레드로 CommandBlock을 구현하는 편이 낫지 않을까?" 라고 생각하실 수 있습니다. 맞습니다! 하지만 멀티 쓰레딩을 위해서는 몇 가지 추가 작업이 필요합니다. 각 쓰레드가 고유한 커맨드 풀이 필요합니다. CommandBlock마다 하나의 고유한 커맨드 풀을 사용하며, 임계 영역을 뮤텍스로 보호하는 것, 스왑체인으로부터 이미지를 가져오고 표시하는 작업 등 큐에 대한 모든 작업은 동기화되어야 합니다. 이를 위해 `vk::Queue`객체와 해당 큐를 보호하는 `std::mutex` 포인터 혹은 참조를 보관하는 `class Queue`를 설계할 수 있으며, 큐 제출은 이 클래스를 통해 수행할 것입니다. 이렇게 하면 각 에셋을 불러오는 쓰레드가 고유한 커맨드 풀을 사용하면서도 큐 제출은 안전하게 이루어질 수 있습니다. `VmaAllocator`는 내부적으로 동기화되어 있으며, 빌드 시 동기화를 끌 수도 있지만 기본적으로는 멀티쓰레드 환경에서 안전하게 사용할 수 있습니다. -For multi-threaded rendering, use a Secondary command buffer per thread to record rendering commands, accumulate and execute them in the main (Primary) command buffer currently in `RenderSync`. This is not particularly helpful unless you have thousands of expensive draw calls and dozens of render passes, as recording even a hundred draws will likely be faster on a single thread. +멀티쓰레드 렌더링을 구현하려면 각 쓰레드에서 Secondary 커맨드 버퍼에 렌더링 명령을 기록한 후, 이를 Primary 커맨드 버퍼로 모아 `RenderSync`에서 실행할 수 있습니다. 다만 수백개의 드로우콜 정도는 하나의 쓰레드에서 처리하는 편이 더 빠르기 때문에, 수천개의 비싼 드로우콜과 수십개의 렌더패스를 사용하지 않는 한 사용할 일이 없습니다. diff --git a/guide/translations/ko-KR/src/memory/device_buffers.md b/guide/translations/ko-KR/src/memory/device_buffers.md index 804c704..5f3a49f 100644 --- a/guide/translations/ko-KR/src/memory/device_buffers.md +++ b/guide/translations/ko-KR/src/memory/device_buffers.md @@ -1,6 +1,6 @@ -# Device Buffers +# 디바이스 버퍼 -This guide will only use device buffers for vertex buffers, where both vertex and index data will be strung together in a single VBO. The create function can thus take the data and perform the buffer copy operation before returning. In essence this return value is a "GPU const" buffer. To enable utilizing separate spans for vertices and indices (instead of forcing allocation of a contiguous bytestream and copying the data), the create function takes a slightly awkward span of spans: +여기서는 정점 버퍼에 디바이스 버퍼만을 사용합니다. 정점과 인덱스 정보를 하나의 VBO로 묶어 사용할 것입니다. 따라서 생성 함수는 데이터를 받아 버퍼 복사를 수행한 후 반환합니다. 기본적으로 반환값은 "GPU 상수" 버퍼일 것입니다. 정점과 인덱스 데이터를 하나의 연속된 바이트로 강제로 묶는 대신, 각 데이터를 별도의 범위로 사용할 수 있도록 생성 함수는 span을 인자로 받습니다. ```cpp // disparate byte spans. @@ -12,7 +12,7 @@ using ByteSpans = std::span const>; ByteSpans const& byte_spans) -> Buffer; ``` -Implement `create_device_buffer()`: +`create_device_buffer()`는 다음과 같습니다. ```cpp auto vma::create_device_buffer(BufferCreateInfo const& create_info, @@ -62,7 +62,7 @@ auto vma::create_device_buffer(BufferCreateInfo const& create_info, } ``` -Add a command block pool to `App`, and a helper function to create command blocks: +`App`에 command block pool을 추가하고 commandblock을 생성하는 함수를 추가합니다. ```cpp void App::create_cmd_block_pool() { @@ -80,7 +80,7 @@ auto App::create_command_block() const -> CommandBlock { } ``` -Update `create_vertex_buffer()` to create a quad with indices: +`create_vertex_buffer()`를 업데이트하여 사각형을 생성하도록 합니다. ```cpp template @@ -115,7 +115,7 @@ void App::create_vertex_buffer() { } ``` -Update `draw()`: +`draw()`함수를 이에 맞춰 변경합니다. ```cpp void App::draw(vk::CommandBuffer const command_buffer) const { diff --git a/guide/translations/ko-KR/src/memory/images.md b/guide/translations/ko-KR/src/memory/images.md index 583957c..f6b53a5 100644 --- a/guide/translations/ko-KR/src/memory/images.md +++ b/guide/translations/ko-KR/src/memory/images.md @@ -1,6 +1,6 @@ -# Images +# 이미지 -Images have a lot more properties and creation parameters than buffers. We shall constrain ourselves to just two kinds: sampled images (textures) for shaders, and depth images for rendering. For now add the foundation types and functions: +이미지는 버퍼보다 훨씬 더 많은 속성과 생성 파라미터를 가지고 있습니다. 여기서는 두 종류로 나누겠습니다. 셰이더에서 샘플링될 이미지(텍스쳐), 그리고 렌더링에 사용할 깊이 이미지입니다. 지금은 이러한 이미지를 위한 기본 타입과 함수만 추가하겠습니다. ```cpp struct RawImage { @@ -31,7 +31,7 @@ struct ImageCreateInfo { -> Image; ``` -Implementation: +구현은 다음과 같습니다. ```cpp void ImageDeleter::operator()(RawImage const& raw_image) const noexcept { @@ -82,7 +82,7 @@ auto vma::create_image(ImageCreateInfo const& create_info, } ``` -For creating sampled images, we need both the image bytes and size (extent). Wrap that into a struct: +샘플링할 이미지(텍스쳐)를 생성하기 위해 이미지 바이트 데이터와 크기(extent)가 필요합니다. 이를 구조체로 감싸 사용하겠습니다. ```cpp struct Bitmap { @@ -91,12 +91,12 @@ struct Bitmap { }; ``` -The creation process is similar to device buffers: requiring a staging copy, but it also needs layout transitions. In short: +생성 과정은 디바이스 버퍼와 유사합니다. 스테이징 버퍼를 복사하고, 레이아웃 전환을 수행해야 합니다. 요약하면 다음과 같습니다. -1. Create the image and staging buffer -1. Transition the layout from Undefined to TransferDst -1. Record a buffer image copy operation -1. Transition the layout from TransferDst to ShaderReadOnlyOptimal +1. 이미지와 스테이징 버퍼를 생성합니다. +2. 이미지의 레이아웃을 Undefined에서 TransferDst로 전환합니다. +3. 버퍼에서 이미지로 복사하는 명령을 기록합니다. +4. 이미지의 레이아웃을 TransferDst에서 ShaderReadOnlyOptimal로 변경합니다. ```cpp auto vma::create_sampled_image(ImageCreateInfo const& create_info, @@ -181,4 +181,4 @@ auto vma::create_sampled_image(ImageCreateInfo const& create_info, } ``` -Before such images can be used as textures, we need to set up Descriptor Set infrastructure. +이미지를 텍스쳐로 사용하기 전에 디스크립터 셋을 구성해야 합니다. diff --git a/guide/translations/ko-KR/src/memory/vertex_buffer.md b/guide/translations/ko-KR/src/memory/vertex_buffer.md index 75e04d3..35a60c4 100644 --- a/guide/translations/ko-KR/src/memory/vertex_buffer.md +++ b/guide/translations/ko-KR/src/memory/vertex_buffer.md @@ -1,8 +1,8 @@ -# Vertex Buffer +# 정점 버퍼 -The goal here is to move the hard-coded vertices in the shader to application code. For the time being we will use an ad-hoc Host `vma::Buffer` and focus more on the rest of the infrastructure like vertex attributes. +여기서의 목표는 셰이더에 하드코딩되어 있던 정점 정보를 애플리케이션 코드로 옮기는 것입니다. 당분간은 임시로 호스트 메모리에 위치한 `vma::Buffer`를 사용하고, 정점 속성과 같은 나머지 구조에 더 집중하겠습니다. -First add a new header, `vertex.hpp`: +먼저 새로운 헤더 `vertex.hpp`를 추가합니다. ```cpp struct Vertex { @@ -28,7 +28,7 @@ constexpr auto vertex_bindings_v = std::array{ }; ``` -Add the vertex attributes and bindings to the Shader Create Info: +ShaderCreateInfo에 정점 속성과 바인딩 정보를 추가합니다. ```cpp // ... @@ -46,7 +46,7 @@ auto const shader_ci = ShaderProgram::CreateInfo{ // ... ``` -With the vertex input defined, we can update the vertex shader and recompile it: +정점 입력이 정의되었으므로 정점 셰이더를 업데이트하고 다시 컴파일합니다. ```glsl #version 450 core @@ -64,7 +64,7 @@ void main() { } ``` -Add a VBO (Vertex Buffer Object) member and create it: +VBO(Vertex Buffer Object) 멤버를 추가하고, 해당 버퍼를 생성합니다. ```cpp void App::create_vertex_buffer() { @@ -89,7 +89,7 @@ void App::create_vertex_buffer() { } ``` -Bind the VBO before recording the draw call: +드로우 콜을 기록하기 전에 VBO를 바인딩합니다. ```cpp // single VBO at binding 0 at no offset. @@ -99,6 +99,6 @@ command_buffer.bindVertexBuffers(0, m_vbo->get_raw().buffer, command_buffer.draw(3, 1, 0, 0); ``` -You should see the same triangle as before. But now we can use whatever set of vertices we like! The Primitive Topology is Triange List by default, so every three vertices in the array is drawn as a triangle, eg for 9 vertices: `[[0, 1, 2], [3, 4, 5], [6, 7, 8]]`, where each inner `[]` represents a triangle comprised of the vertices at those indices. Try playing around with customized vertices and topologies, use Render Doc to debug unexpected outputs / bugs. +아마 이전과 동일한 삼각형을 볼 수 있을 것입니다. 하지만 이제는 원하는 정점 데이터를 자유롭게 사용할 수 있습니다. 프리미티브 토폴로지는 기본적으로 Triangle List로 설정하며, 정점 배열에서 매 3개의 정점이 삼각형으로 그려질 것입니다. 예를 들어 정점 9개가 `[[0, 1, 2], [3, 4, 5], [6, 7, 8]]` 있다면, 각 3개의 정점이 하나의 삼각형을 형성하게 됩니다. 정점 데이터와 토폴로지를 다양하게 바꿔보며 실험해 보세요. 예상치 못한 출력이나 버그가 발생한다면 RenderDoc을 사용해 디버깅할 수 있습니다. -Host Vertex Buffers are useful for primitives that are temporary and/or frequently changing, such as UI objects. A 2D framework can use such VBOs exclusively: a simple approach would be a pool of buffers per virtual frame where for each draw a buffer is obtained from the current virtual frame's pool and vertices are copied in. +호스트 정점 버퍼는 UI 객체처럼 임시로 쓰이거나 자주 변경되는 프리미티브에 유용합니다. 2D 프레임워크에서는 이러한 VBO를 독점적으로 사용하는 것도 가능합니다. 예를 들어, 가상 프레임마다 별도의 버퍼 풀을 두고, 각 드로우마다 현재 프레임의 풀에서 버퍼를 하나 가져와 정점을 복사하는 방식이 단순하면서도 효과적입니다. diff --git a/guide/translations/ko-KR/src/memory/vma.md b/guide/translations/ko-KR/src/memory/vma.md index 25e90c7..ef70520 100644 --- a/guide/translations/ko-KR/src/memory/vma.md +++ b/guide/translations/ko-KR/src/memory/vma.md @@ -1,6 +1,6 @@ # Vulkan Memory Allocator -VMA has full CMake support, but it is also a single-header library that requires users to "instantiate" it in a single translation unit. Isolating that into a wrapper library to minimize warning pollution etc, we create our own `vma::vma` target that compiles this source file: +VMA는 CMake를 완벽히 지원하지만, 단일 번역 단위에서 정의(instantiate)되어야 하는 단일 헤더 라이브러리이기도 합니다. 이를 관리하기 위해 고유한 `vma::vma` 타겟을 직접 생성하여 소스 파일을 컴파일하겠습니다. ```cpp // vk_mem_alloc.cpp @@ -9,7 +9,7 @@ VMA has full CMake support, but it is also a single-header library that requires #include ``` -Unlike VulkanHPP, VMA's interface is C only, thus we shall use our `Scoped` class template to wrap objects in RAII types. The first thing we need is a `VmaAllocator`, which is similar to a `vk::Device` or `GLFWwindow*`: +VulkanHPP와는 달리 VMA는 C만을 지원합니다. 따라서 RAII 방식으로 관리하기 위해 `Scope`클래스 템플릿을 사용할 것입니다. 가장 먼저 필요한 것은 `VmaAllocator`으로, 이는 `vk::Device` 혹은 `GLFWwindow*`와 유사한 역할을 합니다. ```cpp // vma.hpp @@ -53,7 +53,7 @@ auto vma::create_allocator(vk::Instance const instance, } ``` -`App` stores and creates a `vma::Allocator` object: +`App`은 `vma::Allocator` 객체를 생성하고 이를 보관합니다. ```cpp // ... From 0a8fcaec9ecba6c32c63af1e12cc04f82be7e2ae Mon Sep 17 00:00:00 2001 From: CDDing Date: Thu, 1 May 2025 19:31:56 +0900 Subject: [PATCH 7/9] ko-translate descriptorSets --- .../ko-KR/src/descriptor_sets/README.md | 6 +- .../src/descriptor_sets/descriptor_buffer.md | 18 +++--- .../descriptor_sets/instanced_rendering.md | 30 +++++----- .../src/descriptor_sets/pipeline_layout.md | 12 ++-- .../ko-KR/src/descriptor_sets/texture.md | 57 ++++++++++--------- .../ko-KR/src/descriptor_sets/view_matrix.md | 10 ++-- 6 files changed, 67 insertions(+), 66 deletions(-) diff --git a/guide/translations/ko-KR/src/descriptor_sets/README.md b/guide/translations/ko-KR/src/descriptor_sets/README.md index ecdea30..d38a34b 100644 --- a/guide/translations/ko-KR/src/descriptor_sets/README.md +++ b/guide/translations/ko-KR/src/descriptor_sets/README.md @@ -1,5 +1,5 @@ -# Descriptor Sets +# 디스크립터 셋 -[Vulkan Descriptor](https://docs.vulkan.org/guide/latest/mapping_data_to_shaders.html#descriptors)s are essentially typed pointers to resources that shaders can use, eg uniform/storage buffers or combined image samplers (textures with samplers). A Descriptor Set is a collection of descriptors at various **bindings** that is bound together as an atomic unit. Shaders can declare input based on these set and binding numbers, and any sets the shader uses must have been updated and bound before drawing. A Descriptor Set Layout is a description of a collection of descriptor sets associated with a particular set number, usually describing all the sets in a shader. Descriptor sets are allocated using a Descriptor Pool and the desired set layout(s). +[Vulkan 디스크립터](https://docs.vulkan.org/guide/latest/mapping_data_to_shaders.html#descriptors)는 기본적으로 셰이더가 접근할 수 있는 자원(예 : 유니폼 버퍼, 스토리지 버퍼, 샘플러가 결합된 텍스쳐 등)에 대한 타입이 지정된 포인터입니다. 디스크립터 셋은 이러한 디스크립터들을 다양한 **바인딩**에 모아 하나의 단위로 결합한 집합이며, 셰이더는 특정 셋 번호와 바인딩 번호를 기준으로 입력을 선언합니다. 셰이더에서 사용하는 모든 디스크립터 셋은 드로우 콜 전에 반드시 업데이트, 바인딩되어야 합니다. 디스크립터 셋 레이아웃은 특정 셋 번호에 해당하는 디스크립터 셋의 구성 방식을 나타내며, 일반적으로 셰이더에서 사용하는 모든 디스크립터 셋을 나타냅니다. 디스크립터 셋은 디스크립터 풀과 원하는 디스크립터 셋 레이아웃을 이용해 할당됩니다. -Structuring set layouts and managing descriptor sets are complex topics with many viable approaches, each with their pros and cons. Some robust ones are described in this [page](https://docs.vulkan.org/samples/latest/samples/performance/descriptor_management/README.html). 2D frameworks - and even simple/basic 3D ones - can simply allocate and update sets every frame, as described in the docs as the "simplest approach". Here's an [extremely detailed](https://zeux.io/2020/02/27/writing-an-efficient-vulkan-renderer/) - albeit a bit dated now - post by Arseny on the subject. A more modern approach, namely "bindless" or Descriptor Indexing, is described in the official docs [here](https://docs.vulkan.org/samples/latest/samples/extensions/descriptor_indexing/README.html). +디스크립터 셋 레이아웃을 구성하고 디스크립터 셋을 관리하는 것은 다양한 접근 방법이 가능하며, 각각 장단점이 있어 꽤 복잡한 주제입니다. [이 페이지](https://docs.vulkan.org/samples/latest/samples/performance/descriptor_management/README.html)에서는 그중에서도 신뢰할 수 있는 몇 가지 방법들을 설명합니다. 2D 프레임워크와 간단한 3D 프레임워크의 경우 문서에서 가장 단순한 접근 방식이라 설명하는 것처럼, 디스크립터 셋을 매 프레임마다 할당하고 업데이트하는 방식으로 처리할 수 있습니다. [이 글은](https://zeux.io/2020/02/27/writing-an-efficient-vulkan-renderer/) 매우 상세하지만 현재는 다소 오래된 자료입니다. 더 현대적인 접근법으로는 바인드리스 혹은 디스크립터 인덱싱이라 불리는 방식이 있으며,이에 대해서는 [공식 문서](https://docs.vulkan.org/samples/latest/samples/extensions/descriptor_indexing/README.html)에서 다루고 있습니다. diff --git a/guide/translations/ko-KR/src/descriptor_sets/descriptor_buffer.md b/guide/translations/ko-KR/src/descriptor_sets/descriptor_buffer.md index a581a0f..e4a48b7 100644 --- a/guide/translations/ko-KR/src/descriptor_sets/descriptor_buffer.md +++ b/guide/translations/ko-KR/src/descriptor_sets/descriptor_buffer.md @@ -1,6 +1,6 @@ -# Descriptor Buffer +# 디스크립터 버퍼 -Uniform and Storage buffers need to be N-buffered unless they are "GPU const", ie contents do not change after creation. Encapsulate a `vma::Buffer` per virtual frame in a `DescriptorBuffer`: +유니폼과 스토리지 버퍼는 생성 이후 내용이 변경되지 않는 GPU 상수가 아닌 이상, N-버퍼링 되어야 합니다. 각 가상 프레임마다의 하나의 `vma::Buffer`를 `DescriptorBuffer`로 캡슐화하겠습니다. ```cpp class DescriptorBuffer { @@ -29,7 +29,7 @@ class DescriptorBuffer { }; ``` -The implementation is fairly straightforward, it reuses existing buffers if they are large enough, else recreates them before copying data. It also ensures buffers are always valid to be bound to descriptors. +구현은 꽤 단순합니다. 기존의 버퍼로 충분하다면 재사용하고, 아니라면 데이터를 복사하기 전에 새로 생성합니다. 이렇게 하면 디스크립터 셋에 바인딩할 버퍼가 항상 유효한 상태임을 보장합니다. ```cpp DescriptorBuffer::DescriptorBuffer(VmaAllocator allocator, @@ -73,7 +73,7 @@ void DescriptorBuffer::write_to(Buffer& out, } ``` -Store a `DescriptorBuffer` in `App` and rename `create_vertex_buffer()` to `create_shader_resources()`: +`App`에 `DescriptorBuffer`를 저장하고 `create_vertex_buffer()`함수의 이름을 `create_shader_resources()`로 변경합니다. ```cpp std::optional m_view_ubo{}; @@ -86,7 +86,7 @@ m_view_ubo.emplace(m_allocator.get(), m_gpu.queue_family, vk::BufferUsageFlagBits::eUniformBuffer); ``` -Add functions to update the view/projection matrices and bind the frame's descriptor sets: +뷰/프로젝션 행렬을 업데이트하고 프레임별 디스크립터 셋을 바인딩하는 함수를 추가합니다. ```cpp void App::update_view() { @@ -120,7 +120,7 @@ void App::bind_descriptor_sets(vk::CommandBuffer const command_buffer) const { } ``` -Add the descriptor set layouts to the Shader, call `update_view()` before `draw()`, and `bind_descriptor_sets()` in `draw()`: +셰이더에 디스크립터 셋 레이아웃을 추가하고, `draw()` 호출 전에 `update_view()`를 호출하며, `draw()` 내부에서 `bind_descriptor_sets()`를 호출합니다. ```cpp auto const shader_ci = ShaderProgram::CreateInfo{ @@ -142,7 +142,7 @@ bind_descriptor_sets(command_buffer); // ... ``` -Update the vertex shader to use the view UBO: +정점 셰이더를 이에 맞춰 변경해줍니다. ```glsl layout (set = 0, binding = 0) uniform View { @@ -158,7 +158,7 @@ void main() { } ``` -Since the projected space is now the framebuffer size instead of [-1, 1], update the vertex positions to be larger than 1 pixel: +투영 공간이 이제 [ -1, 1] 범위가 아닌 프레임버퍼 크기를 기준으로 하기 때문에 정점 위치를 1픽셀보다 크게 위치하도록 업데이트합니다. ```cpp static constexpr auto vertices_v = std::array{ @@ -171,4 +171,4 @@ static constexpr auto vertices_v = std::array{ ![View UBO](./view_ubo.png) -When such descriptor buffers are created and destroyed dynamically, they would need to store a `ScopedWaiter` to ensure all rendering with descriptor sets bound to them completes before destruction. Alternatively, the app can maintain a pool of scratch buffers (similar to small/dynamic vertex buffers) per virtual frame which get destroyed in a batch instead of individually. +이러한 디스크립터 버퍼가 동적으로 생성되고 파괴될 때, 관련 디스크립터 셋을 사용하는 렌더링이 모두 완료된 후에 파괴되도록 `ScopedWaiter`를 사용해 보장합니다. 또는, 프레임마다 임시 버퍼 풀을 유지하여(작거나 동적인 정점 버퍼와 유사하게) 버퍼를 개별이 아닌 일괄적으로 파괴하는 방식도 사용할 수 있습니다. diff --git a/guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.md b/guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.md index 3fed899..68406af 100644 --- a/guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.md +++ b/guide/translations/ko-KR/src/descriptor_sets/instanced_rendering.md @@ -1,15 +1,15 @@ -# Instanced Rendering +# 인스턴스 렌더링 -When multiple copies of a drawable object are desired, one option is to use instanced rendering. The basic idea is to store per-instance data in a uniform/storage buffer and index into it in the vertex shader. We shall represent one model matrix per instance, feel free to add more data like an overall tint (color) that gets multiplied to the existing output color in the fragment shader. This will be bound to a Storage Buffer (SSBO), which can be "unbounded" in the shader (size is determined during invocation). +하나의 객체를 여러 번 그려야 할 때 사용할 수 있는 방법 중 하나는 인스턴스 렌더링입니다. 기본 아이디어는 인스턴스별 데이터를 유니폼 버퍼 또는 스토리지 버퍼에 담고, 이를 정점 셰이더에서 참조하는 것입니다. 우리는 인스턴스마다 하나의 모델 행렬을 표현하겠습니다. 필요하다면 색상과 같은 정보를 포함해 프래그먼트 셰이더에서 기존 출력 색상에 곱하는 방식으로 사용할 수도 있습니다. 이러한 데이터는 스토리지 버퍼(SSBO)에 바인딩되며, 버퍼의 크기는 호출 시점에 결정됩니다. -Store the SSBO and a buffer for instance matrices: +SSBO와 인스턴스 행렬을 저장할 버퍼를 추가합니다. ```cpp std::vector m_instance_data{}; // model matrices. std::optional m_instance_ssbo{}; ``` -Add two `Transform`s as the source of rendering instances, and a function to update the matrices: +렌더링할 인스턴스에 사용할 `Transform`을 추가하고 이를 기반으로 행렬을 업데이트하는 함수를 추가합니다. ```cpp void update_instances(); @@ -33,7 +33,7 @@ void App::update_instances() { } ``` -Update the descriptor pool to also provide storage buffers: +디스크립터 풀을 업데이트하여 스토리지 버퍼를 지원하도록 합니다. ```cpp // ... @@ -41,11 +41,11 @@ vk::DescriptorPoolSize{vk::DescriptorType::eCombinedImageSampler, 2}, vk::DescriptorPoolSize{vk::DescriptorType::eStorageBuffer, 2}, ``` -Add set 2 and its new binding. Such a set layout keeps each "layer" isolated: +디스크립터 셋을 2번과 해당 바인딩을 추가합니다. 이처럼 각 디스크립터 셋을 명확하게 역할별로 분리하는 것이 좋습니다. -* Set 0: view / camera -* Set 1: textures / material -* Set 2: draw instances +* 디스크립터 셋 0 - : 뷰 / 카메라 +* 디스크립터 셋 1 - 텍스쳐 / 머테리얼 +* 디스크립터 셋 2 : 인스턴싱 ```cpp static constexpr auto set_2_bindings_v = std::array{ @@ -56,14 +56,14 @@ auto set_layout_cis = std::array{}; set_layout_cis[2].setBindings(set_2_bindings_v); ``` -Create the instance SSBO after the view UBO: +뷰 UBO를 생성한 이후 인스턴스용 SSBO를 생성합니다. ```cpp m_instance_ssbo.emplace(m_allocator.get(), m_gpu.queue_family, vk::BufferUsageFlagBits::eStorageBuffer); ``` -Call `update_instances()` after `update_view()`: +`update_view()`를 호출한 다음 `update_instances()`를 호출합니다. ```cpp // ... @@ -71,7 +71,7 @@ update_view(); update_instances(); ``` -Extract transform inspection into a lambda and inspect each instance transform too: +트랜스폼 확인 로직을 람다로 분리해 각 인스턴스의 트랜스폼을 검사합니다. ```cpp static auto const inspect_transform = [](Transform& out) { @@ -99,7 +99,7 @@ if (ImGui::TreeNode("Instances")) { } ``` -Add another descriptor write for the SSBO: +SSBO를 위한 descriptorWrite도 추가합니다. ```cpp auto writes = std::array{}; @@ -115,7 +115,7 @@ write.setBufferInfo(instance_ssbo_info) writes[2] = write; ``` -Finally, change the instance count in the draw call: +마지막으로, 드로우 콜의 인스턴스 수를 변경합니다. ```cpp auto const instances = static_cast(m_instances.size()); @@ -123,7 +123,7 @@ auto const instances = static_cast(m_instances.size()); command_buffer.drawIndexed(6, instances, 0, 0, 0); ``` -Update the vertex shader to incorporate the instance model matrix: +정점 셰이더를 수정하여 인스턴스별 모델 행렬을 적용합니다. ```glsl // ... diff --git a/guide/translations/ko-KR/src/descriptor_sets/pipeline_layout.md b/guide/translations/ko-KR/src/descriptor_sets/pipeline_layout.md index 9e16f3e..683e66d 100644 --- a/guide/translations/ko-KR/src/descriptor_sets/pipeline_layout.md +++ b/guide/translations/ko-KR/src/descriptor_sets/pipeline_layout.md @@ -1,8 +1,8 @@ -# Pipeline Layout +# 파이프라인 레이아웃 -A [Vulkan Pipeline Layout](https://registry.khronos.org/vulkan/specs/latest/man/html/VkPipelineLayout.html) represents a sequence of descriptor sets (and push constants) associated with a shader program. Even when using Shader Objects, a Pipeline Layout is needed to utilize descriptor sets. +[Vulkan 파이프라인 레이아웃](https://registry.khronos.org/vulkan/specs/latest/man/html/VkPipelineLayout.html)은 셰이더 프로그램과 연결된 디스크립터 셋과 푸시 상수를 나타냅니다. 셰이더 오브젝트를 사용할 경우에도 디스크립터 셋을 활용하기 위해 파이프라인 레이아웃이 필요합니다. -Starting with the layout of a single descriptor set containing a uniform buffer to set the view/projection matrices in, store a descriptor pool in `App` and create it before the shader: +뷰/프로젝션 행렬을 담기 위한 유니폼 버퍼를 포함하는 단일 디스크립터 셋 레이아웃부터 시작합니다. 디스크립터 풀을 `App`에 추가하고 셰이더보다 먼저 생성합니다. ```cpp vk::UniqueDescriptorPool m_descriptor_pool{}; @@ -20,7 +20,7 @@ void App::create_descriptor_pool() { } ``` -Add new members to `App` to store the set layouts and pipeline layout. `m_set_layout_views` is just a copy of the descriptor set layout handles in a contiguous vector: +새로운 멤버를 `App`에 추가해 디스크립터 셋 레이아웃과 파이프라인 레이아웃을 담도록 합니다. `m_set_layout_views`는 디스크립터 셋 레이아웃의 핸들을 연속된 vector로 복사한 것입니다. ```cpp std::vector m_set_layouts{}; @@ -55,7 +55,7 @@ void App::create_pipeline_layout() { } ``` -Add a helper function that allocates a set of descriptor sets for the entire layout: +레이아웃 전체에 해당하는 디스크립터 셋을 할당하는 함수를 추가합니다. ```cpp auto App::allocate_sets() const -> std::vector { @@ -66,7 +66,7 @@ auto App::allocate_sets() const -> std::vector { } ``` -Store a Buffered copy of descriptor sets for one drawable object: +그릴 객체에 쓰일 디스크립터 셋을 저장합니다. ```cpp Buffered> m_descriptor_sets{}; diff --git a/guide/translations/ko-KR/src/descriptor_sets/texture.md b/guide/translations/ko-KR/src/descriptor_sets/texture.md index bac0b80..d94e889 100644 --- a/guide/translations/ko-KR/src/descriptor_sets/texture.md +++ b/guide/translations/ko-KR/src/descriptor_sets/texture.md @@ -1,12 +1,12 @@ -# Texture +# 텍스쳐 -With a large part of the complexity wrapped away in `vma`, a `Texture` is just a combination of three things: +대부분의 복잡한 작업은 `vma`에서 처리하기 때문에, `Texture`는 다음 세 가지로 구성됩니다. -1. Sampled Image -2. (Unique) Image View of above -3. (Unique) Sampler +1. 샘플링될 이미지 +2. 해당 이미지의 이미지 뷰 +3. 고유한 샘플러 -In `texture.hpp`, create a default sampler: +`texture.hpp`에 기본 샘플러를 생성하겠습니다. ```cpp [[nodiscard]] constexpr auto @@ -27,7 +27,8 @@ constexpr auto sampler_ci_v = create_sampler_ci( vk::SamplerAddressMode::eClampToEdge, vk::Filter::eLinear); ``` -Define the Create Info and Texture types: +CreateInfo와 텍스쳐 타입을 정의합니다. + ```cpp struct TextureCreateInfo { @@ -55,7 +56,7 @@ class Texture { }; ``` -Add a fallback bitmap constant, and the implementation: +에러가 발생 시 사용할(fallback) 비트맵 상수도 추가하겠습니다. ```cpp // 4-channels. @@ -105,7 +106,7 @@ auto Texture::descriptor_info() const -> vk::DescriptorImageInfo { } ``` -To sample textures, `Vertex` will need a UV coordinate: +텍스쳐를 샘플링하려면 `Vertex`에 UV 좌표를 추가해야 합니다. ```cpp struct Vertex { @@ -128,7 +129,7 @@ constexpr auto vertex_attributes_v = std::array{ }; ``` -Store a texture in `App` and create with the other shader resources: +`App`에 텍스쳐를 담고 다른 셰이더 자원도 함께 생성하겠습니다. ```cpp std::optional m_texture{}; @@ -160,7 +161,7 @@ texture_ci.sampler.setMagFilter(vk::Filter::eNearest); m_texture.emplace(std::move(texture_ci)); ``` -Update the descriptor pool sizes to also contain Combined Image Samplers: +DescriptorPoolSize를 업데이트해 CombinedImageSampler도 포함하도록 수정합니다. ```cpp /// ... @@ -168,7 +169,7 @@ vk::DescriptorPoolSize{vk::DescriptorType::eUniformBuffer, 2}, vk::DescriptorPoolSize{vk::DescriptorType::eCombinedImageSampler, 2}, ``` -Set up a new descriptor set (number 1) with a combined image sampler at binding 0. This could be added to binding 1 of set 0 as well, since we are not optimizing binding calls (eg binding set 0 only once for multiple draws): +새로운 디스크립터 셋(1번)의 바인딩 0번에 CombinedImageSampler를 설정합니다. 바인딩 호출 최적화를 하지 않을 경우, set 0의 바인딩 1번에 추가해도 괜찮습니다. ```cpp static constexpr auto set_1_bindings_v = std::array{ @@ -179,7 +180,7 @@ set_layout_cis[0].setBindings(set_0_bindings_v); set_layout_cis[1].setBindings(set_1_bindings_v); ``` -Remove the vertex colors and set the UVs for the quad. In Vulkan UV space is the same as GLFW window space: origin is at the top left, +X moves right, +Y moves down. +정점 색상 값을 지우고 사각형에 UV를 설정합니다. Vulkan에서의 UV 공간은 GLFW 윈도우 공간과 동일합니다. 왼쪽 위가 원점이고, 오른쪽이 +X, 아래쪽이 +Y입니다. ```cpp static constexpr auto vertices_v = std::array{ @@ -190,7 +191,7 @@ static constexpr auto vertices_v = std::array{ }; ``` -Finally, update the descriptor writes: +마지막으로, DescriptorWrite를 업데이트 합니다. ```cpp auto writes = std::array{}; @@ -205,9 +206,9 @@ write.setImageInfo(image_info) writes[1] = write; ``` -Since the Texture is not N-buffered (because it is "GPU const"), in this case the sets could also be updated once after texture creation instead of every frame. +텍스쳐는 N-버퍼링되지 않기 때문에(이는 GPU 상수입니다), 디스크립터 셋도 텍스쳐 생성 이후 한번만 업데이트하면 됩니다. -Add the UV vertex attribute the vertex shader and pass it to the fragment shader: +UV 정점 속성을 정점 셰이더에 추가하고 이를 프래그먼트 셰이더로 전달합니다. ```glsl layout (location = 2) in vec2 a_uv; @@ -220,7 +221,7 @@ out_color = a_color; out_uv = a_uv; ``` -Add set 1 and the incoming UV coords to the fragment shader, combine the sampled texture color with the vertex color: +셋 1번과 그에 맞는 UV 좌표도 프래그먼트 셰이더에 추가하고, 샘플링한 텍스쳐 색상과 정점 색상을 섞어봅시다. ```glsl layout (set = 1, binding = 0) uniform sampler2D tex; @@ -234,14 +235,14 @@ out_color = vec4(in_color, 1.0) * texture(tex, in_uv); ![RGBY Texture](./rgby_texture.png) -For generating mip-maps, follow the [sample in the Vulkan docs](https://docs.vulkan.org/samples/latest/samples/api/hpp_texture_mipmap_generation/README.html#_generating_the_mip_chain). The high-level steps are: - -1. Compute mip levels based on image size -1. Create an image with the desired mip levels -1. Copy the source data to the first mip level as usual -1. Transition the first mip level to TransferSrc -1. Iterate through all the remaining mip levels: - 1. Transition the current mip level to TransferDst - 1. Record an image blit operation from previous to current mip levels - 1. Transition the current mip level to TransferSrc -1. Transition all levels (entire image) to ShaderRead +밉맵을 생성하기 위해서는 [Vulkan 공식 예제](https://docs.vulkan.org/samples/latest/samples/api/hpp_texture_mipmap_generation/README.html#_generating_the_mip_chain)를 참고하세요. 고수준 절차는 다음과 같습니다. + +1. 이미지 크기에 기반하여 밉 레벨을 계산합니다. +2. 원하는 밉 레벨 수를 갖는 이미지를 생성합니다. +3. 첫 번째 밉 레벨에 원본 데이터를 복사합니다. +4. 첫 번째 밉 레벨의 레이아웃을 TransferSrc로 변경합니다. +5. 모든 밉 레벨을 순회하며 다음을 수행합니다. + 1. 현재 밉 레벨의 레이아웃을 TransferDst로 변경합니다. + 2. 이전 밉 레벨에서 현재 밉 레벨로 ImageBlit 작업을 수행합니다. + 3. 현재 밉 레벨의 레이아웃을 TransferSrc로 변경합니다. +6. 모든 레벨의 레이아웃을 ShaderRead로 변경합니다. diff --git a/guide/translations/ko-KR/src/descriptor_sets/view_matrix.md b/guide/translations/ko-KR/src/descriptor_sets/view_matrix.md index 43cdc32..8e18515 100644 --- a/guide/translations/ko-KR/src/descriptor_sets/view_matrix.md +++ b/guide/translations/ko-KR/src/descriptor_sets/view_matrix.md @@ -1,6 +1,6 @@ -# View Matrix +# 뷰 행렬 -Integrating the view matrix will be quite simple and short. First, transformations for objects and cameras/views can be encapsulated into a single struct: +뷰 행렬을 통합하는 작업은 꽤 간단합니다. 먼저, 오브젝트와 카메라/뷰의 변환 정보를 하나의 구조체로 캡슐화합니다. ```cpp struct Transform { @@ -13,7 +13,7 @@ struct Transform { }; ``` -Extracting the common logic into a helper, both member functions can be implemented easily: +공통된 로직을 함수로 사용하도록 두 가지 멤버 함수를 추가하겠습니다. ```cpp namespace { @@ -52,7 +52,7 @@ auto Transform::view_matrix() const -> glm::mat4 { } ``` -Add a `Transform` member to `App` to represent the view/camera, inspect its members, and combine with the existing projection matrix: +`App`에 `Transform` 멤버를 추가하여 뷰/카메라를 나타내고, 해당 멤버를 확인하여 기존의 프로젝션 행렬과 결합합니다. ```cpp Transform m_view_transform{}; // generates view matrix. @@ -74,6 +74,6 @@ auto const bytes = m_view_ubo->write_at(m_frame_index, bytes); ``` -Naturally, moving the view left moves everything else - currently only a single RGBY quad - to the _right_. +자연스럽게 뷰를 왼쪽으로 이동하면 현재는 사각형 하나뿐이지만 이것이 오른쪽으로 이동한 것으로 보일 것입니다. ![View Matrix](./view_matrix.png) From 9dc0fb02c6e2521a097f527f133dc9f42ccb851a Mon Sep 17 00:00:00 2001 From: CDDing Date: Thu, 1 May 2025 19:52:41 +0900 Subject: [PATCH 8/9] revise and summary --- guide/translations/ko-KR/src/SUMMARY.md | 60 +++++++++---------- .../ko-KR/src/initialization/device.md | 4 +- .../ko-KR/src/initialization/gpu.md | 8 +-- .../ko-KR/src/initialization/instance.md | 5 +- .../ko-KR/src/initialization/swapchain.md | 7 +-- .../ko-KR/src/rendering/swapchain_update.md | 1 - .../ko-KR/src/shader_objects/README.md | 2 +- .../src/shader_objects/glsl_to_spir_v.md | 5 -- .../ko-KR/src/shader_objects/pipelines.md | 1 - 9 files changed, 42 insertions(+), 51 deletions(-) diff --git a/guide/translations/ko-KR/src/SUMMARY.md b/guide/translations/ko-KR/src/SUMMARY.md index e8a2291..6fa2f86 100644 --- a/guide/translations/ko-KR/src/SUMMARY.md +++ b/guide/translations/ko-KR/src/SUMMARY.md @@ -4,48 +4,48 @@ # 기초 -- [Getting Started](getting_started/README.md) - - [Project Layout](getting_started/project_layout.md) - - [Validation Layers](getting_started/validation_layers.md) +- [시작하기](getting_started/README.md) + - [프로젝트 레이아웃](getting_started/project_layout.md) + - [검증 레이어](getting_started/validation_layers.md) - [class App](getting_started/class_app.md) -- [Initialization](initialization/README.md) +- [초기화](initialization/README.md) - [GLFW Window](initialization/glfw_window.md) - - [Vulkan Instance](initialization/instance.md) + - [Vulkan 인스턴스](initialization/instance.md) - [Vulkan Surface](initialization/surface.md) - - [Vulkan Physical Device](initialization/gpu.md) - - [Vulkan Device](initialization/device.md) + - [Vulkan 물리 디바이스](initialization/gpu.md) + - [Vulkan 디바이스](initialization/device.md) - [Scoped Waiter](initialization/scoped_waiter.md) - - [Swapchain](initialization/swapchain.md) + - [스왑체인](initialization/swapchain.md) # Hello Triangle -- [Rendering](rendering/README.md) - - [Swapchain Loop](rendering/swapchain_loop.md) - - [Render Sync](rendering/render_sync.md) - - [Swapchain Update](rendering/swapchain_update.md) - - [Dynamic Rendering](rendering/dynamic_rendering.md) +- [렌더링](rendering/README.md) + - [스왑체인 루프](rendering/swapchain_loop.md) + - [렌더 싱크](rendering/render_sync.md) + - [스왑체인 업데이트](rendering/swapchain_update.md) + - [동적 렌더링](rendering/dynamic_rendering.md) - [Dear ImGui](dear_imgui/README.md) - [class DearImGui](dear_imgui/dear_imgui.md) - - [ImGui Integration](dear_imgui/imgui_integration.md) -- [Shader Objects](shader_objects/README.md) - - [Locating Assets](shader_objects/locating_assets.md) - - [Shader Program](shader_objects/shader_program.md) - - [GLSL to SPIR-V](shader_objects/glsl_to_spir_v.md) - - [Drawing a Triangle](shader_objects/drawing_triangle.md) - - [Graphics Pipelines](shader_objects/pipelines.md) + - [ImGui 통합](dear_imgui/imgui_integration.md) +- [셰이더 오브젝트](shader_objects/README.md) + - [에셋 위치](shader_objects/locating_assets.md) + - [셰이더 프로그램](shader_objects/shader_program.md) + - [GLSL 에서 SPIR-V](shader_objects/glsl_to_spir_v.md) + - [삼각형 그리기](shader_objects/drawing_triangle.md) + - [그래픽스 파이프라인](shader_objects/pipelines.md) # 셰이더 자원 -- [Memory Allocation](memory/README.md) +- [메모리 할당](memory/README.md) - [Vulkan Memory Allocator](memory/vma.md) - - [Buffers](memory/buffers.md) - - [Vertex Buffer](memory/vertex_buffer.md) + - [버퍼](memory/buffers.md) + - [정점 버퍼](memory/vertex_buffer.md) - [Command Block](memory/command_block.md) - - [Device Buffers](memory/device_buffers.md) - - [Images](memory/images.md) -- [Descriptor Sets](descriptor_sets/README.md) - - [Pipeline Layout](descriptor_sets/pipeline_layout.md) + - [디바이스 버퍼](memory/device_buffers.md) + - [이미지](memory/images.md) +- [디스크립터 셋](descriptor_sets/README.md) + - [파이프라인 레이아웃](descriptor_sets/pipeline_layout.md) - [Descriptor Buffer](descriptor_sets/descriptor_buffer.md) - - [Texture](descriptor_sets/texture.md) - - [View Matrix](descriptor_sets/view_matrix.md) - - [Instanced Rendering](descriptor_sets/instanced_rendering.md) + - [텍스쳐](descriptor_sets/texture.md) + - [뷰 행렬](descriptor_sets/view_matrix.md) + - [인스턴스 렌더링](descriptor_sets/instanced_rendering.md) diff --git a/guide/translations/ko-KR/src/initialization/device.md b/guide/translations/ko-KR/src/initialization/device.md index 415604d..1165677 100644 --- a/guide/translations/ko-KR/src/initialization/device.md +++ b/guide/translations/ko-KR/src/initialization/device.md @@ -1,6 +1,6 @@ -# Vulkan Device +# Vulkan 디바이스 -[Device](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-devices)는 Physical Device의 논리적 인스턴스이며, 이후의 모든 Vulkan 작업에서 주요 인터페이스 역할을 하게 됩니다. [Queue](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-queues)는 Device가 소유하는 것으로, `Gpu` 구조체에 저장된 큐 패밀리에서 하나를 가져와 기록된 커맨드 버퍼를 제출하는 데 사용할 것입니다. 또한 사용하기를 원하는 [Dynamic Rendering](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_dynamic_rendering.html) 과 [Synchronization2](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_synchronization2.html)같은 기능들을 명시적으로 선언해야 합니다. +[디바이스](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-devices)는 Physical Device의 논리적 인스턴스이며, 이후의 모든 Vulkan 작업에서 주요 인터페이스 역할을 하게 됩니다. [큐](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-queues)는 디바이스가 소유하는 것으로, `Gpu` 구조체에 저장된 큐 패밀리에서 하나를 가져와 기록된 커맨드 버퍼를 제출하는 데 사용할 것입니다. 또한 사용하기를 원하는 [Dynamic Rendering](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_dynamic_rendering.html) 과 [Synchronization2](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_synchronization2.html)같은 기능들을 명시적으로 선언해야 합니다. `vk::QueueCreateInfo`객체를 설정합시다. diff --git a/guide/translations/ko-KR/src/initialization/gpu.md b/guide/translations/ko-KR/src/initialization/gpu.md index 5291a39..4b5e36c 100644 --- a/guide/translations/ko-KR/src/initialization/gpu.md +++ b/guide/translations/ko-KR/src/initialization/gpu.md @@ -1,14 +1,14 @@ -# Vulkan Physical Device +# Vulkan 물리 디바이스 -[Physical Device](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-physical-device-enumeration)는 Vulkan의 완전한 구현체를 나타내며, 일반적으로 하나의 GPU를 의미합니다(단, Mesa/lavapipe와 같은 소프트웨어 렌더러일 수도 있습니다). 여러 GPU가 장착된 랩탑과 같은 일부 기기에서는 여러 개의 Physical Device가 존재할 수 있습니다. 이 중에서 다음 조건을 만족하는 것을 하나 선택해야 합니다. +[물리 디바이스](https://docs.vulkan.org/spec/latest/chapters/devsandqueues.html#devsandqueues-physical-device-enumeration)는 Vulkan의 완전한 구현체를 나타내며, 일반적으로 하나의 GPU를 의미합니다(단, Mesa/lavapipe와 같은 소프트웨어 렌더러일 수도 있습니다). 여러 GPU가 장착된 랩탑과 같은 일부 기기에서는 여러 개의 물리 디바이스가 존재할 수 있습니다. 이 중에서 다음 조건을 만족하는 것을 하나 선택해야 합니다. 1. Vulkan 1.3을 지원해야 합니다. -2. Vulkan Swapchain을 지원해야 합니다. +2. 스왑체인을 지원해야 합니다. 3. Graphics와 Transfer작업을 지원하는 Vulkan Queue가 존재해야 합니다. 4. 이전에 생성한 Vulkan Surface로 출력(present)할 수 있어야 합니다. 5. (선택 사항) 외장 GPU를 우선적으로 고려합니다. -실제 Physical Device와 몇 가지 유용한 객체들을 `struct Gpu`로 묶겠습니다. 많은 유틸리티 함수가 함께 정의될 것이므로 이를 별도의 hpp, cpp파일에 구현하고 기존의 `vk_version_v` 상수를 이 새로운 헤더로 옮기겠습니다. +실제 물리 디바이스와 몇 가지 유용한 객체들을 `struct Gpu`로 묶겠습니다. 많은 유틸리티 함수가 함께 정의될 것이므로 이를 별도의 hpp, cpp파일에 구현하고 기존의 `vk_version_v` 상수를 이 새로운 헤더로 옮기겠습니다. ```cpp constexpr auto vk_version_v = VK_MAKE_VERSION(1, 3, 0); diff --git a/guide/translations/ko-KR/src/initialization/instance.md b/guide/translations/ko-KR/src/initialization/instance.md index 9331fc9..7382c72 100644 --- a/guide/translations/ko-KR/src/initialization/instance.md +++ b/guide/translations/ko-KR/src/initialization/instance.md @@ -1,4 +1,4 @@ -# Vulkan Instance +# Vulkan 인스턴스 Vulkan을 SDK를 통해 빌드 시점에 링킹하는 대신, 런타임에 동적으로 로드할 것입니다. 이를 위해 몇 가지 조정이 필요합니다. @@ -6,8 +6,7 @@ Vulkan을 SDK를 통해 빌드 시점에 링킹하는 대신, 런타임에 동 2. `app.cpp`에서 전역에 `VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE`를 추가합니다. 3. 초기화 이전과 초기화 과정 중에 `VULKAN_HPP_DEFAULT_DISPATCHER.init()`을 호출합니다. -Vulkan에서 가장 먼저 해야할 것은 [Instance](https://docs.vulkan.org/spec/latest/chapters/initialization.html#initialization-instances)를 생성하는 것입니다. 이는 물리 디바이스(GPU)의 목록을 가져오거나, 논리 디바이스를 생성할 수 있습니다. -Instance +Vulkan에서 가장 먼저 해야할 것은 [인스턴스](https://docs.vulkan.org/spec/latest/chapters/initialization.html#initialization-instances)를 생성하는 것입니다. 이는 물리 디바이스(GPU)의 목록을 가져오거나, 논리 디바이스를 생성할 수 있습니다. Vulkan 1.3 버전을 필요로 하므로, 이를 상수로 정의해 쉽게 참조할 수 있도록 합니다. diff --git a/guide/translations/ko-KR/src/initialization/swapchain.md b/guide/translations/ko-KR/src/initialization/swapchain.md index eb41780..98a3d08 100644 --- a/guide/translations/ko-KR/src/initialization/swapchain.md +++ b/guide/translations/ko-KR/src/initialization/swapchain.md @@ -1,6 +1,6 @@ -# Swapchain +# 스왑체인 -[Swapchain](https://docs.vulkan.org/guide/latest/wsi.html#_swapchain)은 Surface와 연결된, 화면에 표시 가능한 이미지들의 배열입니다. 이는 애플리케이션과 플랫폼의 프레젠테이션 엔진 사이를 이어주는 다리 역할을 합니다. 스왑체인은 메인 루프에서 이미지를 받아오고 화면에 표시하기 위해 지속적으로 사용됩니다. 스왑체인 생성에 실패하는 것은 치명적인 오류이므로, 그 생성 과정은 초기화 단계에 포함됩니다. +[스왑체인](https://docs.vulkan.org/guide/latest/wsi.html#_swapchain)은 Surface와 연결된, 화면에 표시 가능한 이미지들의 배열입니다. 이는 애플리케이션과 플랫폼의 프레젠테이션 엔진 사이를 이어주는 다리 역할을 합니다. 스왑체인은 메인 루프에서 이미지를 받아오고 화면에 표시하기 위해 지속적으로 사용됩니다. 스왑체인 생성에 실패하는 것은 치명적인 오류이므로, 그 생성 과정은 초기화 단계에 포함됩니다. 스왑체인을 우리가 정의한 `class Swapchain`으로 감쌀 것입니다. 이 클래스는 스왑체인이 소유한 이미지의 복사본을 저장하고, 각 이미지에 맞는 이미지 뷰를 생성하고 소유합니다. 스왑체인은 프레임 버퍼 크기가 변경되거나, acquire/present 작업이 `vk::ErrorOutOfDataKHR`를 반환하는 경우처럼, 메인 루프 중에 재생성이 필요할 수 있습니다. 이를 `recreate()` 함수로 캡슐화하여 초기화 시점에도 간단히 호출할 수 있도록 하겠습니다. @@ -86,8 +86,7 @@ if (!recreate(size)) { ## 스왑체인 재생성 -The constraints on Swapchain creation parameters are specified by [Surface Capabilities](https://registry.khronos.org/vulkan/specs/latest/man/html/VkSurfaceCapabilitiesKHR.html). Based on the spec we add two helper functions and a constant: -스왑체인 생성 파라미터의 제약은 Surface Capabilities에 지정됩니다. 스펙에 따라 함수 두 개와 상수 하나를 추가하겠습니다. +스왑체인 생성 파라미터의 제약은 [Surface Capabilities](https://registry.khronos.org/vulkan/specs/latest/man/html/VkSurfaceCapabilitiesKHR.html)에 지정됩니다. 사양에 따라 함수 두 개와 상수 하나를 추가하겠습니다. ```cpp constexpr std::uint32_t min_images_v{3}; diff --git a/guide/translations/ko-KR/src/rendering/swapchain_update.md b/guide/translations/ko-KR/src/rendering/swapchain_update.md index 696d82d..8455293 100644 --- a/guide/translations/ko-KR/src/rendering/swapchain_update.md +++ b/guide/translations/ko-KR/src/rendering/swapchain_update.md @@ -1,6 +1,5 @@ # 스왑체인 업데이트 -Swapchain acquire/present operations can have various results. We constrain ourselves to the following: 스왑체인에서 이미지를 받아오고 표시하는 작업은 다양한 결과를 반환할 수 있습니다. 우리는 다음과 같은 경우에 한정하여 처리합니다. - `eSuccess` : 문제가 없습니다. diff --git a/guide/translations/ko-KR/src/shader_objects/README.md b/guide/translations/ko-KR/src/shader_objects/README.md index b07983d..019c250 100644 --- a/guide/translations/ko-KR/src/shader_objects/README.md +++ b/guide/translations/ko-KR/src/shader_objects/README.md @@ -1,4 +1,4 @@ -# 셰이더 객체 +# 셰이더 오브젝트 [Vulkan의 그래픽스 파이프라인](https://docs.vulkan.org/spec/latest/chapters/pipelines.html)은 전체 렌더링 과정을 아우르는 거대한 객체로, `draw()` 호출 한 번에 여러 단계를 수행합니다. 하지만 [`VK_EXT_shader_object`](https://www.khronos.org/blog/you-can-use-vulkan-without-pipelines-today)라는 확장을 사용하면, 이러한 그래픽스 파이프라인 자체를 완전히 생략할 수 있습니다. 이 확장을 사용할 경우 대부분의 파이프라인 상태가 동적으로 설정되며, 그리는 시점에 설정됩니다. 이때 개발자가 직접 다뤄야할 Vulkan 핸들은 `ShaderEXT` 객체뿐입니다. 더 자세한 정보는 [여기](https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/extensions/shader_object)를 참고하세요. diff --git a/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md b/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md index 1596cb1..9e45ebc 100644 --- a/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md +++ b/guide/translations/ko-KR/src/shader_objects/glsl_to_spir_v.md @@ -1,6 +1,5 @@ # GLSL 에서 SPIR-V -Shaders work in NDC space: -1 to +1 for X and Y. We output a triangle's coordinates in a new vertex shader and save it to `src/glsl/shader.vert`: 셰이더는 NDC 공간 X축과 Y축에서 -1에서 1까지 작동합니다. 새로운 정점 셰이더의 삼각형 좌표계를 출력하고 이를 `src/glsl/shader.vert`에 저장합니다. ```glsl @@ -19,7 +18,6 @@ void main() { } ``` -The fragment shader just outputs white for now, in `src/glsl/shader.frag`: `src/glsl/shader.frag`의 프래그먼트 셰이더는 지금은 흰 색을 출력하기만 할 것입니다. ```glsl @@ -32,7 +30,6 @@ void main() { } ``` -Compile both shaders into `assets/`: 이 둘을 `assets/`로 컴파일합니다. ``` @@ -40,12 +37,10 @@ glslc src/glsl/shader.vert -o assets/shader.vert glslc src/glsl/shader.frag -o assets/shader.frag ``` -> glslc is part of the Vulkan SDK. > glslc는 Vulkan SDK의 일부입니다. ## SPIR-V 불러오기 -SPIR-V shaders are binary files with a stride/alignment of 4 bytes. As we have seen, the Vulkan API accepts a span of `std::uint32_t`s, so we need to load it into such a buffer (and _not_ `std::vector` or other 1-byte equivalents). Add a helper function in `app.cpp`: SPIR-V 셰이더는 4바이트 단위로 정렬이 되어있는 바이너리 파일입니다. 지금까지 봐왔던 대로, Vulkan API는 `std::uint32_t`의 묶음을 받습니다. 따라서 이러한 종류의 버퍼(단, `std::vector` 혹은 다른 종류의 1바이트 컨테이너는 아닙니다)에 담습니다. 이를 돕는 함수를 `app.cpp`에 추가합니다. ```cpp diff --git a/guide/translations/ko-KR/src/shader_objects/pipelines.md b/guide/translations/ko-KR/src/shader_objects/pipelines.md index 8934e61..3078b12 100644 --- a/guide/translations/ko-KR/src/shader_objects/pipelines.md +++ b/guide/translations/ko-KR/src/shader_objects/pipelines.md @@ -191,7 +191,6 @@ auto PipelineBuilder::build(vk::PipelineLayout const layout, } ``` -`App` will need to store a builder, a Pipeline Layout, and the Pipeline(s): `App`은 빌더, 파이프라인 레이아웃, 그리고 파이프라인을 담아야 합니다. ```cpp From d6de623f1ea064f58b8099decc3ab1eb14356493 Mon Sep 17 00:00:00 2001 From: CDDing Date: Fri, 2 May 2025 02:01:18 +0900 Subject: [PATCH 9/9] fix --- guide/theme/index.hbs | 1 + guide/theme/lang_toggle.js | 2 +- guide/translations/ko-KR/book.toml | 10 +++++----- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/guide/theme/index.hbs b/guide/theme/index.hbs index 3827745..8dd3e33 100644 --- a/guide/theme/index.hbs +++ b/guide/theme/index.hbs @@ -144,6 +144,7 @@ {{#if search_enabled}}

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