[VULKAN] 1. GLFW 초기화

2023. 1. 9. 02:02개발얘기/vulkan

 

12시가 넘은 이 시간.. 내일은 출근이지만..

설치만 하고 잠들기가 아쉬워 좀 더 진행을 해본다. 

 

예제 코드 및 원문 튜토리얼은 여기서 확인 가능하다.


vulkan/vulkan.h를 직접 포함시켜도 되지만 GLFW 포함하기 전에 GLFW_INCLUDE_VULKAN을 선언하면

자동으로 vulkan.h를 로드한다.


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

 

또 나는 main.cpp가 지저분해지는게 싫어서 define.h 를 따로 만들었다.

 

//
// Define.h
//

#ifndef Define_h
#define Define_h

#pragma once

#include <iostream> 
#include <stdexcept>
#include <cstdlib> 

#endif /* Define_h */

 

아직은 다 오류 리포팅을 위한 헤더만 추가되있다.


GLFW  초기화

 

전체적인 코드는 튜토리얼에 다 나와있고, glfw 초기화 및 소멸을 살펴보겠다.

	void initWindow() {
		glfwInit();
		glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
		glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);

		window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "hey", nullptr, nullptr);
	}

맨 처음 glfwInit()을 호출하여 라이브러리를 초기화하고 Window 생성 가능한 상태로 설정해 준다.

 

GLFW는 주로 glfwWindowHint로 설정 가능하다. glfwCreateWindow가 호출되기 전까지 그 값을 보유하고 있다. 이게 엄격한 제약조건은 아니라서, 요청한 것과 다르게 설정될 수 있다고 한다.

 

void glfwWindowHint(int hint, int value);

  • hint : 설정하고자 하는 옵션, 여기에서 설정가능한 다양한 사항들을 확인 가능하다.
  • value: 옵션 값을 설정할 정수 

 

설정된 hint를 기반으로 window와 conterxt를 생성하고 생성된 window를 반환한다.

 

GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);

  • width, height : 윈도우 크기
  • title : 창 이름
  • monitor : 전체 화면으로 할 경우 window가 덮일 모니터를 지정해야 한다. 지정하지 않으면 창 모드가 된다.
  • share : openGL 에만 관련돼서 몰라도 됨

창을 만든 후에는 glfwSetWindowMonitor를 사용해서 창모드/전체화면 모드 전환도 가능하다.


GLFW 메인 루프

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

 

 

int glfwWindowShouldClose(GLFWwindow* window);

 

GLFW가 종료되도록 지시되었는지 확인한다. 지정된 윈도우의 close flag를 체크한다. 닫아야 하는 상황이면 설정돼있던 close flag(왜 int형일까?)가 true로 리턴된다.

이 close flag는  glfwSetWindowShouldClose로 명시적으로 설정할 수도 있다. (esc 키 누르면 창 꺼지는 거)

 

 

void glfwPollEvents(void);

 

현재 프레임의 입출력 이벤트를 모두 처리한다. 윈도우 상태를 업데이트하며 정해진 함수를 호출한다.


GLFW 해제

	void cleanup() {
		glfwDestroyWindow(window);
		glfwTerminate();
	}

창이 닫히면 glfw 리소스를 삭제하고 GLFW 자체를 종료하여 리소스를 정리해야 한다.

 

 

void glfwDestroyWindow(GLFWwindow *window)

 

지정된 윈도우와 컨텍스트를 해제한다. 이 함수를 호출하면 더 이상 콜백이 호출되지 않는다.

지정된 창의 컨텍스트가 메인 스레드에서 현재 상태 이면, 소멸되기 전에 분리된다.

 

 

void glfwTerminate(void)

 

사용된 메모리를 삭제한다. 반드시 프로그램을 종료하기 전 호출해야 한다.

 

 

이제 실행 해본다. "hey"라는 제목의 800 * 600짜리 텅빈 윈도우가 X버튼을 누를때까지 뜨고 있다.

근데 나는 답답한 창모드가 싫다.. 다음시간에 전체화면 모드도 설정해 보겠다.

 

 

여기까지 GLFW를 이용한 윈도우 설정을 진행하였다.

낯설지만 복잡하지 않아 좋았다.


졸려서 자러간다

'개발얘기 > vulkan' 카테고리의 다른 글

[VULKAN]4. Window Surface  (0) 2023.01.17
[VULKAN] 3. Device 초기화  (0) 2023.01.16
[VULKAN] 2. Instance 초기화  (2) 2023.01.10
[VULKAN] 0. 시작하기  (2) 2023.01.08