반응형
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

// DESC :> window 크기 변경 시마다 callback 함수 호출
void framebuffer_size_callback(GLFWwindow* window, int width, int height);

// DESC :> Input 이벤트
void processInput(GLFWwindow* window);

int main()
{
	// DESC :> glfw initialize
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

	GLFWwindow* window = glfwCreateWindow(800, 500, "LearnOpenGL", NULL, NULL);

	if (window == NULL)
	{
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();

		return -1;
	}
	glfwMakeContextCurrent(window);
	
	// DESC :> glad initialize
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

	// DESC :> rendering infinity loop
	while (!glfwWindowShouldClose(window))
	{
		processInput(window);

		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);

		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	// DESC :> 할당된 모든 메모리 삭제
	glfwTerminate();

	return 0;
}

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
	glViewport(0, 0, width, height);
}

void processInput(GLFWwindow* window)
{
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
		glfwSetWindowShouldClose(window, true);
}

이전에 OpenGL 설정 확인으로 사용했던 코드가 OpenGL의 기본 골격 코드이다.

기본 순서는 아래와 같다.

  1. glfw 초기화 및 Window 설정
  2. Window 생성
  3. glad 초기화
  4. Render Loop 실행
    1. Window Double Buffer 실행
    2. 입력 및 출력 이벤트 처리
  5. 사용된 메모리 삭제

가장 기본이 되는 실행이기 때문에, 추가적인 기능은 해당 형태에 덧붙여 사용하면 된다.

 

glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);​

glfwInit() - glfw를 초기화 하여, Window 생성을 할 수 있는 상태로 설정해준다.

glfwWindowHint() - 생성할 Window의 기본 설정을 해준다.

 

GLFWwindow* window = glfwCreateWindow(800, 500, "LearnOpenGL", NULL, NULL);

if (window == NULL)
{
	std::cout << "Failed to create GLFW window" << std::endl;
	glfwTerminate();

	return -1;
}
glfwMakeContextCurrent(window);

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

glfwTerminate() - 사용된 메모리를 삭제하는 함수이다.

프로그램이 종료되기 직전에 반드시 호출해야 한다.
Window 생성이 실패하였기 때문에, glfw를 초기화해준 메모리를 삭제하는데에 사용되었다.

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

 

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
	std::cout << "Failed to initialize GLAD" << std::endl;
	return -1;
}

gladLoadGLLoader() - glad 초기화 및 glfw에 설정하는 함수이다.

glad를 초기화 한 이후에, Call Back 함수들을 등록하여 사용할 수 있다. (ex>glfwSetFramebufferSizeCallback)

 

while (!glfwWindowShouldClose(window))
{
	processInput(window);

	glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT);

	glfwSwapBuffers(window);
	glfwPollEvents();
}

glfwWindowShouldClose() - 현재 Window가 종료되었는지 확인하는 함수

glfwSwapBuffers() - 이전 Frame에 그려진 Buffer와 현재 Frame에 그려진 Buffer를 Swap (Double Buffer)

glfwPollEvents() - 현재 Frame의 입력 및 출력 이벤트를 모두 처리

반응형

'게임 개발 끄적 > OpenGL' 카테고리의 다른 글

[OpenGL] Shader File  (0) 2020.02.07
[OpenGL] Shader Program  (0) 2019.11.04
[OpenGL] Shader Rendering  (0) 2019.10.15
[OpenGL] 환경 설정 구축  (0) 2019.10.14

+ Recent posts