Vulkan은 크로스 플랫폼 3D 그래픽 및 컴퓨팅 API입니다. OpenGL의 후속 제품으로, 높은 성능과 저렴한 비용으로 3D 게임 및 그래픽 애플리케이션을 만드는 데 사용됩니다. Vulkan은 다중 스레딩에 최적화되어 있으며, 다중 코어 CPU 및 다중 GPU 구성에서 최고의 성능을 발휘합니다. 또한, Vulkan은 저수준 API로서 개발자가 하드웨어에 직접 액세스하여 최적화된 그래픽 및 컴퓨팅 애플리케이션을 만들 수 있도록 합니다. Vulkan은 Windows, Linux, Android 및 iOS와 같은 다양한 플랫폼에서 지원됩니다.
Vulkan을 Windows 환경 설정
Vulkan 지원하는 그래픽 카드 확인: Vulkan을 사용하려면 그래픽 카드가 Vulkan API를 지원해야 합니다. 대부분의 최신 그래픽 카드는 Vulkan을 지원하지만, 그래픽 카드 제조업체의 웹 사이트에서 확인
최신 그래픽 드라이버 설치: Vulkan을 사용하려면 최신 그래픽 드라이버가 설치되어 있어야 합니다. 그래픽 카드 제조업체의 웹 사이트에서 최신 드라이버를 다운로드하고 설치
Vulkan SDK 설치: Vulkan 개발을 위해 Vulkan SDK를 다운로드하고 설치 Vulkan SDK는 Vulkan API를 사용하여 애플리케이션을 개발하는 데 필요한 모든 도구와 라이브러리를 제공
개발 환경 설정: 개발 환경에서 Vulkan API를 사용하려면 IDE(Integrated Development Environment)와 빌드 시스템을 구성해야 합니다. 대표적으로 Visual Studio나 CMake와 같은 도구를 사용하여 구성
빌드 환경 설정: 애플리케이션을 빌드할 때 Vulkan 라이브러리와 헤더 파일을 사용해야 합니다. 이를 위해 빌드 환경에서 Vulkan SDK의 라이브러리와 헤더 파일 경로를 설정
애플리케이션 개발: Vulkan API를 사용하여 애플리케이션을 개발합니다. Vulkan API는 OpenGL과 비슷한 방식으로 작동하지만, 더 많은 제어력을 제공
애플리케이션 테스트: 개발한 애플리케이션을 테스트하고 디버깅 Vulkan은 매우 저수준의 API이므로, 개발 과정에서 예기치 않은 오류가 발생할 수 있음 이를 해결하기 위해 디버깅 도구와 테스트 환경을 구성
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include <iostream>
#include <stdexcept>
#include <cstdlib>
#include <vector>
#include <cstring>
const uint32_t WIDTH = 800;
const uint32_t HEIGHT = 600;
const std::vector<const char*> validationLayers = {
"VK_LAYER_KHRONOS_validation"
};
#ifdef NDEBUG
const bool enableValidationLayers = false;
#else
const bool enableValidationLayers = true;
#endif
void initWindow(GLFWwindow*& window) {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
window = glfwCreateWindow(WIDTH, HEIGHT, "Vulkan", nullptr, nullptr);
}
VkInstance createInstance() {
if (enableValidationLayers && !checkValidationLayerSupport()) {
throw std::runtime_error("Validation layers requested, but not available!");
}
VkInstanceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
uint32_t glfwExtensionCount = 0;
const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
createInfo.enabledExtensionCount = glfwExtensionCount;
createInfo.ppEnabledExtensionNames = glfwExtensions;
VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo;
if (enableValidationLayers) {
createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
createInfo.ppEnabledLayerNames = validationLayers.data();
populateDebugMessengerCreateInfo(debugCreateInfo);
createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*) &debugCreateInfo;
} else {
createInfo.enabledLayerCount = 0;
createInfo.pNext = nullptr;
}
VkInstance instance;
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {
throw std::runtime_error("Failed to create instance!");
}
return instance;
}
void mainLoop(GLFWwindow* window) {
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
}
void cleanup(GLFWwindow* window, VkInstance instance) {
vkDestroyInstance(instance, nullptr);
glfwDestroyWindow(window);
glfwTerminate();
}
int main() {
GLFWwindow* window;
initWindow(window);
VkInstance instance = createInstance();
mainLoop(window);
cleanup(window, instance);
return 0;
}