본문 바로가기

Vulkan

Development environment

이전 글 : Overview

다음 글 : Drawing Triangle - Base code


Development environment


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


Windows


Windows 용으로 개발하는 경우 Visual Studio 2013 또는 2015를 사용하여 코드를 컴파일 한다고 가정 합니다. 단계는 두 버전에서 동일 하지만 Vulkan SDK에는 현재 Visual Studio 2013과 호환되는 디버그 기호 만 포함됩니다. 실제로는 문제가 아니지만 사용자가 고려해야 할 사항 입니다



Vulkan SDK


Vulkan 응용 프로그램 개발에 필요한 가장 중요한 구성 요소는 SDK 입니다. 여기에는 헤더 파일들과 표준 유효성 검사 레이어, 디버깅 도구 및 Vulkan 기능을 로딩 하기위한 로더가 포함 됩니다. 로더는 런타임시 GLEW for OpenGL과 유사하게 드라이버의 기능을 필요로 합니다


SDK는  LunarG 웹 사이트 의 다온로드 사이트에서 다운로드 할 수 있습니다. 계정을 만들 필요는 없지만 계정을 만들거나 있다면 더 많은 유용한 추가적인 문서에 접근 할 수 있습니다.



설치를 진행 하는데 있어서  SDK의 설치 위치에 주의 하십시오. 가장 먼저 할 일은 그래픽 카드와 드라이버가 Vulkan을 올바르게 지원하는지 확인하는 것입니다. SDK를 설치 한 디렉토리로 이동하여 Bin32 디렉토리를 열고 cube.exe 데모를 실행하십시오. 다음과 같은 화면이 나와야 합니다.



만약 오류 메시지가 나타나면 그래픽 드라이버가 최신인지 확인 하고 Vulkan 관련 런타임 파일(DLL 파일들)들과 그래픽 카드가 지원 되는지 확인 하십시오. 주요 공급 업체의 드라이버 링크는 http://vulkan.gpuinfo.org/NVIDIA, AMD, Intel 를 참조 하십시오.


Vulakn SDK 디렉토리에는 개발에 유용한 다른 두 개의 프로그램이 있습니다.

vkjson_info.exe 프로그램은 Vulkan을 사용할 때 하드웨어의 기능에 대한 자세한 설명과 함께 JSON 파일을 생성합니다.

최종 사용자의 그래픽 카드 중에서 어떤 확장 기능과 다른 옵션 기능을 지원하는지 궁금 하다면 이 웹 사이트를 사용하여 다양한 GPU 결과를 볼 수 있습니다.


glslangValidator.exe 프로그램은 사람이 읽을 수 있는 GLSL 프로그래밍 소스 파일 에서 바이트 코드로 셰이더를 컴파일하는 데 사용 됩니다.

이것은 셰이더 모듈 설명하는 페이지에서 자세히 다룰 것입니다. 또한 Bin32 디렉토리에는 Vulkan 로더와 유효성 검사 계층의 바이너리가 들어 있으며 Lib32 디렉토리에는 라이브러리가 들어 있습니다.


Doc 디렉토리에는 Vulkan SDK에 대한 유용한 정보와 전체 Vulkan 사양의 오프라인 버전 문서들이 들어 있습니다.


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




GLFW


앞서 언급 했듯이 Vulkan 자체는 플랫폼 종속되지 않는  API이며 렌더링 된 결과를 표시하기 위한 창(window)을 만드는 도구는 포함하고 있지 않습니다.

Vulkan의 크로스 플랫폼 이점을 활용하고 Win32의 공포를 피하기 위해 GLFW 라이브러리를 사용하여 Windows와 Linux를 모두 지원하는 창을 만듭니다.

이 목적을 위해 SDL과 같은 다른 라이브러리도 있지만 GLFW의 장점은 창 생성 외에 Vulkan의 다른 플랫폼 관련 사항을 추상화하고 이를 지원 한다는 것입니다.


GLFW의 최신 버전은 공식 웹 사이트에서 찾을 수 있습니다. 이 튜토리얼에서는 32 비트 바이너리를 사용 하겠지만 물론 64 비트 모드로 빌드 하도록 선택할 수도 있습니다. 이 경우 Bin 디렉토리의 Vulkan SDK 바이너리와 연결 하십시오.

다운로드 한 후 편리한 위치에 압축을 푸십시오. 필자는 문서 아래의 Visual Studio 디렉터리에 Libraries 디렉터리를 만들 것을 선택 했습니다.




GLM


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


GLM은 헤더 전용 라이브러리이므로 최신 버전을 다운로드하여 편리한 위치에 저장 하십시오. 다음과 유사한 디렉토리 구조가 있어야 합니다.


