Posts OpenGL 공부 - 01 - 시작
Post
Cancel

OpenGL 공부 - 01 - 시작

목표


  • 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++ 프로젝트 생성

image

  • 필요한 라이브러리 파일들을 프로젝트 폴더로 가져오기

image

  • 프로젝트 속성 설정 : 모든 플랫폼에 대해 설정하는 것이 좋다.

image

image

image

image

  • 빌드(F7) 시도 후 발생하는 무수한 에러는

image

  • 이렇게 해결한다.

image

  • 그리고 빌드 시, 유서깊은 Hello World 창을 만날 수 있다.

image

  • 이제 간단한 삼각형을 그려보기 위해 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();

image

  • 뷰포트 좌표는 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



Documents, APIs


This post is licensed under CC BY 4.0 by the author.