[OpenGL] LearnOpenGL 정리 본 (1~4)

2022. 7. 18. 06:53opengl

728x90

OpenGL이란 무엇인가?

각 함수들의 결과/ 아웃풋에 대한 내용을 명시해둔 것.

구체적으로 말하자면 2,3, 차원 아웃풋에 대한 내용을 명시해둔 것으로 표준 API 규격이다. 

내부적 구현은 안됨 -> 내부적 구현은 누가 하나?

그래픽카드 제조업체에서 한다. 

유용한 기술이 나오면 바로 사용이 가능하다. 새로운 버전이 나올 때까지 기다리는 것이 아닌 그래픽 카드를 바꾸면 바로 사용이 가능하다.

 

 

 

OpenGL은 state machine이다. 

 

state machine이라는 것은 무엇인가?

쉽게 말해 상태 머신이란, 어떻게  OpenGL이 동작할 건지에 대해서 사전에 정의되어 있는 변수들의 모음이다. 

=> GL_POINTS, GL_TRIANGLES처럼 OpenGL을 사용할 때 우리는 각종 옵션에 말만 해주면 사전에 정의되어 있는 대로 OpenGL이 동작한다. 

 

 

 

 

 

Creating Window

 

GLFW 

우리는 GLFW라는 라이브러리를 사용한다. 

이 라이브러리를 사용하는 이유는 일반 windowopenGL을 사용할 수 있도록 연결되어 있지 않다. 이때 context라는 것이 필요하다

 

OpenGL의 기본 동작

1. 세팅(내가 그리는 선은 빨간색)

2. 그리기(선 그리기)

 

선을 그릴 때 무슨 색이 저장되는지 알고 있어야 되는데앞의 세팅된 값들을 저장해 놓는 공간을 context라고 한다. 앞의 선 그리기가 저장되어 있어야 하는 공간이 필요하다. 책의 앞의 context(내용)이 있어야 뒤의 내용이 이해되는 것과 같은 맥락이라고 생각하면 쉽다.

GLFWcontext를 저장하는 역할을 하는데에 유용하기 때문에 우리는 GLFW라는 라이브러리를 사용한다. 

 

 

ㄷㅇㅇㄴㅁㅊ

 

Cre

Cmake

소스코드를 컴파일하여 라이브러리를 생성하면 최종 라이브러리가 우리의 CPU/OS에 완벽하게 맞춰지게 된다. Cmake를 설정하지 않으면 (바이너리 시스템을 못 사용할 수 있다.) 

 

쉽게 말하자면 사람들마다 빌드 환경이 다 똑같지 않은데 서로 다른 빌드 환경에서 컴파일을 하게 되면 컴파일할 때 바이너리 시스템을 못 사용한다. 이러한 문제를 한 번에 해결하는 것이 cmake이다. 

 

 

 

 

ting Windowㅎ

 

 

ㄹㅇㄹㅇㅎㄴㅇ

glfwInit은 GLFW 라이브러리를 초기화한다. GLFW 함수가 사용되기 이전에, GLFW은 반드시 초기화되어야만 한다.

glfwWindowHint를 사용하여 GLFW를 설정한다. 우리가 사용할 openGL의 버전은 3.3이기 때문에, GLFW에게 우리가 사용할  OpenGL version은 3.3을 major minor에 3이라고 설정한다. 그리고 예전에는 immediate mode를 사용했는데 오늘날 은 core-profile-opengl 3.3을 기준으로 사용하기 때문에 core-profire를 사용한다고 GLFW에게 말을 하고 설정을 해준다. 

 

그다음은 윈도 오브젝트를 만드는 것인데

glfwCreateWindow를 통해 윈도를 만들고 그것과 연관된 context를 만든다. 

glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share)의 인자들은 다음과 같다.

 

그다음은 GLAD를 초기화하는 과정이다. 우리는 GLAD가 OpenGL을 위한 함수 포인터들을 관리한다고 말했었다.

OpenGL 함수들을 호출하기 전에 초기화해야 하기 때문에 초기화를 해주는 과정을 거쳐준다. 

OS 마다 다른 OpenGL함수 포인터의 주소를 로드하기 위해 GLAD 함수를 거침.

 

 

glViewport 우리가

 

framebuffer_size_callback은 윈도우의 크기를 재설정할 때마다, 뷰포트 또한 조정되어야 한다. 윈두 우가 재조정될 때마다 윈도에서 callback 해주는 함수이다. 

 

그리고 glfwSetFramebufferSizeCallback을 통해 재조정된 윈도를 GLFW에 등록하여 윈도우 창이 바뀔 때마다 이 함수를 호출할 수 있도록 해준다. 

 

다음 While문을 보면

첫 번째 줄에는 반복 중에 윈도창을 계속 켜놓고 이 윈도우 창을 제어하는 코드가 없는 걸 보니 계속 켜놓는 거 같다. 

두 번째 줄에는 이벤트가 발생하면 윈도 상태를 업데이트하는 함수가 있다. 

 

마지막으로 while문이 끝나면 할당된 자원들을 해제하기 위해서 glfwTerminate를 통하여 할당된 자원들을 해제한다. 

 