Setting up Visual Studio


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


Visual Studio를 시작하고 새로운 C ++ Win32 프로젝트를 만듭니다.



[Next] 버튼을 클릭하고 응용 프로그램 유형으로 Console application을 선택하고 Empty project가 선택되어 있는지 확인 하십시오.



[Finish] 버튼을 눌러 프로젝트를 만들고 C ++ 소스 파일을 추가 하십시오. 당신은 이미 이러한  방법을 알고 있어야하지만, 이러한 단계는 여기에 혹시 모르는 사람을 위해 설명하고 있습니다.



이제 다음 코드를 파일에 추가하십시오. 지금 당장 그것을 이해 하려는 것에 대해 걱정하지 마십시오. 우리는 단지 당신의 개발 환경에 있어서 Vulkan 응용 프로그램을 컴파일하고 실행할 수 있는지 확인하는 중입니다. 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" << std::endl;

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

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

   glfwDestroyWindow(window);

   glfwTerminate();

   return 0;
}



이제 오류를 없애기 위해 프로젝트를 구성 해 봅시다. 대부분의 설정이 디버그 및 릴리스 모드에 모두 적용되므로 프로젝트 속성 대화 상자를 열고 모든 구성이 선택되어 있는지 확인 하십시오.




C ++ -> General -> Additional Include Directories로 이동하여 드롭 다운 상자에서 <Edit ...>를 누릅니다.



Vulkan, GLFW 및 GLM의 헤더 디렉토리를 추가합니다.



그런 다음 라이브러리 디렉토리에 대한 편집기를 엽니다.



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



Linker -> Input으로 이동하여 Additional Dependencies 드롭 다운 상자에서 <Edit ...>를 누릅니다.


Vulkan 및 GLFW 라이브러리 파일의 이름을 입력하십시오.




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


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



확장자의 수는 0이 아니어야 합니다. 축하합니다, 당신은 모두 Vulkan과 같이 놀 수 있습니다.


매번이 작업을 반복해야 하는 번거 로움을 피하려면 템플릿에서 템플릿을 만들면 됩니다. Visual Studio 2015에서 파일 -> 템플릿 내보내기 ... 또는 Visual Studio 2017에서 프로젝트 -> 템플릿 내보내기 ...를 선택한 다음 프로젝트 템플릿을 선택하고 템플릿의 멋진 이름과 설명을 입력하십시오.



마침을 누르면 새 프로젝트 대화 상자에 편리한 템플릿이 생깁니다. 이 도구를 사용하여 다음 챕터 준비를위한 Hello Triangle 프로젝트를 생성하십시오.





Linux


이 지침서는  Ubuntu 사용자를 대상으로 하지만 LunarG SDK를 직접 컴파일하고 apt 명령을 사용자에게 적합한 패키지 관리자 명령으로 변경하여 수행 할 수 있습니다.

이 프로세서를 진행하기 위해서는 최신의 C ++ (4.8 이상)을 지원하는 GCC 버전이 이미 설치되어 있어야 합니다. CMake와 make도 필요합니다.


Vulkan SDK


Vulkan 응용 프로그램 개발에 필요한 가장 중요한 구성 요소는 SDK입니다. 여기에는 헤더파일, 표준 유효성 검사 레이어, 디버깅 도구 및 Vulkan 기능의 로더가 포함됩니다. 로더는 OpenGL 용 GLEW와 마찬가지로 런타임에 드라이버의 기능을 호출하고 참조 합니다.


SDK는  LunarG 웹 사이트 의 다운로드 페이지 에서 다운로드 할 수 있습니다. 계정을 만들 필요는 없지만 유용한 추가 문서에 액세스 할 수 있습니다.



.run 스크립트를 다운로드 한 디렉토리에서 터미널을 열고 실행 가능하게 만들고 실행하십시오.


chmod +x vulkansdk-linux-x86_64-xxx.run
./vulkansdk-linux-x86_64-xxx.run



SDK의 모든 파일을 작업 디렉토리의 VulkanSDK 하위 디렉토리에 추출하십시오.

VulkanSDK 디렉토리를 접근하기 편리한 위치로 이동하고 해당 경로를 메모해 두십시오.

SDK의 루트 디렉토리에서 build_examples.sh와 같은 파일들이 있는 위치에서 터미널 디렉토리를 이동 합니다.


SDK의 샘플과 나중에 프로그램에 사용할 라이브러리 중 하나는 XCB 라이브러리에 따라 다릅니다. 이것은 X 윈도우 시스템과 인터페이스하는 데 사용되는 C 라이브러리입니다. 이들은 libxcb1-dev 패키지에서 Ubuntu에 설치할 수 있습니다. 또한 xorg-dev 패키지와 함께 제공되는 일반 X 개발 파일이 필요합니다.


