Scientia Conditorium

[Vulkan003][번역] Vulkan Tutorial - 개발 환경(Development environment) 본문

프로그래밍/컴퓨터 그래픽스

[Vulkan003][번역] Vulkan Tutorial - 개발 환경(Development environment)

크썸 2023. 11. 14. 01:06

원문 : https://vulkan-tutorial.com/Development_environment

[Vulkan003][번역] Vulkan Tutorial - 개발 환경(Development environment)

 

Development environment - Vulkan Tutorial

In this chapter we'll set up your environment for developing Vulkan applications and install some useful libraries. All of the tools we'll use, with the exception of the compiler, are compatible with Windows, Linux and MacOS, but the steps for installing t

vulkan-tutorial.com

 


이 장에서는 Vulkan 응용 프로그램 개발을 위한 환경 설정을 하고 몇 가지 유용한 라이브러리를 설치하겠습니다. 컴파일러를 제외한 모든 도구는 Windows, Linux 및 MacOS와 호환되지만 설치 단계가 약간 다르기 때문에 여기서는 별도로 설명하겠습니다.

 

Windows

Windows 용으로 개발하는 경우 Visual Studio를 사용하여 코드를 컴파일한다고 가정하겠습니다. C++ 17을 완벽하게 지원하려면 Visual Studio 2017 또는 2019를 사용해야 합니다. 아래 설명된 단계는 VS 2017용으로 작성되었습니다.


이 블로그에서는 Visual Studio 2022 버전을 사용하였습니다.

 

Windows - Vulkan SDK

Vulkan 응용 프로그램을 개발하는 데 필요한 가장 중요한 구성 요소는 SDK입니다. 여기에는 헤더, 표준 유효성 검사 레이어, 디버깅 도구 및 Vulkan 함수를 위한 로더가 포함됩니다. 로더는 런타임에 드라이버의 함수를 조회하며, 이는 OpenGL용 GLEW와 유사합니다(익숙한 경우).

 

SDK는 페이지 하단의 버튼을 사용하여 LunarG 웹사이트에서 다운로드할 수 있습니다. 계정을 만들 필요는 없지만 유용할 수 있는 몇 가지 추가 문서를 볼 권한을 얻을 수 있습니다.
(이 블로그 번역한 시점에 Vulkan SDK 버전은 1.3.268.0 입니다)

 

설치를 진행하면서 SDK의 설치 위치에 주의하세요. 가장 먼저 할 일은 그래픽 카드와 드라이버가 Vulkan을 제대로 지원하는지 확인하는 것입니다. SDK를 설치한 디렉토리로 이동하여 Bin 디렉토리를 열고 vkcube.exe 데모를 실행합니다. 아래처럼 큐브가 회전하는 화면이 표시되면 정상적으로 설치된 것입니다.
(기본 경로에 설치했다고 가정한다면 C:\VulkanSDK\Version\Bin\vkcube.exe)

 

오류 메시지가 표시된다면 드라이버가 최신상태인지, Vulkan 런타임이 포함되어 있는지, 그래픽 카드가 Vulkan을 지원하는지 확인해보세요. 그래픽 카드 주요 제조사의 드라이버 링크는 Introduction 챕터를 참조하세요. 

 

이 디렉토리에는 개발에 유용한 또 다른 프로그램이 있습니다. glslangValidator.exe 및 glslc.exe 프로그램은 쉐이더를 사람이 읽을 수 있는 GLSL에서 바이트 코드로 컴파일하는 데 사용됩니다. 이에 대해서는 쉐이더 모듈 장에서 자세히 다루겠습니다. Bin 디렉토리에는 Vulkan 로더의 바이너리와 유효성 검사 레이어가 있으며 Lib 디렉토리에는 라이브러리가 포함되어 있습니다. 

 

마지막으로 Vulkan 헤더가 포함된 Include 디렉토리가 있습니다. 다른 파일은 자유롭게 탐색해도 되지만 이 튜토리얼에서는 필요하지 않습니다. 

 

Windows - GLFW

앞서 언급했듯이 Vulkan 자체는 플랫폼에 구애받지 않는 API 이지만, 렌더링된 결과를 표시하는 창을 생성하는 도구가 포함되어 있지 않습니다. Vulkan 크로스 플랫폼 이점을 활용하고 Win32의 끔찍한 문제를 피하기 위해 GLFW 라이브러리를 사용하여 창을 생성할 것이며, 이 라이브러리는 Windows, Linux 및 MacOS를 지원합니다. SDL과 같이 창 생성을 위해 사용할 수 있는 다른 라이브러리도 있지만, GLFW의 장점은 창 생성 외에 Vulkan의 다른 플랫폼별 기능도 추상화한다는 것입니다. 

 