glclearColor로 cololrbuffer을 reset 해주고 glClear은 현제 framebuffer의 전체 buffer을 clear 한다.

GL_COLOR_BUFFER_BIT로 명시할 때, 그 버퍼는 glClearColor에 명시되어 있는 색으로 cleared 된다.그러니까 glClearColor에 들어있는 인자들이 가리키는 색을 window창에 계속 reset 해주는 것이다. 

 

그리고 processInput을 통해서 GLFW에서의 입력 제어를 해준다.  계속 While문을 돌면서 glfwGetKey함수를 사용하는데 우리가 누르는 키와 함께  input으로써 window를 나타낸다. 만약 아무 키도 눌러지지 않는다면 GLFW_RELEASE를 return 해준다.  이 함수에서  GLFW_KEY_ESCAPE가 GLFW_PRESS 랑같으면 즉, esc키를 누르면 while문의 조건이 false가 되어서 while문이 종료가 된다. 

 

 

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void processInput(GLFWwindow* window);
int main() {
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);


	//glfcreatewindow 함수는 처음 두개의 파라미터로 창의 너비와 높이를 받는다.
	// 세 번째 파라미터는 창의 이름을 생성할 수 있게한다. 
	GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
	if (window == NULL) {
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);


	//glad는 opengl용 함수 포인터를 관리한다. opengl함수들을 호출하기전에 glad를 초기화하는 과정
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
	std::cout << "Failed to initialize GLAD" << std::endl;
	return -1;
	}


	//우리가 렌더링 윈도우 사이즈를 알려주는 것 
	//창의 크기바 변경될 때마다 GLFW는 이 함수를 호출하고 파라미터에 적절한 데이터를 채우게 됩니다. 
	
	glViewport(0, 0, 800, 600);
	void framebuffer_size_callback(GLFWwindow * window, int width, int height);
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

	//여기 까지만하면 우리가 만듬 프로그램이 하나의 이미지를 그리고 난 후 바로 종료가됨

	//종료 되지 않게 하려면 중지하라는 명령이 있기전까지 계속 무한루프를 돌면서 사용자가 원하는 처리를 진행해야된다. 


	//glfwWindowShouldClose
	//This function sets the value of the close flag of the specified window.
	//This can be used to override the user's attempt to close the window, or
	//to signal that it should be closed.
	//	

	while (!glfwWindowShouldClose(window)) {
		processInput(window);
		//랜더링
		
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);

		//랜더링
		glfwSwapBuffers(window); //반복중에 이미지를 그리고 화면에 출력함
		glfwPollEvents(); //이벤트가 발생하면 윈도우 상태를 업데이트 함
	}

	
	//이제 window창이 만들어지고 바로 종료가아닌 계속 무한루프를 돌면서 window창을 유지시킨다. 

	glfwTerminate();
	return 0;
}

void processInput(GLFWwindow* window) {
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
		glfwSetWindowShouldClose(window, true);
	}
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
	glViewport(0, 0, width, height);
}

 

코드

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void processInput(GLFWwindow* window);
int main() {
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);


	//glfcreatewindow 함수는 처음 두개의 파라미터로 창의 너비와 높이를 받는다.
	// 세 번째 파라미터는 창의 이름을 생성할 수 있게한다. 
	GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
	if (window == NULL) {
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);


	//glad는 opengl용 함수 포인터를 관리한다. opengl함수들을 호출하기전에 glad를 초기화하는 과정
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}


	//우리가 렌더링 윈도우 사이즈를 알려주는 것 
	//창의 크기바 변경될 때마다 GLFW는 이 함수를 호출하고 파라미터에 적절한 데이터를 채우게 됩니다. 

	glViewport(0, 0, 800, 600);
	void framebuffer_size_callback(GLFWwindow * window, int width, int height);
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

	//여기 까지만하면 우리가 만듬 프로그램이 하나의 이미지를 그리고 난 후 바로 종료가됨

	//종료 되지 않게 하려면 중지하라는 명령이 있기전까지 계속 무한루프를 돌면서 사용자가 원하는 처리를 진행해야된다. 


	//glfwWindowShouldClose
	//This function sets the value of the close flag of the specified window.
	//This can be used to override the user's attempt to close the window, or
	//to signal that it should be closed.
	//	

	while (!glfwWindowShouldClose(window)) {
		processInput(window);
		//랜더링

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

		//랜더링
		glfwSwapBuffers(window); //반복중에 이미지를 그리고 화면에 출력함
		glfwPollEvents(); //이벤트가 발생하면 윈도우 상태를 업데이트 함
	}


	//이제 window창이 만들어지고 바로 종료가아닌 계속 무한루프를 돌면서 window창을 유지시킨다. 

	glfwTerminate();
	return 0;
}

void processInput(GLFWwindow* window) {
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
		glfwSetWindowShouldClose(window, true);
	}
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
	glViewport(0, 0, width, height);
}

 

 

Creating Window모

 

728x90

'opengl' 카테고리의 다른 글

<자료구조> 큐(queue),덱(deque)  (0) 2023.06.01
[OpenGL] LearnOpenGL 정리본 6~7  (0) 2022.07.30
[OpenGL] LearnOpenGL 정리본 4~5  (0) 2022.07.23
그래픽스 스터디  (0) 2022.07.12