sudo apt install libxcb1-dev xorg-dev


이제 다음을 실행하여 SDK에 Vulkan 예제를 빌드 할 수 있습니다.

./build_examples.sh


컴파일이 성공하면 ./examples/build/cube 실행 파일이 생성 됩니다. ./cube와 함께 examples / build 디렉토리에서 실행하고 다음과 같은 창이 표시되는지 확인하십시오.



오류 메시지가 나타나면 드라이버가 최신인지 확인하고 Vulkan 런타임 파일 및, 사용중인 그래픽 카드가 Vulkan을 지원 하는지 확인하십시오. 주요 공급 업체의 드라이버는 해당 공급업체 사이트를 참조 하시기 바랍니다.



GLFW


앞서 언급했듯이 Vulkan 자체는 플랫폼에 무관 한 API이며 렌더링 된 결과를 표시하는 창을 만드는 도구는 포함하지 않습니다.

Vulkan의 크로스 플랫폼 이점과 X11의 공포를 피하기 위해 GLFW 라이브러리를 사용하여 Windows와 Linux를 모두 지원하는 창을 만듭니다.

이 목적을 위해 SDL과 같은 다른 라이브러리도 있지만 GLFW의 장점은 창 생성 외에 Vulkan의 다른 플랫폼 관련 사항을 추상화한다는 것입니다.


Vulkan 지원에 최신 버전이 필요하기 때문에 패키지를 사용하는 대신 소스에서 GLFW를 설치합니다. 공식 웹 사이트에서 소스를 찾을 수 있습니다. 소스 코드를 편리한 디렉토리에 추출하고 CMakeLists.txt와 같은 파일로 디렉토리의 터미널을 엽니 다.


다음 명령을 실행하여 메이크 파일을 생성하고 GLFW를 컴파일 하십시오.


cmake .
make


Vulkan을 찾을 수 없다는 경고가 표시 될 수 있지만 이 메시지는 무시해도 됩니다. 컴파일이 성공하면 다음을 실행하여 시스템 라이브러리에 GLFW를 설치할 수 있습니다.


sudo make install



GLM


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


libglm-dev 패키지에서 설치할 수있는 헤더 전용 라이브러리입니다.

sudo apt install libglm-dev


makefile 프로젝트 설정하기


이제 모든 종속성을 설치 했으므로 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" << std::endl;

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

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

   glfwDestroyWindow(window);

   glfwTerminate();

   return 0;
}



다음으로 makefile을 작성 하여 이 기본 Vulkan 코드를 컴파일 하고 실행 합니다. Makefile이라는 새로운 파일을 만듭니다. 변수와 작성 규칙 및 작동 방식과 같은 것은  makefile에 대한 기본 경험이 이미 있다고 가정합니다. 그렇지 않은 경우 다의 의  자습서를 보시기 바라며 매우 빠르게 습득 하실 수 있습니다.


먼저 파일의 나머지 부분을 단순화하기 위해 몇 가지 변수를 정의합니다. LunarG SDK의 x86_64 디렉토리 위치를 나타내는 VULKAN_SDK_PATH 변수를 정의 하십시오. 예를 들면 다음과 같습니다.


VULKAN_SDK_PATH = /home/user/VulkanSDK/x.x.x.x/x86_64


다음으로 기본 컴파일러 플래그를 지정할 CFLAGS 변수를 정의 하십시오.


CFLAGS = -std=c++11 -I$(VULKAN_SDK_PATH)/include


최근의  C ++ (-std = c ++ 11 또는 std = c ++ 14)를 사용할 것이며 LunarG SDK에서 vulkan.h를 찾을 수 있어야 합니다.


마찬가지로 LDFLAGS 변수에 링커 플래그를 정의합니다.


LDFLAGS = -L$(VULKAN_SDK_PATH)/lib `pkg-config --static --libs glfw3` -lvulkan


첫 번째 플래그는 LunarG SDK의 x86_64 / lib 디렉토리에서 libvulkan.so와 같은 라이브러리를 찾을 수 있도록 지정합니다.

두 번째 구성 요소는 pkg-config를 호출하여 GLFW로 응용 프로그램을 빌드하는 데 필요한 모든 링커 플래그를 자동으로 검색하도록 합니다.

마지막으로 -lvulkan은 LunarG SDK와 함께 제공되는 Vulkan 함수 로더와 연결됩니다.


