GLFW
윈도우 창 & 사용자 입력 등등..을 해결하기 위한 라이브러리
크로스 플랫폼이며 OpenGL, Vulkan과 함께 사용이 가능하다.
(이전에는 glut를 많이 썼는데, 이건 업데이트가 더이상 안되고 있다. 오픈 소스가 아니라서 소스 코드를 볼 수 없기도 하고, OpenGL만 되서 이젠 잘 안쓰는 것 같다. 예전에 그래픽스 수업 때.. glut 썼던 것 같은데)
An OpenGL library
GLFW project home page.
www.glfw.org
GitHub - glfw/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input
A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input - GitHub - glfw/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input
github.com
소스 코드 살펴보니.. CMakeLists에서 win32, posix, wl, x11 등등 플랫폼에 맞는 헤더 & 소스 파일만 빌드하는 것 같다.
(ex. win32_window.c, cocoa_window.m 처럼 되어있다.)
나중에 소스 코드 분석도 해보자(쓰면서 PR도 날려보면 좋을듯)
mac에선
#if defined(__OBJC__)
#import <Cocoa/Cocoa.h>
요렇게 코코아 헤더 포함해서 쓴다. 구조 재밌는듯(glfw/glfw3native.h에서 플랫폼에 맞게 분기 처리 되어있음)
쓰읍.. API 좀 정리해보려 이 페이지 만들었는데.. 생각보다 양이 많고 사이트에 이미 정리가 잘 되어 있는 듯하다.
어려웠거나 생소한 API들만 내 언어로 작성해두도록 한다.
- int _glfwInit()
- 내부에서 loadLibraries, createKeyTables, createHelperWindow 등등 수행한다.
- GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share)
- 모니터는 내가 아는 그 모니터..(오.. 모니터 갯수, 이름, 콜백 등등 함수가 많다 굿)
- share는 window를 복사하는? 개념같다.
- void glfwPollEvents(void)
- 키보드 or 마우스 입력 등이 큐에 쌓여있다가 이 함수가 호출되면 이 때 처리함
- 보통 콜백을 등록해서, 이 콜백들이 수행되는 구조
- void glfwMakeContextCurrent(GLFWwindow* window)
- glfwCreateWindow를 통해 윈도우를 만들면 기본적으로 OpenGL context도 함께 만들어둔다.(Vulkan을 쓸 땐,, 비효율적이 아닌가..?)
- GL 함수들이 context가 하나일 때만 가정하고 구현된 함수들이여서, 이런식으로 현재 draw할 context를 지정해주어야할 필요가 있다.
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3)
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3)
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)
- glfwWindow 만들기 전에 호출 필요
- OpenGL 버전을 설정할 수 있다.
- 지원 불가 버전(ex. 1.1)을 설정하면 createWindow가 실패하고, 이를 방지하기 위해서 GLFW_OPENGL_ANY_PROFILE, GLFW_OPENGL_COMPAT_PROFILE을 셋팅하면 벤더가 제공하는 최신 버전이 설정된다.
- glfwSwapBuffers
- glfw는 더블 버퍼링 사용중(front, back)
- vulkan은 사용하지 않음(vkQueuePresentKHR을 참조)