앞으로 LearnOpenGL을 참고하여 OpenGL을 공부할 것이다.
OpenGL을 공부하는 이유는 컴퓨터 그래픽스의 파이프라인을 이해하는 것이다.

시작!


기본적인 세팅

// GLFW 초기 설정
    if (!glfwInit())
	{
		const char*	description = nullptr;
		glfwGetError(&description);
		return (putError("Failed to initialize glfw: " + std::string(description)));
	}
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

GLFW는 glfwinit()을 이용해 초기화된다.
기본적으로 하드웨어에서 호환되는 버전을 명시하여 사용해야 하고, OPENGL_PROFILE에 Core-profile을 사용하도록 명시한다.

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

Mac OS에서는 위의 코드를 추가해야 성공적으로 작동한다.

// GLFW를 이용한 Window생성
	GLFWwindow*	window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_NAME, nullptr, nullptr);
	if (!window)
	{
		glfwTerminate();
		return (putError("Failed to create glfw window"));
	}
	glfwMakeContextCurrent(window);
	
// GLAD 초기 설정
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		glfwTerminate();
		return (putError("Failed to initialize glad"));
	}

glfwCreateWindow()를 이용하여 현재 윈도우의 가로, 세로를 픽셀로 나타내고 윈도우의 프로그램 제목을 나타낸다.
glfwMakeContextCurrent()를 이용하여 내가 현재 만든 윈도우를 현재 창으로 설정하는 것이다.

void	OnFramebufferSizeChange(GLFWwindow* window, int width, int height)
{
	std::cout << "FrameBuffer size changed: (" << width << ", " << height << ")" << std::endl;
	glViewport(0, 0, width, height);
};

void	OnKeyEvent(GLFWwindow* window, int key, int scancode, int action, int mods)
{
	std::cout << "key: " << key << "\tscancode: " << scancode;
	std::cout << "\taction: " <<	(action == GLFW_PRESS ? "Pressed" : 
								(action == GLFW_RELEASE ? "RELEASE" :
								(action == GLFW_REPEAT ? "REPEAT" : "UNKNOWN")))
			<< "\tmods: " << (mods & GLFW_MOD_CONTROL ? "C" :
							(mods & GLFW_MOD_SHIFT ? "S" :
							(mods & GLFW_MOD_ALT ? "A" : "---"))) << std::endl;
	if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
		glfwSetWindowShouldClose(window, true);
};

우리는 위의 함수 두 개로 키가 눌리고 창의 크기가 변경되는 것을 콜백 함수로 둘 것이다.

	glfwSetFramebufferSizeCallback(window, OnFramebufferSizeChange);
	glfwSetKeyCallback(window, OnKeyEvent);

glfwSet~Callback() 함수들은 함수 포인터를 가져가서 콜백 함수로 등록해주는 역할이다.

	while (!glfwWindowShouldClose(window))
	{
		glfwSwapBuffers(window);
		glClearColor(0.0f, 0.1f, 0.2f, 0.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		glfwPollEvents();
	}
	glfwDestroyWindow(window);
	glfwTerminate();

glfwWindowShouldClose()는 해당 윈도우를 종료해야 하는가?를 물어보는 함수이다.
즉, 종료하기 전까지는 FALSE의 반환 값으로 실행된다.
GLFW의 윈도우는 기본적으로 이중 버퍼인데, 이전에 그렸던 것과 현재 그렸던 것을 바꾸는 과정을 glfwSwapBuffers()로 처리한다.
glfwPollEvents()는 윈도우와 관련된 다른 이벤트를 다루는데 예를 들면 마우스, 키보드의 입력을 말한다.
glClearColor()glClear() 직전에 호출되고 해당 윈도우의 Color Buffer가 지워질 때 해당 윈도우의 Color Buffer에 넣어질 값을 설정한다.
윈도우가 꺼지게 되면 무한 루프를 탈출하여 glfwDestroyWindow()와 glfwTerminate()로 모든 자원들이 정리될 수 있다.

'OpenGL' 카테고리의 다른 글

OpenGL[Lighting]  (0) 2022.10.18
OpenGL[Coordinate System]  (0) 2022.10.18
OpenGL[02](First Triangle)  (1) 2022.10.12
OpenGL[01](Shader)  (1) 2022.10.12
vcpkg를 이용한 GLFW, GLM, ASSIMP, GLAD setup  (0) 2022.10.06

+ Recent posts