2023. 1. 8. 23:54ㆍ개발얘기/vulkan

프로젝트 목표
- vulkan 튜토리얼 이해하면서 진도 나가기
- 튜토리얼 다 끝나면 그 다음부터 머할지 생각해보기
일단 시작은 해보지만 얼마나 꾸준히 올릴지 나도 모르겠다. 좀 긴 여정이 될것 같다.
vulkan을 고른 이유는 단지 호환성 때문이다.
집에서 윈도우 데스크탑으로도 하다가 답답하면 카페나가서 맥북으로도 하고 싶다 (아직 안샀지만)
스타벅스에서 맥북으로 그래픽스 프로그래밍을 하는 나.. 왠지 간지날 것 같다.
일단 셋팅부터 시작해보자.
Window
SDK를 다운받는다. 왠만하면 찾기쉽게 기본경로로 설치하자.
LunarXchange
LunarG uses cookies on our site to help us deliver the best user experience. Review our Privacy Policy for more information. Do you accept cookies? Yes
vulkan.lunarg.com

설치 후 "설치경로>Bin>vkcube.exe"를 실행하여 vulkan이 잘 돌아가는지 확인한다. 오류가 난다면 구글창에 vulkan driver 검색해서 설치하면 된다.
Bin 폴더는 실행파일과 로더의 배포용 빌드가 들어있다. $PATH 환경변수에 추가된다. VK_SDK_PATH가 환경변수에 추가돼 SDK경로가 지정된다. 만약 여러 버전의 SDK를 설치했다면 환경변수는 가장 최근 버전의 SDK를 지정한다.
Windows 플랫폼에 따라 로더(vulkan-1.dll)는 32bit 또는 64bit DLL이 추가된다.

그다음 GLFW를 설치한다.
An OpenGL library
GLFW project home page.
www.glfw.org

ㅇ...이게 먼ㄷㅔ 다짜고짜 설치하래 .. 라는 생각이 들어서 검색을 해봤다.
옛날 OpenGL 시절로 돌아간다.
OpenGL은 의도적으로 플랫폼 종속성 배제를 위해 윈도우 생성 및 관련 이벤트, 컨텍스트 처리를 API에 포함하지 않았다.
그래서 플랫폼을 지원하는 GUI API의 도움을 받아야 한다. 그게 이 c 기반 경량 유티리티 라이브러리인 GLFW다..
궁금해졌다. GLFW은 맨처음에 어떤마음으로 만들어졌을까? 계획된 개발이었을까 화나서 시작한 개발이었을까?
DirectX12와 달리 Vulkan에는 선형대수 연산을 위한 라이브러리가 포함되지 않다고 한다. 그래서 GLM 이라는 수학 라이브러리를 추가한다. GLSL 기반이고 기능과 네이밍이 비슷하다고 한다.
Releases · g-truc/glm
OpenGL Mathematics (GLM). Contribute to g-truc/glm development by creating an account on GitHub.
github.com
이제 필요한 설치는 다 끝났다. 본격적으로 프로젝트를 만든다. 프로젝트 타입은 windows 데스크톱 마법사를 고르고, 디버깅 메시지를 확인 할수 있도록 콘솔 애플리케이션을 선택한다.


그리고 우리가 설치했던 외부 dll과 header 폴더를 추가해야 한다. 나는 찾기 쉽게 glfw와 glm 폴더는 솔루션 폴더의 하위 폴더로 넣었다.
모든 구성 설정 상태에서 프로젝트 속성 > C/C++ > 일반 > 추가 포함 디렉터리

vulkan, glm, glfw의 헤더 디렉터리 경로를 추가한다.
그다음 추가 라이브러리 디렉토리를 등록한다.

프로젝트 속성 > 링커 > 일반 > 추가 라이브러리 디렉터리

glfw는 -vc20xx로 끝나는 폴더들이 여러개 있는데, 본인의 비주얼 스튜디오 버전을 입력하면 된다. glm은 헤더 전용 라이브러리이므로 추가하지 않아도 된다.

