반응형
모던 Vulkan (C++ 버전) 시리즈의 아홉 번째 글입니다. 지금까지 인스턴스 생성, 디바이스/큐 확보, 커맨드 버퍼, 메모리 관리, Compute 파이프라인 및 디스크립터 구성, 벡터 덧셈 예제, 디버깅/프로파일링 전략까지 모든 단계를 Modern C++와 Vulkan-HPP를 활용해 재정비했습니다. 이번 글에서는 지금까지 다룬 내용을 정리하고, 앞으로 Intermediate/Advanced 주제로 나아갈 때 고려할 만한 확장 방향성을 소개하겠습니다.여기까지 다룬 내용 요약이 시리즈에서는 기존 입문 시리즈에서 C 스타일 Vulkan 코드를 사용해 다루었던 주제들을 모두 C++17 이상과 Vulkan-HPP, RAII 패턴, 예외 처리를 활용해 Modern C++ 스타일로 다시 구현했습니다.인스턴스 ..
모던 Vulkan (C++ 버전) 시리즈의 여덟 번째 글입니다. 지금까지 RAII와 Vulkan-HPP를 활용해 인스턴스부터 디바이스, 파이프라인, 커맨드 버퍼, 메모리 관리, 벡터 덧셈 예제까지를 Modern C++ 스타일로 재정비했습니다. 이제 개발 과정에서 필수적인 디버깅, Validation Layer, 그리고 성능 프로파일링에 대해 다시 한번 점검해보겠습니다.입문 시리즈에서 Validation Layer와 RenderDoc, Nsight Graphics, Nsight Systems 등의 툴을 간단히 언급한 바 있습니다. 이번에는 RAII 코드 기반으로 디버깅할 때 어떤 장점이 있는지, 그리고 Modern C++ 예외 처리와 결합해서 에러나 경고 메시지를 더 명확하게 처리하는 방법, 성능 프로파일..
모던 Vulkan (C++ 버전) 시리즈의 일곱 번째 글입니다. 이제까지 인스턴스 생성, 디바이스/큐 확보, 커맨드 버퍼, 메모리 관리, 버퍼 생성, Compute 파이프라인 및 디스크립터 구성까지 모두 C++ RAII 패턴과 Vulkan-HPP를 활용해 재정비했습니다. 이제 드디어 실제 GPGPU 연산을 수행하는 벡터 덧셈 예제를 Modern C++ 스타일로 완성해봅시다.입문 시리즈에서 C 스타일로 구현했던 벡터 덧셈 과정(Host에서 A, B를 준비한 뒤 GPU로 올리고, Compute 셰이더로 A+B를 C에 기록, 다시 Host로 결과를 가져오는 과정)을 이제 Vulkan-HPP 기반 C++ RAII 패턴, 예외 처리, STL 컨테이너와 함께 사용해 깔끔하게 재작성하겠습니다.목표호스트에서 std::..
모던 Vulkan (C++ 버전) 시리즈의 여섯 번째 글입니다. 지난 글(#5)에서는 메모리 관리와 버퍼 생성 과정을 Vulkan-HPP, RAII, 예외 처리를 활용해 재정립했습니다. 이제 GPGPU 연산을 수행하기 위해 필요한 Compute 파이프라인(Compute Pipeline)과 디스크립터(Descriptor) 관련 설정을 Modern C++ 스타일로 다시 구현해보겠습니다.입문 시리즈에서 SPIR-V 셰이더 모듈을 로드하고, 파이프라인 레이아웃과 컴퓨트 파이프라인을 생성한 뒤, 디스크립터 풀과 디스크립터 셋을 통해 버퍼를 셰이더에 바인딩하는 과정을 다뤘습니다. 이번에는 Vulkan-HPP를 활용해 RAII 기반의 vk::UniqueShaderModule, vk::UniquePipeline, vk..
모던 Vulkan (C++ 버전) 시리즈의 다섯 번째 글입니다. 지난 글(#4)에서 커맨드 버퍼, 커맨드 풀, 큐 제출 과정을 Modern C++ 스타일로 재작성했다면, 이번에는 메모리 관리와 버퍼 생성 과정을 Vulkan-HPP와 RAII를 활용해 더 단순화해보겠습니다. 이전 입문 시리즈에서는 C 스타일로 메모리 타입을 찾고, vkAllocateMemory, vkMapMemory, vkBindBufferMemory 등을 호출하는 방식을 썼습니다. 이제는 Vulkan-HPP를 통한 강타입 enum, RAII 객체, 예외 처리로 메모리 관리 로직을 개선하고, 코드 가독성을 높일 것입니다.목표Vulkan-HPP의 vk::BufferCreateInfo, vk::UniqueBuffer를 활용해 RAII 버퍼 객..
모던 Vulkan (C++ 버전) 시리즈의 네 번째 글입니다. 지난 글(#3)에서 물리 디바이스 선택 및 로지컬 디바이스, 큐 확보를 C++ RAII, 예외 처리 모드로 재작성했습니다. 이제 GPU에 명령을 전달하기 위한 커맨드 버퍼(Command Buffer)와 커맨드 풀(Command Pool), 그리고 큐 제출 과정을 Modern C++ 스타일로 다시 구현해봅시다.입문 시리즈에서는 C 스타일로 vkCreateCommandPool, vkAllocateCommandBuffers, vkQueueSubmit 등을 호출했지만, 이번에는 vk::UniqueCommandPool, vk::UniqueCommandBuffer, vk::SubmitInfo 등 Vulkan-HPP를 적극 활용하고, RAII를 통해 자원..
모던 Vulkan (C++ 버전) 시리즈의 세 번째 글입니다. 지난 글(#2)에서는 Vulkan-HPP와 Modern C++ 스타일을 적용해 인스턴스를 생성하고 Validation Layer와 익스텐션 설정 과정을 간소화했습니다. 이제 인스턴스가 준비되었으니, 시스템에 장착된 GPU(물리 디바이스)를 탐색하고, Compute 또는 Graphics에 적합한 큐 패밀리를 선택한 뒤 로지컬 디바이스를 생성하고 큐를 확보하는 과정을 C++ RAII 패턴을 활용해 다시 구현해보겠습니다.입문 시리즈에서 C 스타일 코드로 했던 과정을 이제 Vulkan-HPP와 RAII(Unique*), 예외 처리 등을 통해 더 깔끔하고 유지보수하기 쉬운 형태로 재작성합니다.목표인스턴스가 준비되었다고 가정하고, 물리 디바이스(Phys..
모던 Vulkan (C++ 버전) 시리즈의 두 번째 글입니다. 이번 글에서는 인스턴스를 생성하는 과정을 Vulkan-HPP와 Modern C++ 스타일로 재작성해보겠습니다. 이전 입문 시리즈에서 C 스타일로 인스턴스를 만들고 Validation Layer를 설정했던 과정을 다시 돌아보며, 이번에는 RAII를 활용한 vk::UniqueInstance, 예외 처리 모드 등을 적용하여 더 깔끔하고 유지보수하기 쉬운 코드를 작성하는 방법을 제시합니다.목표Vulkan C API 스타일로 작성했던 인스턴스 생성 코드를 Vulkan-HPP 기반 C++ 코드로 재구성vk::ApplicationInfo, vk::InstanceCreateInfo 등을 이용하여 Application, Engine, API 버전 정보 설정v..
왜 Vulkan-HPP인가?이전 입문 시리즈에서는 주로 C 스타일 Vulkan API를 사용했습니다. C 스타일 API는 다음과 같은 특징을 갖습니다.함수 포인터 기반 호출: vkCreateInstance, vkEnumeratePhysicalDevices 등리소스 관리의 수동성: vkDestroy* 함수를 일일이 호출해야 함타입 안전성 부족: 단순 enum, void* 기반 핸들, 에러 처리 시 VK_SUCCESS 등을 if문으로 체크이런 패턴은 어느 정도 익숙해지면 사용할 수 있지만, 실수하기 쉽고 코드량이 많아집니다. Modern C++(C++17 이상)에서는 RAII, 스마트 포인터, enum class, std::optional, std::variant 등 다양한 언어 기능을 통해 코드 품질을 높..
C++에서 예외(exception)는 런타임 오류를 처리하는 핵심 메커니즘이지만, 모든 코드베이스가 예외를 선호하는 것은 아닙니다. 일부 프로젝트는 성능상 이유나 제약 때문에 예외를 비활성화하고, 에러 코드를 반환하거나 std::expected를 통한 명시적 에러 처리 방식을 선호하기도 합니다. 또한 RAII를 통해 예외 안전성을 확보하고, 리소스 누수를 방지하는 패턴도 중요한 스타일 이슈입니다.이번 글에서는 다양한 스타일 가이드와 프로젝트 사례를 바탕으로, 예외 사용 여부 결정, std::expected나 에러 코드 기반 접근, RAII 기법, noexcept 사용, 그리고 에러 처리 시 주석과 문서화 방법 등을 다뤄봅니다.다양한 스타일 가이드와 사례구글 C++ 스타일 가이드:과거에는 예외 사용을 금지..