전체 코드
#include<vulkan/vulkan.h>
#include<iostream>
int main()
{
// Vulkan 어플리케이션 정보를 설정하기.
VkApplicationInfo appInfo{};
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pApplicationName = "Hello Vulkan";
appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
appInfo.pEngineName = "No Engine";
appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
appInfo.apiVersion = VK_API_VERSION_1_3;
//Vulkan 인스턴스 생성 정보를 설정합니다.
VkInstanceCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pApplicationInfo = &appInfo;
// Vulkan 인스턴스를 생성합니다.
VkInstance instance;
VkResult result = vkCreateInstance(&createInfo, nullptr, &instance);
// 인스턴스 생성이 성공했는지 확인합니다.
if (result != VK_SUCCESS) {
std::cerr << "Failed to create Vulkan instance!" << std::endl;
return -1;
}
std::cout << "Vulkan instance created successfully!" << std::endl;
//Vulkan 인스턴스를 삭제합니다.
vkDestroyInstance(instance, nullptr);
return 0;
}
1. 헤더 파일 include
#include<vulkan/vulkan.h>
#include<iostream>
2. 어플리케이션 정보를 설정하기
// Vulkan 어플리케이션 정보를 설정하기.
VkApplicationInfo appInfo{};
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pApplicationName = "Hello Vulkan";
appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
appInfo.pEngineName = "No Engine";
appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
appInfo.apiVersion = VK_API_VERSION_1_3;
VkApplicationInfo를 찾아보니 구조체로 변수 선언하며 초기화 후 밑의 appInfo 내 요소들을 설정하지 않아도 작동은 하지만 Vulkan의 강점인 저레밸 개발을 위해 하나씩 설정해 보았다.
VERSION(1,0,0)은 초기값으로 적지 않아도 되는 값이지만 개발 중 변경이 필요할때 시각화에 필요하여 적어두었다.
보통의 예제에선 apiVersion 을 1_0으로 사용했지만 나는 현재 설치된 최신 버전에 맞춰 1_3으로 진행해보려고 한다.
3. 인스턴스 생성 정보를 설정하기
//Vulkan 인스턴스 생성 정보를 설정합니다.
VkInstanceCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pApplicationInfo = &appInfo;
이번 코드까지 적어보니 .sType은 구조체를 나타내는 상수값을 받으며 상수의 타입을 열거형 이름으로 잘 표현한 것을 보니 변수명을 직관적으로 잘 적는게 중요하다는 걸 항상 느끼게 된다.
어플리케이션 정보 구조체를 포인터로 전달하여 생성 정보를 설정했다.
4. 인스턴스 생성하기
// Vulkan 인스턴스를 생성합니다.
VkInstance instance;
VkResult result = vkCreateInstance(&createInfo, nullptr, &instance);
정보 구조체를 만들고 그 구조체를 생성정보 구조체에 저장했다면 인스턴스 변수를 만들고 생성 정보와 vkInstance 구조체를 사용하여 인스턴스화 해서 result에 입력.
5. 인스턴스 생성 성공 확인
// 인스턴스 생성이 성공했는지 확인합니다.
if (result != VK_SUCCESS) {
std::cerr << "Failed to create Vulkan instance!" << std::endl;
return -1;
}
std::cout << "Vulkan instance created successfully!" << std::endl;
인스턴스화에 성공한지 확인을 해야하기 때문에 작성
항상 생각하는 거지만 디버깅하면서 실제 어떻게 돌아가는지 알더라도 시각화하여 이해도를 2배로 늘리는 것이 중요하다.
6. 인스턴스를 삭제하기
//Vulkan 인스턴스를 삭제합니다.
vkDestroyInstance(instance, nullptr);
return 0;
인스턴스를 삭제하여 데이터를 관리하는 것은 중요하다 지금은 인스턴스가 적지만 저레벨로 작업해 나갈 것을 생각하면 항상 필요없어진 것들은 지워서 데이터를 조금이라도 더 아끼는 것이 중요하다.
느낀 점
OpenGl 기반으로 그래픽스를 학부에서 공부했을 때 많이 알게 됬다라고 생각했었는데 Unity 그래픽스로 HLSL 쉐이딩 코드 등을 사용해보며 많이 비슷했고 이러한 코드만으로 쉐이더들을 입혀 쓰는 것을 당연하다고 느꼈었는데 Vulkan을 처음 다뤄보니 학부에서나 Unity나 이미 다른 사람들이 편하게 만들어둔 엔진 위에서 다뤘었구나하는 생각이 들었다.
그렇기에 시간이 될 때마다 학습을 하며 그래픽스를 좀 더 알아가보고 싶어졌다.
'진행 중인 프로젝트 > Vulkan' 카테고리의 다른 글
Vulkan GPU 선택, 논리적 장치, 큐를 생성, 스왑체인 화면 출력 기본 구조 설정 (0) | 2024.11.17 |
---|---|
Vulkan 학습을 하며 알아야 할 점 (0) | 2024.11.15 |
Vulkan SDK 및 학습용 라이브러리 GLFW, GLM 환경변수 설정 - 2 (0) | 2024.11.15 |
Vulkan SDK 및 학습용 라이브러리 GLFW, GLM 환경변수 설정 - 1 (3) | 2024.11.15 |