링커 > 입력 > 추가 종속성

lib 파일 이름을 입력한다.

이 vulkan-1.lib에 머가 있냐면.. 먼저 세가지 개념에 대해 알아야 한다.
- ICD : Installable Client Driver. Vulkan 호환 디스플레이 드라이버를 의미한다. NDIVIA와 Intel 드라이버를 동시에 충돌없이 운용할수 있다고 한다.
- Layer : 필요에 따라 추가해 사용하는 부분으로, Vulkan의 커맨드를 중간에 가로챌 수 있다. 디버깅, 유효성 검증, 추적 등의 목적으로 사용한다.
- Loader : 플랫폼에 독립적인 방법으로, 디스플레이 드라이버의 위치를 확인하여 레이어 라이브러리를 노출한다.
Window 시스템에서 로드 라이브러리 (vulkan-1.dll)는 레지스트리를 사용해 ICD 위치와 레이어를 설정한다.
마지막으로 C++17 기능을 지원하도록 컴파일러를 변경한다.

이제 진짜 세팅은 끝났다. tutorial에서 진행하는 샘플코드를 실행해보자.
나는 몇번 경로를 잘못 세팅하거나 잘못 다운받아서 처음부터 다시했다 ㅋㅋ
이제 궁금하니까 Demo 프로젝트도 실행시켜 보고싶다.
Vulkan 설치 경로의 Demos\Demos.sln 폴더를 실행시켜서 빌드를 돌려본다.
당연히 한번에 빌드 되지는 않는다.

그냥 x64 로 빌드 설정 바꾸면 된다 ^.^

샘플코드로 흥미로움과 동시에 코드읽기 귀찮게 만드는 것은 플랫폼 호환관련 코드이다.
하나의 코드로 여러 플랫폼이 호환되는 코드를 짜니 엄청 길어진다.
보니까 거의 전처리기로 확장성이 보장되고 있었다.
창 생성하는 코드로 예를 들면,
// Create a WSI surface for the window:
#if defined(VK_USE_PLATFORM_WIN32_KHR)
{
auto const createInfo = vk::Win32SurfaceCreateInfoKHR().setHinstance(connection).setHwnd(window);
auto result = inst.createWin32SurfaceKHR(&createInfo, nullptr, &surface);
VERIFY(result == vk::Result::eSuccess);
}
#elif defined(VK_USE_PLATFORM_WAYLAND_KHR)
{
// ...
}
#elif defined(VK_USE_PLATFORM_XLIB_KHR)
{
// ...
}
// 기타 다른 플랫폼도 ..
#endif
저 각 플랫폼이 뭐를 뜻하는지는 stackoverflow를 찾아봤다.
• VK_USE_PLATFORM_ANDROID_KHR - Android
• VK_USE_PLATFORM_WIN32_KHR - Microsoft Windows
• VK_USE_PLATFORM_MIR_KHR - Mir
• VK_USE_PLATFORM_WAYLAND_KHR - Wayland
• VK_USE_PLATFORM_XCB_KHR - X Window System, using the XCB library
• VK_USE_PLATFORM_XLIB_KHR - X Window System, using the Xlib library
안드로이드와 win32 제외한 애들은 리눅스 관련이라 아직은 몰라도 된다.
Mac으로 다운받으면 어떤 종류가 있을지 궁금하다. (후에 맥북 사면 보겠다)
그럼 오늘은 여기까지

참조
- 처음 만나는 Vulkan - 파르민더 싱
- 튜토리얼 홈페이지 (https://vulkan-tutorial.com/Development_environment)
'개발얘기 > vulkan' 카테고리의 다른 글
[VULKAN]4. Window Surface (0) | 2023.01.17 |
---|---|
[VULKAN] 3. Device 초기화 (0) | 2023.01.16 |
[VULKAN] 2. Instance 초기화 (2) | 2023.01.10 |
[VULKAN] 1. GLFW 초기화 (0) | 2023.01.09 |