본문 바로가기

카테고리 없음

Vulkan 윈도우 환경 구성 및 삼각형 예제 만들기

728x90

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;
}

 

 

728x90