윈도우 창 띄우기

2023. 1. 5. 02:17컴퓨터 그래픽스

openGL 에서 윈도우창을 띄우기 위해서 여러 라이브러리의 도움을 받아야한다. 

glad 라이브러리와 glfw 라이브러리가 필요하다 해당 라이브러리는 인터넷 검색을 통해 받을 수 있으므로 찾아서 다운 받아야한다.

 

glfw는 openGL API이긴 하지만 설계도에 불과하다. openGL은 그래픽을 그리기 위해서 어떤 특성들이 필요한지만 명시해놓은 api이라는 것이다.

 

GLFW

openGL을 이용할 때 window를 띄운다거나, 마우스를 입력받는다거나 할 때, 운영체제마다 방식이 다를 수 밖에 없다. 이렇게 운영체제마다 구현을 다르게 하는 방법이 번거롭기 때문에 GLFW 라이브러리는 각기 플랫폼들에 맞는 기능을 주는 라이브러리이다.

GLAD

openGL 는 설계도일 뿐이라 실제 구현은 매우 다양하다. 그리고 그런 구현들에 맞게 openGL도 버전에 따라 발전해왔는데 버전이 너무 다양하여 찾아서 쓸 수 있도록 주소 \ (포인터)로 저장하게 된다. 또 포인터에 접근하는 방법들은 os마다 다른데 이런 방법들을 도와주는 것이 GLAD 라이브러리이다. 

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <stdio.h>
#include <iostream>

int main(void)
{
	glfwInit(); // glfw 초기화한 후에 진행
	glfwWindowHint(GLFW_SAMPLES, 8); // multisampling 을 가능하게 하는 함수 -> 8은 subsamples로 각 픽셀이 8개씩의 pixel을 갖는다는 것이다.
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //opengl version 3.x
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //opengl version x.3
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //지원하지 않는 함수들 제외

	GLFWwindow* window = glfwCreateWindow(800, 600, "YJS", NULL, NULL); // 띄울 윈도우 크기와 이름 설정 -> null이 나올 수 있으므로 받아줘야함
	if (window == NULL) {
		std::cout << "Fail to create window";
		glfwTerminate(); // 윈도우가 켜지면 꺼주기도 해야함 memeory 누수 제거
		return -1;
	}
	glfwMakeContextCurrent(window); //현재 어떤 window를 'double buffer'로 사용할 것인지

	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) // glad 초기화 이후에 'call back' 함수들을 이용할 수 있다.
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

	while (!glfwWindowShouldClose(window)) {
		glfwPollEvents(); // window가 꺼지지 않았다면 계속 키보드 입력 같은 어떠한 이벤트가 남아있는지 확인한다
	}
	glfwDestroyWindow(window); // 윈도우를 꺼준다
	glfwTerminate(); // glfw 끈다
}
double buffer

화면에 그려줄 때 깜빡임을 방지하기 위해서 두개의 화면에서 그려줘서 완성하면 보여지는 화면에 베껴내는 것을 말한다.

그리고 지우고를 반복하면 깜빡거릴텐데 이런 것을 방지한다.

call back 함수

인자로 함수 포인터(주소)를 받는 것이다. 함수 주소로 넘어간 다음 정해진 함수를 실행