GLFW의 최신 릴리즈 버전은 공식 웹사이트에서 찾을 수 있습니다. 이 튜토리얼에서는 64비트 바이너리를 사용하지만 32비트 모드로 빌드할 수도 있습니다. 이 경우 Lib 디렉토리 대신 Lib32 디렉토리에 있는 Vulkan SDK 바이너리와 링크해야 합니다. 다운로드한 후 편리한 위치에 아카이브 압축을 풉니다. 여기서는 Visual Studio 디렉토리의 문서 아래에 라이브러리 디렉토리를 만들기로 선택했습니다. 

 

 

Windows - GLM

DirectX 12와 달리 Vulkan에는 선형 대수 연산을 위한 라이브러리가 포함되어 있지 않으므로 라이브러리를 다운로드해야 합니다. GLM은 그래픽 API와 함께 사용하도록 설계된 멋진 라이브러리이며 OpenGL에서도 일반적으로 사용됩니다. 

 

GLM은 헤더 전용 라이브러리이므로 최신 버전을 다운로드하여 편리한 위치에 저장하기만 하면 됩니다. 이제 다음과 비슷한 디렉토리 구조가 생겼을 것입니다. 

 

 

Windows - Visual Studio 설정(Setting up)

이제 모든 종속성 라이브러리들 설치했으므로 Vulkan용 기본 Visual Studio 프로젝트를 설정하고 모든 것이 작동하는지 확인하기 위해 약간의 코드를 작성할 수 있습니다.

 

아래 2개의 버전 중 원하시는 방법을 선택하시면 됩니다.

원문은 절대 경로로 프로젝트를 설정하고 이 블로그의 VS 2022 버전에서는 상대 경로로 설정합니다.

 

원문 : Visual Studio 2017/2019 버전 (더보기 클릭)

더보기

Visual Studio를 시작하고 이름을 입력한 후 확인을 눌러 새 'Windows 데스크톱 마법사' 프로젝트를 만듭니다. 

 

디버그 메시지를 인쇄할 위치가 있도록 응용프로그램 유형으로 콘솔 응용 프로그램(Console Application)(.exe)이 선택되어 있는지 확인하고, '빈 프로젝트(Empty Project)'를 선택하여 Visual Studio가 상용구 코드를 추가하지 못하도록 합니다. 

 

OK를 눌러 프로젝트를 생성하고 C++ 소스파일을 추가합니다. 이미 이 작업을 수행하는 방법을 알고 있을 것이지만, 완성도를 높이기 위해 여기에 이 단계를 포함시켰습니다. 

 

이제 파일에 아래 코드를 추가합니다. 지금 당장 이해하려고 노력할 필요는 없습니다. 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();

    return 0;
}

 

이제 오류를 제거하도록 프로젝트를 구성해보겠습니다. 대부분의 설정이 디버그 및 릴리즈 모드에 모두 적용되므로 프로젝트 속성 대화 상자를 열고 모든 구성(All Configurations)이 선택되어 있는지 확인합니다.

 

C/C++ → 일반(General) → 추가 포함 디렉터리(Additional Include Directories)로 이동하여 오른쪽 드롭다운 상자에서 <편집(Edit)...>을 누릅니다. 그리고 Vulkan, GLFW 및 GLM의 헤더 디렉토리를 추가합니다.

 

다음으로, 링커(Linker) → 일반(General)에서 라이브러리 디렉토리용 편집기를 엽니다.

그리고 Vulkan 및 GLFW용 라이브러리 파일의 위치를 추가합니다. 

 

링커(Linker) → 입력(Input)으로 이동하여 추가 종속성 드롭 다운 상자에서 <편집(Edit)...>을 누릅니다.

Vulkan 및 GLFW 라이브러리 파일의 이름을 입력합니다.

 

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

 


블로그 번역 : Visual Studio 2022 버전 (더보기 클릭)

더보기

Visual Studio 2022를 시작하고 '새 프로젝트 만들기'를 선택합니다. 

언어는 C++, 플랫폼은 Windows, 모든 프로젝트 형식(T)로 맞추고 '빈 프로젝트'를 누르고 '다음'으로 이동하세요.

프로젝트 이름은 본인 취향에 맞게 vulkanTutorial, vulkanTest, vulkanPractice 등등 원하시는 것으로 지으세요.

이 블로그에서는 'vulkanTW' 라고 지었습니다.

 

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();

    return 0;
}

 

아마 오류가 많이 뜰텐데, 하나하나씩 제거하도록 프로젝트를 설정해보겠습니다.

먼저 상단의 프로젝트(Proejct)  → 프로젝트 속성으로 진입합니다.

속성 페이지 창이 나오면 상단의 구성과 플랫폼을 모든 구성, 모든 플랫폼으로 선택합니다.

 

