상세 컨텐츠

본문 제목

OpenGL과 GLFW 새 창 열기 튜토리얼

프로그래밍

by 경밤 2020. 8. 10. 22:26

본문

반응형

OpenGL은 출력해주고 GLFW는 만들어준다. 즉, GLFW가 만든것을 OpenGL이 출력해준다는 것이다.

GLFW는 입력과 출력을 하며 창을 만들어주고, OpenGL에서는 그것을 모니터에 그려준다.

모든 프로그래밍의 기초는 오류 처리이다. 먼저 알고 넘어가자

0. 오류 처리 error handling

#include <stdio.h>
#include <stdlib.h>

위 두가지 헤더의 fprintf와 stderr(표준 오류)로 오류를 기본 출력 매체인 모니터(console, 콘솔)로 출력하겠다.

fprintf( stderr, "Failed to .....\n" );

이러한 형식이 되겠다.

 

1. opengl 헤더와 glfw 헤더 파일 추가

#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
using namespace glm;

이로써 입력을 받으며 창을 생성할 수 있으며, 모니터에 출력할 수 있겠다.

 

2. 창 생성 및 초기화

GLFWwindow* window;

전역변수로써 GLFWwindow 포인터 변수를 선언한다.

if( !glfwInit() )
{
	fprintf( stderr, "GLFW를 초기화 하는 것에 대해 실패하였습니다.\n" );
	getchar();
	return -1;
}

glfw를 초기화 한다.

glfwWindowHint(GLFW_SAMPLES, 4); //안티엘리어싱 4배(멀티 픽셀 샘플링)
glfwWindowHint(GLFW_RESIZABLE,GL_FALSE); //창 크기 조절
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //최대 버전 요구
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //최소 버전 요구
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //향후 지원되지 않는 것은 제외함을 의미

간단하게 내부 설정 할 수 있다.

window = glfwCreateWindow( 1024, 768, "GLFW 윈도우", NULL, NULL);
if( window == NULL ){
	fprintf( stderr, "GLFW 창을 여는데에 실패했습니다.\n" );
	getchar();
	glfwTerminate();
	return -1;
}

이렇게 하여 창을 생성 할 수 있다.

glfwMakeContextCurrent(window);
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

무슨 GLFWwindow를 사용할지 설정 하며, window에 대해서 입력 받음을 설정한다. 그리고 배경을 초기화 한다.

do{
	glClear(GL_COLOR_BUFFER_BIT);
		
	glfwSwapBuffers(window);
	glfwPollEvents();
}
while( glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS
	&& glfwWindowShouldClose(window) == 0);
    
glfwTerminate();
return 0;

창을 유지하며, glfwGetKey로 키 입력 여부를 받는다.

glfwTerminate를 이용하여 창을 닫을 수 있다.

 

3. Key callback

glfw에는 key callback을 설정하여서 키 입력 부분을 따로 떼어내 다른 함수에서 처리 할 수 있다.

glfwSetKeyCallback 함수로 설정 가능하며 매개변수로 GLFWwindow 포인터와

GLFWwindow* window, int key, int scancode, int action, int mods

위의 매개변수를 가지는 함수를 받는다.

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
	if (key == GLFW_KEY_E && action == GLFW_PRESS) {
		printf("E Pressed\n");
	}
	if (key == GLFW_KEY_Q && action == GLFW_RELEASE) {
		printf("Q Released\n");
	}
}

간단하게 key callback을 작성했다.

glfwSetKeyCallback(window, key_callback);

위 코드 조각을 창 생성 코드 아래에 위치시켜주자.

 

#include <stdio.h>
#include <stdlib.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
using namespace glm;

GLFWwindow* window;

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
	if (key == GLFW_KEY_E && action == GLFW_PRESS) {
		printf("E Pressed\n");
	}
	if (key == GLFW_KEY_Q && action == GLFW_RELEASE) {
		printf("Q Released\n");
	}
}


int main()
{
	// Initialise GLFW
	if( !glfwInit() )
	{
		fprintf( stderr, "GLFW 초기화 실패\n" );
		getchar();
		return -1;
	}

	glfwWindowHint(GLFW_SAMPLES, 4); //안티엘리어싱 4배(멀티 픽셀 샘플링)
	glfwWindowHint(GLFW_RESIZABLE,GL_FALSE); //창 크기 조절
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //최대 버전 요구
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //최소 버전 요구
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //향후 지원되지 않는 것은 제외함을 의미

	//창 열기
	window = glfwCreateWindow( 1024, 768, "Window", NULL, NULL);
	if( window == NULL ){
		fprintf( stderr, "GLFW 창 열기 실패\n" );
		getchar();
		glfwTerminate();
		return -1;
	}
	//현재 무슨 window를 사용할지 설정
	glfwMakeContextCurrent(window);

	//window 창에 대해서 입력받기 설정
	glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

	//키 입력 콜백 설정
	glfwSetKeyCallback(window, key_callback);

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

	do{
		glClear(GL_COLOR_BUFFER_BIT);

		
		glfwSwapBuffers(window); //더블 버퍼링, 버퍼 교체
		glfwPollEvents(); //설정한 콜백들(key callback.. etc) 호출

	}
	while( glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS
		&& glfwWindowShouldClose(window) == 0);

	glfwTerminate();

	return 0;
}

전체코드입니다.

반응형

관련글 더보기