본문으로 바로가기

Vulkan) 1. 개발 환경 구성

category Graphics/Vulkan 2021. 5. 3. 07:09

모든 내용은 https://vulkan-tutorial.com/Development_environment 에서 발췌합니다.

Windows를 기본으로 합니다. 그 외 플랫폼의 개발 환경 구성은 튜토리얼 사이트를 확인해 주세요.

 

모든 완성된 코드는 github.com/kimduuukbae/VulkanTutorial에 업로드됩니다.


1장에서는 Vulkan 애플리케이션을 개발하기위한 환경설정을 하고 라이브러리를 설치합니다.

이 모든 개발 도구들은 Windows, Linux, MacOS와 호환되지만 설치 단계가 약간 다릅니다. 

윈도우의 경우 Visual Studio를 사용하여 컴파일 한다고 가정합니다. 완전한 C++17 지원을 위해서 Visual Studio 2017 또는 2019 를 사용해야 합니다. 모든 설명은 Visual Studio 2019를 기준으로 설명합니다.

 

0. Vulkan Introduction

Vulkan은 최신 그래픽 카드들의 훨씬 더 나은 추상화를 제공하는 Khronos 그룹의 새로운 API입니다.

이 새로운 API를 사용하면 애플리케이션이 수행하려는 작업을 더 잘 설명할 수 있으므로 OpenGL 및 Direct3D와 같은 기존 API에 비해 더 나은 성능과 덜 놀라운( less surprising ) 드라이버 동작으로 이어질 수 있습니다.

Vulkan의 아이디어는 Direct3D12, Metal과 유사하지만 Vulkan은 완전히 교차 플랫폼이라는 장점이 있으며 Windows, Linux 등으로 동시에 개발할 수 있습니다.

 

그러나 이러한 이점을 얻기 위해 지불하는 대가는 '훨씬 더 자세한 API'로 작업해야 한다는 것입니다. 초기 프레임 버퍼 생성, 버퍼 및 텍스처 이미지와 같은 객체에 대한 메모리 관리를 포함하여 그래픽 API와 관련된 모든 세부 사항은 애플리케이션에서 처음부터 설정해야합니다.

그래픽 드라이버의 도움을 받는일이 적습니다. 즉, 올바른 동작을 보장하려면 응용 프로그램에서 더 많은 작업을 해야합니다.

 

Vulkan은 모든 사람들을 위한 것이 아닙니다. 고성능 컴퓨터 그래픽스에 열광하고 일부 작업을 할 의사가 있는 프로그래머를 대상으로 합니다.

컴퓨터 그래픽스보다 게임 개발에 더 관심이 있다면 OpenGL 또는 Direct3D를 사용할 수 있습니다.

또 다른 대안은 Unreal Engine, Unity 같은 엔진을 사용하는 것입니다. 이 엔진들은 훨씬 더 높은 수준의 API를 사용하면서 Vulkan을 다룰 수 있습니다.

 

튜토리얼을 따라하기 위한 몇 가지 전제 조건을 다루겠습니다.

  • Vulkan ( NVIDIA, AMD, Intel ) 과 호환되는 그래픽 파드 및 드라이버
  • C++ 경험 ( RAII, Initializer_list 같은 지식, 개인적으로 튜토리얼을 보니 C++11 의 전반적인 지식은 알아야 한다고 생각합니다. )
  • C++17 기능을 적절히 지원하는 컴파일러 ( Visual Studio 2017+, GCC 7+, Clang 5+ )
  • 3D 컴퓨터 그래픽스에 대한 기존 경험

Vulkan은 최신 그래픽스 아키텍처를 위해 처음부터 설계함으로써 CPU의 멀티 스레딩 지원으로 병목현상을 제거하는 것과  GPU를 위해 프로그래머에게 더 많은 제어를 제공함으로써 성능 향상의 이점을 얻을 수 있습니다.