왼쪽 구성 속성에서 C/C++ → 일반 → 추가 포함 디텍터리 → <편집...>을 누릅니다.

<편집...> 버튼이 보이지 않는다면 '추가 포함 디텍터리'가 적혀있는 라인 끝에 마우스를 가져다보세요.

 

저의 경우 어느 컴퓨터에서든 빌드하여 작업할 수 있도록 상대경로로 입력할 것입니다.

따라서 위와 같은 '../include' , '../include/VULKAN' 이라고 디텍터리 경로를 입력합니다.

'../'의 의미는 현재 프로젝트가 시작되는 곳의 상위 폴더라는 뜻입니다.

 

그런 다음 C/C++ → 링커 → 일반으로 이동하여 '추가 라이브러리 디텍터리' 편집창을 열어줍니다.

위와 마찬가지로 상대 경로로 입력해줍니다.

여기서는 '../lib/glfw', '../lib/vulkan' 이라고 입력하여 GLFW 라이브러리와 Vulkan 라이브러리를 구분하였습니다.

 

다음으로 C/C++ → 링커 → 입력에서 추가 종속성 편집창을 열어줍니다.

여기에는 vulkan-1.lib, glfw3.lib 를 입력합니다.

 

마지막으로 C/C++ → 언어 → C++ 언어 표준에서 ISO C++ 17 표준을 선택합니다.

C++17의 기능을 별로 사용하고 싶지 않지만, 튜토리얼이기 때문에 그대로 따라하겠습니다.

 

이제 폴더 위치를 정리해야합니다.

먼저 Visual Studio 생성한 위치의 폴더를 엽니다. 솔루션과 프로젝트를 같은 위치에 두는 옵션을 선택하지 않았다면(기본 옵션) 솔루션 파일과 프로젝트 파일이 분리되어있을 겁니다.

여기서는 솔루션 파일이 있는 위치에 include, lib 폴더를 만들었습니다. 

dll은 신경쓰지 마세요

 

glfw와 vulkan을 구분하기 위해 lib, include 폴더 안에 각각 glfw, vulkan 폴더를 추가로 만들었습니다.

즉, 아래와 같이 폴더 구조가 이루어집니다.

glm이 빠져있지만 같은 방식으로 넣으면 됩니다.

이전에 다운로드 해두었던 GLFW 파일들에서 lib-vc2022 폴더에 있는 lib 파일들을 include/glfw 에 복사합니다.

GLFW include/GLFW 폴더 안에 있는 헤더파일들을 별도로 생성해둔 include/GLFW 폴더에 복사합니다.

 

마찬가지로 다운로드 해두었던 Vulkan 파일들에서 Include 폴더에 있는 모든 파일들을 include/VULKAN 폴더로,

Lib 폴더에 있는 모든 라이브러리들을 lib/vulkan 폴더로 복사합니다.

상대경로 설정이 어려우신 분들은 위의 VS 2017/2019 버전에서 절대경로로 어떻게 설정했는지 확인하신 후 편한 방법을 선택하시면 됩니다. 그래도 이해가 안된다면 이 블로그에 댓글을 남겨주세요.

 

glm 파일 역시 같은 방법으로 진행합니다.

 

이제 프로젝트 속성 대화 상자를 닫을 수 있습니다. 모든 작업을 올바르게 수행했다면 코드에서 더 이상 오류가 강조 표시되지 않아야 합니다.

마지막으로 실제로 64비트 모드에서 컴파일 하고 있는지 확인합니다. 

 

F5를 눌러 프로젝트를 컴파일하고 실행하면 명령 프롬프트와 다음과 같은 콘솔 창이 나타납니다.

확장자 수는 0이 아니어야 합니다.

축하합니다! 이제 Vulkan을 플레이할 준비가 완료되었습니다!

 

 

Linux

이 설명서는 Ubuntu, Fedora, Arch Linux 사용자를 대상으로 하지만 패키지 관리자별 명령을 자신에게 적합한 명령으로 변경하여 따라할 수 있습니다. 그리고 C++17(GCC 7+ 또는 Clang 5+)을 지원하는 컴파일러가 있어야 하며 CMake나 make 도 필요합니다. 

 

Linux - Vulkan Packages

Linux에서 Vulkan 응용 프로그램을 개발하는 데 필요한 가장 중요한 구성 요소는 Vulkan 로더, 유효성 검사 레이어, 머신이 Vulkan을 지원하는지 테스트하는 몇 가지 커맨드라인 유틸리티입니다. 

  • 커맨드라인 유틸리티, 가장 중요한 것은 vulkaninfo와 vkcube 입니다. 이 유틸리티를 실행하여 컴퓨터가 Vulkan을 지원하는지 확인하세요. 
