OpenGL

[OpenGL] GLFW 설명과 설치

usingsystem 2024. 3. 29. 10:55
728x90

OpenGL을 사용하여 그래픽 애플리케이션을 만들 때 유용하게 활용됩니다. GLFW는 크로스 플랫폼이며, 창 생성, 입력 처리, OpenGL 컨텍스트 생성 및 관리 등의 기능을 제공합니다.

 

다양한 윈도우 시스템(x window, macintosh, microsoft windows...)등 다양한 윈도우 시스템에서 작동하는 추상적 윈도우 시스템을 만든다. 단점으로는 모든 윈도우 시스템에 공통인 기능만 제공한다.

 

대화형 프로그램으로 입력->처리->출력의 무한 반복을 수행한다.(출력 결과를 보고 다시 새로운 입력)

결국 이런 대화형 프로그램은 이벤트 루프 모델을 따라간다.

 

main loop가 무한 반복 하며 callback 함수를 미리 등록하여 사용한다.

  1. input event 발생 여부 체크(unity의 update처럼) 
  2. evnet발생시 대응되는 처리
  3. 결과 출력

설치 URL http://www.glfw.org

 

An OpenGL library

GLFW project home page.

www.glfw.org

URL를 타고 들어가면 주황색 버튼의 Download GLFW가 있다 이거 말고 상단 타이틀에 Download를 클릭한다.

운영체제에 맞게 선택하여 다운로드한다.

다운로드 받은 압축파일을 열어보면 아래와 같다 비쥬얼스튜디오(vc) 버전에 따라 lib가 존재한다.

적합한 컨파일러 버전을 선택한다.

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\xx.yy.zzzzz으로 이동한다.

bin, include, lib에 다운받은 glfw의 압축 파일을 넣을 것이다. 우선 include먼저

다운받은 GLFW를 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include

에 넣어준다. 이렇게 하면 #include<GLFW/glfw3.h>사용 가능하다.

다운받은 glfw include
GLFW를 등록

다음은 lib폴더로 들어간다.

glfw3.lib, glfw3_mt.lib, glfw3dll.lib 3개를 복사해준다.

다음은 bin 폴더로 들어간다.

glfw3.dll를 복사한다.

테스트

아래 창이 뜨면 성공

#include <GLFW/glfw3.h>
#pragma comment(lib, "glfw3.lib")

const unsigned int WIN_W = 300;
const unsigned int WIN_H = 300;
int main(void) {
	glfwInit();

	GLFWwindow* window = glfwCreateWindow(WIN_W, WIN_H, "Hello GLFW", NULL, NULL);
	glfwSetWindowPos(window, WIN_W, WIN_H);
	glfwMakeContextCurrent(window);//실제 출력

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

	glfwTerminate();

	return 0;
}

GLFW기능( https://www.glfw.org/documentation )

  1. initialization(초기화)
  2. window management(윈도우 관리)
  3. callback registration(콜백 등록)
    • 다양한 callback제공, 마우스, 키보드, 스크린 등의 이벤트 처리 가능
    • 자동호출 refresh callback(전체화면 출력할 때,  화면 축소 확대 등)

int glfwInit(void);

  • 초기화
  • return GLFW_TRUE if successful, GLFW_FALSE if any error.

void glfwTerminate(void);

  • termination(종료)
  • destroy all remaining windows and resources.

typedef void(*GLFWwindowrefreshfun)(GLFWwindow*win);

  • 콜백
    • GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* win, GLFWwindowrefreshfun func);

 

glfwInit();

  • glfw를 초기화

GLFWwindow* window = glfwCreateWindow(WIN_W, WIN_H, win_name, NULL, NULL);

  • 설정된 glfw 기반으로, Window의 크기를 설정 및 생성한 Window 반환하여 준다.

glfwSetWindowPos(window, WIN_X, WIN_Y);

  • 윈도우 시작위치