VulkanTest를 컴파일 하기 위한 규칙을 지정하는 것은 간단 합니다. 공백(Space) 문자 대신 들여 쓰기 용 탭(Tab 문자)을 사용해야 합니다.


VulkanTest: main.cpp
   g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS)


메이크 파일을 저장하고 main.cpp 및 Makefile이 있는 디렉토리에 make를 실행 하여이 규칙이 작동하는지 확인 하십시오. 이렇게 하면 VulkanTest 실행 파일이 생성됩니다.


우리는 이제 test와 clean이라는 두 가지 규칙을 정의 할 것이다. test와 clean은 전자가 실행 파일을 실행할 것이고 후자는 빌드 된 실행 파일을 제거 할 것이다.


.PHONY: test clean

test: VulkanTest
   ./VulkanTest

clean:
   rm -f VulkanTest


clean 작업을 완벽 하게 만들 수 있지만 다음과 같은 오류 메시지와 함께 테스트가 실패 할 가능성이 높습니다.


./VulkanTest: error while loading shared libraries: libvulkan.so.1: cannot open shared object file: No such file or directory


libvulkan.so가 시스템 라이브러리로 설치되지 않았기 때문입니다. 이 문제를 해결 하려면 LD_LIBRARY_PATH 환경 변수를 사용하여 라이브러리로드 경로를 명시 적으로 지정하십시오


test: VulkanTest
   LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib ./VulkanTest



이제 프로그램이 성공적으로 실행되고 Vulkan 확장 수가 표시 됩니다.

빈 창을 닫을 때 응용 프로그램이 성공 리턴 코드 (0)로 종료 되어야 합니다.


설정해야 할 변수가 하나 더 있습니다. Vulkan에서 유효성 검사 레이어를 사용하기 시작할 것이므로 Vulkan 라이브러리에 VK_LAYER_PATH 변수를 사용하여 로드 할 위치를 알려줘야 합니다.


test: VulkanTest
   LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/explicit_layer.d ./VulkanTest


이제 다음과 같은 완전한 makefile이 있어야 합니다.

VULKAN_SDK_PATH = /home/user/VulkanSDK/x.x.x.x/x86_64

CFLAGS = -std=c++11 -I$(VULKAN_SDK_PATH)/include
LDFLAGS = -L$(VULKAN_SDK_PATH)/lib `pkg-config --static --libs glfw3` -lvulkan

VulkanTest: main.cpp
   g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS)

.PHONY: test clean

test: VulkanTest
   LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/explicit_layer.d ./VulkanTest

clean:
   rm -f VulkanTest


이제이 디렉토리를 Vulkan 프로젝트의 템플릿으로 사용할 수 있습니다. 복사하여 HelloTriangle과 같은 이름으로 바꾸고 main.cpp의 모든 코드를 제거 하십시오.


계속하기 전에 Vulkan SDK에 대해 좀 더 살펴 보도록 하겠습니다.


개발에 매우 유용 할 두 가지 프로그램이 있습니다. x86_64 / bin / vkjson_info 프로그램은 Vulkan을 사용할 때 하드웨어 기능에 대한 자세한 설명과 함께 JSON 파일을 생성합니다.

최종 사용자의 그래픽 카드 중에서 어떤 확장 기능과 다른 옵션 기능을 지원하는지 궁금 하다면 이 웹 사이트를 이용하여 다양한 GPU 결과를 확인 할 수 있습니다.

이 프로그램은 자신의 프로그램과 동일한 LD_LIBRARY_PATH 변수로 실행해야 합니다.


LD_LIBRARY_PATH=../lib ./vkjson_info


x86_64 / bin / glslangValidator 프로그램은 사람이 읽을 수 있는 GLSL 소스에서 바이트 코드로 셰이더를 컴파일하는 데 사용됩니다. 이는 셰이더 모듈 설명에서 자세히 다룰 것입니다. 이 프로그램은 Vulkan 라이브러리에 의존하지 않습니다.


Doc 디렉토리에는 Vulkan SDK에 대한 유용한 정보와 전체 Vulkan 사양의 오프라인 버전이 들어 있습니다. 다른 파일도 자유롭게 탐색 할 수 있지만이 튜토리얼에서는 필요하지 않습니다.


이제 모든 것이 우리의 진짜 모험을위한 것입니다.


이전 글 : Overview

다음 글 : Drawing Triangle - Base code

'Vulkan' 카테고리의 다른 글

Setup - Validation layers  (0) 2018.01.21
Setup - Creating an instance  (0) 2018.01.20
Setup - Base code  (0) 2018.01.20
Overview  (0) 2018.01.19
Introduction  (2) 2018.01.19