프로그래머가 보다 자세한 API를 사용하여 의도를 명확하게 지정할 수 있도록 하여 드라이버 오버헤드를 줄이고, 여러 스레드가 병렬로 명령(Command)을 만들고 제출할 수 있도록 합니다.

단일 컴파일러로 표준화된 바이트 코드 형식으로 전환하여 셰이더 컴파일의 불일치를 줄입니다. 마지막으로 그래픽 및 컴퓨팅 기능을 단일 API로 통합하여 최신 그래픽 카드의 범용 처리 기능을 인정합니다.

 

1. 삼각형을 그리는데 필요한 것

이제 잘 작동하는 Vulkan 프로그램에서 삼각형을 렌더링하는데 필요한 모든 단계에 대한 개요를 살펴보겠습니다.

여기에 소개된 모든 개념은 다음 장에서 자세히 설명합니다. 이는 모든 개별 구성 요소를 관련시키는 큰 그림을 제공하기 위한 것입니다.

 

  • Instance 및 물리적 장치 선택 - VkInstance를 만듭니다, VKPhysicalDevice를 통해 그래픽카드를 선태갛ㅂ니다.
  • Logical Device와 Queue families - 그리기와 프리젠테이션(dx에선 Present)을 위한 VkDeviceVkQueue 만들기
  • Window surface와 Swap chain - Window, Window Surface, Swap chain (후면 버퍼) 생성하기
  • Image views와 Framebuffer - Swap chain 이미지를 VkImageView로 래핑합니다.
  • Render pass - Render pass 를 생성하고 Render Target 지정하기
  • Graphics pipeline - 그래픽스 파이프라인 설정하기
  • Command Pool과 Command Buffer - 모든 Swap Chain Image에 대해 그리기 명령을 사용하여 Command Buffer를 할당하고, 기록합니다.
    Image를 얻어내고, 올바른 그리기 Command Buffer를 제출하고, Image를 다시 Swap Chain으로 반환하여 프레임을 그립니다.
  • Main Loop 

유효성 검사 레이어

앞서 언급했듯이, Vulkan은 고성능 및 낮은 드라이버 오버 헤드를 위해 설계되었습니다. 따라서 기본적으로 매우 제한된 오류 검사 및 디버깅 기능이 포함됩니다. 드라이버가 잘못하면 오류 코드를 반환하는 대신 충돌이 발생하거나, 더 나쁜 경우 그래픽 카드에서 작동하는 것처럼 보이지만 실패할 수 있습니다.

Vulkan을 사용하여 Validation Layers로 알려진 기능을 통해 광범위한 검사를 수행할 수 있습니다. validation layers는 함수 매개 변수에 대한 추가 검사 실행 및 메모리 관리 문제 추적과 같은 작업을 수행하기 위해 API와 그래픽 드라이버 사이에 사입할 수 있는 코드조각 입니다. 좋은 점은 개발 중에 활성화 한 다음 오버 헤드없이 애플리케이션을 릴리스 할 때 완전히 비활성화 할 수 있다는 것입니다.

누구나 자신의 유효성 검사 레이어를 작성할 수 있습니다. 또한 레이어에서 디버그 메세지를 수신하려면 콜백 함수를 등록해야 합니다.

 

Vulkan은 모든 작업에 대해 매우 명시적이고 validate layers가 매우 광범위하기 때문에 실제로 OpenGLDirect3D에 비해 어떤 문제점이 있는지 쉽게 알아낼 수 있습니다.

 

 

2. Vulkan SDK 설치

Vulkan 애플리케이션 개발에 필요한 가장 중요한 요소는 SDK 입니다. 여기에는 헤더, 표준 유효성 검사 레이어, 디버깅 도구 및 Vulkan 함수용 로더가 포함됩니다. 로더는 OpenGLGLFW와 유사하게 런타임에 드라이버의 기능을 조회합니다.

 

SDK는 LunarG 웹사이트 에서 다운로드 할 수 있습니다. vulkan.lunarg.com/

