목표
- OpenGL 기초 세팅
OpenGL?
-
OpenGL 자체는 API가 아닌, 각종 OpenGL 라이브러리를 개발하기 위해 Khronos Group이 개발 및 유지 관리하는 설명서이다.
-
OpenGL은 각 함수의 출력과 수행 방법을 정의한다.
-
실제로 OpenGL 라이브러리를 개발하는 사람들은 일반적으로 그래픽카드 제조업체이다.
-
OpenGL은 기본적으로 C언어로 작성되었으며, 각종 확장 라이브러리는 C++로 작성된 경우가 많다.
OpenGL 라이브러리 종류
GL(Graphics Library)
- 저수준의 기본 그래픽스 라이브러리
GLU(OpenGL Utility Library)
- GL을 보완하여, 고수준의 함수와 기능들을 제공하는 라이브러리
GLUT(OpenGL Utility Toolkit)
- 다양한 플랫폼에서 사용할 수 있는 보조 라이브러리. 1998년에 버려졌다.
FreeGLUT
- GLUT는 라이센스 때문에 더이상 개발이 불가능하여 사람들이 자유롭게 개발할 수 있도록 새롭게 작성된 라이브러리
SDL(Simple Directmedia Layer)
- OpenGL, Direct3D를 통해 오디오, 키보드, 마우스, 그래픽 하드웨어에 대한 저수준 접근이 가능하도록 설계된 크로스플랫폼 개발 라이브러리
- Windows, Linux, Mac OS X, Android, iOS 등 다양한 플랫폼을 지원한다.
- 무료로 이용이 가능하지만, 기능이 너무 많아 프로그램이 무겁다.
SFML(Simple and Fast Multimedia Library)
- 다양한 멀티미디어에 걸쳐 API를 제공하기 위해 설계된 크로스플랫폼 개발 라이브러리
- System, Window, Graphics, Audio, Network 이렇게 5가지 모듈로 구성되어 있다.
- C, C++, Ruby, Java, Go, Pthon, Rust 등 다양한 언어를 지원한다.
GLFW(Graphics Library Framework)
- OpenGL과 함께 사용하기 위한 경량 유틸리티 라이브러리
- OpenGL 환경에서 윈도우를 생성하고 마우스, 키보드, 조이스틱 등의 입력을 받아 처리할 수 있다.
- C언어로 작성되었지만, Ada, C++, C#, Go, Java, Ruby, Rust 등 다양한 언어를 지원한다.
GLEW(OpenGL Extension Wrangler Library)
- 크로스플랫폼 C/C++ 확장 라이브러리
- 하나의 헤더파일만 추가하면 사용할 수 있게 작성되었으며, 더 많은 기능들을 제공한다.
- 쉐이더 프로그램을 작성할 때 주로 사용된다.
GLM(OpenGL Mathematics)
- GLSL 기반 그래픽 소프트웨어에 사용 가능한 C++ 수학 라이브러리
GLES(OpenGL ES, OpenGL for Embedded Systems)
- 스마트폰, PDA와 같이 휴대용 기기의 임베디드 시스템을 위한 API
GLFW 설치, 프로젝트 준비
- https://www.glfw.org/ 에서 최신버전을 받을 수 있다.
- 그리고 이미 컴파일된 라이브러리 파일들을 https://www.glfw.org/download.html 에서 곧바로 받을 수 있으므로 이것을 사용하기로 한다.
-
32bit와 64bit로 나뉘어 있는데, VS에서 32bit로 실행할 것이므로 32bit로 받아온다.
- C++ 프로젝트 생성
- 필요한 라이브러리 파일들을 프로젝트 폴더로 가져오기
- 프로젝트 속성 설정 : 모든 플랫폼에 대해 설정하는 것이 좋다.
- 예제 코드를 통해 바인딩 확인
- 빌드(F7) 시도 후 발생하는 무수한 에러는
- 이렇게 해결한다.
- 그리고 빌드 시, 유서깊은 Hello World 창을 만날 수 있다.
- 이제 간단한 삼각형을 그려보기 위해 glClear( .. ); 코드 하단에 다음과 같이 추가하고 실행한다.
1
2
3
4
5
glBegin(GL_TRIANGLES);
glVertex2f(-0.5f, -0.5f); // Bottom Left
glVertex2f( 0.0f, 0.5f); // Top
glVertex2f( 0.5f, -0.5f); // Bottom Right
glEnd();
- 뷰포트 좌표는 0.0 ~ 1.0 이라고 어디선가 주워들은 지식이 머릿속에 있는데.. 이건 뷰포트가 아닌가보다.
Source Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <GLFW/glfw3.h>
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex2f(-0.5f, -0.5f); // Bottom Left
glVertex2f(0.0f, 0.5f); // Top
glVertex2f(0.5f, -0.5f); // Bottom Right
glEnd();
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
References
- https://www.youtube.com/playlist?list=PLlrATfBNZ98foTJPJ_Ev03o2oq3-GGOS2
- https://heinleinsgame.tistory.com/tag/OpenGL
- https://learnopengl.com/