sudo apt install vulkan-tools
또는
sudo dnf install vulkan-tools
  • Vulkan 로더를 설치합니다. 로더는 런타임에 드라이버의 함수를 조회하며, OpenGL용 GLEW와 유사합니다.
sudo apt install libvulkan-dev
또는
sudo dnf install vulkan-loader-devel
  • 표준 유효성 검사 레이어와 필수 SPIR-V 도구를 설치합니다. 이는 Vulkan 응용 프로그램을 디버깅할 때 매우 중요하며, 다음 장에서 자세히 설명하겠습니다.
sudo apt install vulkan-validationlayers-dev spirv-tools
또는
sudo dnf install mesa-vulkan-devel vulkan-validation-layers-devel

 

Arch Linux 에서는 'sudo panman -S vulkan-devel' 을 실행하여 위의 모든 필수 도구를 설치할 수 있습니다.

 

설치가 성공적으로 완료되었다면 Vulkan 부분이 모두 준비된 것입니다. vkcube를 실행하고 창에 큐브가 회전하는 그림이 나오는지 확인하세요. 오류 메시지가 표시되면 드라이버가 최신 상태인지, Vulkan 런타임이 포함되어 있는지, 그래픽 카드가 Vulkan을 지원하는지 확인하세요. 그래픽 카드 주요 제조사의 드라이버 링크는 Introduction 챕터를 참조하세요. 

 

 

Linux - GLFW

위 'Windows - GLFW' 설명과 동일

다음 명령으로 GLFW를 설치할 수 있습니다.

sudo apt install libglfw3-dev
or
sudo dnf install glfw-devel
or
sudo pacman -S glfw-wayland # glfw-x11 for X11 users

 

 

Linux - GLM

위 'Windows - GLM' 설명과 동일

이 라이브러리는 헤더 전용 라이브러리로, libglm-dev 또는 glm-devel 패키지에서 설치할 수 있습니다.

sudo apt install libglm-dev
or
sudo dnf install glm-devel
or
sudo pacman -S glm

 

 

Linux - 쉐이더 컴파일러(Shader Compiler)

쉐이더를 사람이 읽을 수 있는 GLSL에서 바이트 코드로 컴파일하는 프로그램이 필요하다는 것만 빼면 필요한 것은 거의 다 갖췄습니다.

 

널리 사용되는 쉐이더 컴파일러로는 크로노스 그룹의 glslangValidator와 Google의 glslc가 있습니다. 후자는 GCC 및 Clang과 유사한 사용법을 가지고 있으므로 Ubuntu에서 Google의 비공식 바이너리를 다운로드하고 glslc를 /usr/local/bin에 복사합니다. 권한에 따라 sudo를 실행해야 할 수도 있습니다. Fedora에서는 'sudo dnf install glslc'를 사용하고, Arch Linux에서는 'sudo pacman -S shaderc'를 실행합니다. 테스트하기 위해 glslc를 실행하면 컴파일할 쉐이더를 전달하지 못했다는 메시지가 표시됩니다. 

glslc: error: no input files

glslc에 대한 부분은 쉐이더 모듈 챕터에서 자세히 다루도록 하겠습니다.

 

 

Linux - makefile 프로젝트 설정(Setting up a makefile project)

이제 모든 종속성 요소를 설치했으므로 Vulkan용 기본 makefile 프로젝트를 설정하고 모든 것이 작동하는지 확인하기 위해 약간의 코드를 작성할 수 있습니다.

 

편리한위치에 VulkanTest와 같은 이름의 새 디렉토리를 만듭니다. 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();

    return 0;
}

 

다음으로 이 기본 Vulkan 코드를 컴파일하고 실행하기 위한 makefile을 작성하겠습니다. Makefile이라는 빈 파일을 새로 만듭니다. 변수와 규칙의 작동 방식과 같은 makefile에 대한 기본적인 경험이 이미 있다고 가정하겠습니다. 그렇지 않더라도 여기 makefile 튜토리얼 웹페이지를 통해 매우 빠르게 익힐 수 있습니다.

 

먼저 파일의 나머지 부분을 단순화하기 위해 몇 가지 변수를 정의하겠습니다. 기본 컴파일러 플래그를 지정하는 CFLAGS 변수를 정의합니다. 

 

최신 C++(-std=C++17)를 사용하고 최적화 수준을 O2로 설정하겠습니다. 프로그램을 더 빠르게 컴파일하기 위해 -O2를 제거할 수 있지만 릴리즈 빌드에는 다시 설정해야 한다는 점을 기억해주세요. 마찬가지로 링커 플래그를 LDFLAGS 변수에 정의합니다.

 


 

MacOS

이 블로그에서는 MacOS를 다루지 않습니다.

MacOS 유저는 Vulkan 보다 Metal API를 사용하길 권장드립니다.