( 기본 경로에 설치했다고 가정 ) 설치 후 C:\VulkanSDK\Version\Bin\vkcube.exe 를 열어보세요!

 

오류 메세지가 표시되면

확인해보세요. 

 

이 폴더 내에는 개발에 유용한 다른 프로그램이 있습니다. glslanValidator.exeglslc.exe 는 사람이 사람이 읽을 수 있는 셰이더 에서 GLSL 바이트 코드로 컴파일 하는데 사용됩니다. 나중에 셰이더 모듈 장에서 다시 다루도록 합니다.

 

3. GLFW 설치

Vulkan 자체는 플랫폼에 구애받지 않는 API 입니다만, 렌더링된 결과를 표시하는 창(window)를 만드는 도구를 포함하진 않습니다.

Vulkan의 크로스플랫폼을 사용하고 Win32에 종속되지 않기 위해 GLFW 라이브러리를 사용하여 모든 플랫폼을 지원하는 창을 만들 것입니다.

물론 SDL 같은 라이브러리도 있지만, GLFW의 장점은 Vulkan의 다른 플랫폼 특정 항목도 추상화한다는 것입니다.

 

공식 웹사이트에서 GLFW의 최신 릴리스를 찾을 수 있습니다. www.glfw.org/download.html

이 튜토리얼에서는 64비트를 사용하지만, 32비트로 빌드하도록 선택할 수도 있습니다.

 

저는 편하게 내 문서\Visual Studio 2019\Libraries\glfw 에 압축을 풀겠습니다.

 

 

4. GLM 설치

DirectX12와는 다르게, Vulkan은 선형대수 연산을 위한 라이브러리를 제공하지 않습니다.

GLM그래픽 API와 함께 사용하도록 설계된 라이브러리 이며 OpenGL에서도 일반적으로 사용됩니다.

이 또한 최신 버전을 다운로드 하여 원하는 위치에 저장합니다. github.com/g-truc/glm/releases

 

저는 편하게 내 문서\Visual Studio 2019\Libraries\glm 에 압축을 풀겠습니다.

5. Visual Studio 설정

이제 모든 종속성을 설치했으므로, Vulkan용 Visual Studio 프로젝트를 설정하고 약간의 코드를 작성합니다.

 

빈 프로젝트를 만들고, main.cpp를 추가합니다.

그리고 다음과 같은 코드를 작성합니다.

코드를 이해하려고 하지 않아도 됩니다. Vulkan 애플리케이션이 컴파일 & 실행이 가능한지 확인하기 위해서 입니다.

 

#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>

#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>

#include <iostream>

int main() {
    glfwInit();

    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
    GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);

    uint32_t extensionCount = 0;
    vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);

    std::cout << extensionCount << " extensions supported\n";

    glm::mat4 matrix;
    glm::vec4 vec;
    auto test = matrix * vec;

    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();
    }

    glfwDestroyWindow(window);

    glfwTerminate();
}

아마 오류가 많이 뜰겁니다. 이제 오류를 제거하도록 프로젝트를 구성해보겠습니다.

위의 프로젝트 -> 프로젝트 속성 으로 진입합니다.

모든 구성 / 모든 플랫폼으로 변경합니다.

 

자신이 설치한 Vulkan, GLFW, GLM 헤더 디렉토리를 추가합니다.

 

다음으로 링커 -> 일반에서 Vulkan, GLFW 라이브러리를 추가합니다.

 

다음은 링커 -> 입력 으로 이동하여 종속성을 추가합니다.

 

마지막으로 C++17 기능 이상을 지원하도록 컴파일러를 변경합니다.

작성자같은 경우 C++20의 기능도 사용할 것 이므로 C++latest로 사용합니다.

 

 

아마 제대로 설정했다면, 더 이상 오류가 나지 않을 겁니다.

64비트로 변환하여, 빌드하고 결과를 확인합니다.

 

0 extensions supported가 아니면 됩니다.

축하합니다. 이로써 Vulkan을 개발할 준비가 완료되었습니다.