glfwMakeContextCurrent(window);

  • Double Buffer로 사용할 Window를 등록하는 함수이며, 등록되면 Thread로 설정되어 사용된다.

glfwSetWindowRefreshCallback(window, refreshFunc);

  • 도우 내용을 다시 그려야 할 때 호출되는 콜백 함수를 설정하는 데 사용됩니다.

!glfwWindowShouldClose(window)

  • 현재 window가 종료되었는지 확인하는 함수

glClear(GL_COLOR_BUFFER_BIT)

  • OpenGL에서 현재 버퍼를 지정된 값으로 클리어하는 함수 

glFinish()

  • 모든 OpenGL 명령이 완료될 때까지 대기

glfwPollEvents();

  • 현재 Frame의 입력 및 출력 이벤트를 모두 처리

glfwTerminate();

  • 사용된 메모리를 삭제하는 함수로 프로그램 종료되기 직전 반드시 호출해야함.
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glew32.lib")
#pragma comment(lib, "glfw3.lib")
#pragma warning(disable: 4711 4710 4100)
#include <stdio.h>
#include <string.h> // for strrchr()

const unsigned int WIN_W = 300; // window size in pixels, (Width, Height)
const unsigned int WIN_H = 300;
const unsigned int WIN_X = 100; // window position in pixels, (X, Y) 
const unsigned int WIN_Y = 100;

void refreshFunc(GLFWwindow* window) {
	// refresh
	printf("refresh called\n");
	fflush(stdout);
	glClear(GL_COLOR_BUFFER_BIT);//GL_COLOR_BUFFER_BIT은 색상 버퍼를 지워서 이전의 모든 픽셀 값을 삭제하고, 현재의 클리어 색깔로 설정합니다.
	glFinish();
	// GLFW action
	glfwSwapBuffers(window);//현재 Frame에 그려진 Buffer와 현재 Frame에 그려진 buffer를 swap(Double buffer)
}//

int main(int argc, char* argv[]) {
	// get your program name
#if defined(_WIN32) || defined(_WIN64)
	char* win_name = (strrchr(argv[0], '\\') == NULL) ? argv[0] : (strrchr(argv[0], '\\') + 1);
#else // Unix, Linux, MacOS
	char* win_name = (strrchr(argv[0], '/') == NULL) ? argv[0] : (strrchr(argv[0], '/') + 1);
#endif
	// start GLFW & GLEW
	glfwInit();// glfw를 초기화
	GLFWwindow* window = glfwCreateWindow(WIN_W, WIN_H, win_name, NULL, NULL);//설정된 glfw 기반으로, Window의 크기를 설정 및 생성한 Window 반환하여 준다.
	glfwSetWindowPos(window, WIN_X, WIN_Y);
	glfwMakeContextCurrent(window);//Double Buffer로 사용할 Window를 등록하는 함수이며, 등록되면 Thread로 설정되어 사용된다.
	glewInit();
	// prepare
	glfwSetWindowRefreshCallback(window, refreshFunc);//도우 내용을 다시 그려야 할 때 호출되는 콜백 함수를 설정하는 데 사용됩니다.
	glClearColor(0.5F, 0.8F, 0.8F, 1.0F);
	// main loop
	while (!glfwWindowShouldClose(window))//현재 window가 종료되었는지 확인하는 함수
	{
		// draw
		glClear(GL_COLOR_BUFFER_BIT);// OpenGL에서 현재 버퍼를 지정된 값으로 클리어하는 함수 
		glFinish();// 모든 OpenGL 명령이 완료될 때까지 대기
		// GLFW actions
		glfwSwapBuffers(window);
		glfwPollEvents();//현재 Frame의 입력 및 출력 이벤트를 모두 처리
	}
	// done
	glfwTerminate();//사용된 메모리를 삭제하는 함수로 프로그램 종료되기 직전 반드시 호출해야함.
	return 0;
}
728x90