Computer Graphics

Chapter02. OpenGL 시작 및 실습코드

CodeJB 2021. 5. 26. 18:54

OpenGL이란?

 Vertices를 Pixels로 변환하는 과정을 지원하는 그래픽스 표준 API이다.

1992년 실리콘 그래픽스사에서 만든 2차원 및 3차원 그래픽스 표준 API로, 함수 호출을 통해 기하도형에서부터 복잡한 3차원 장면을 생성할 수 있다. 즉, OpenGL은 Vertices를 Pixels로 변환하는 과정을 지원한다. 앞서 살펴보았던 GPU를 통해 컴퓨터 화면에 그림을 생성하는 과정(아래 그림)

 

여기선 Vectices를 응용프로그램이라고 했으나 간단하게 점이라고 생각하자. 즉, 점을 픽셀로 변환하는 이 과정을 OpenGL이 해주는 것이다. 하지만 각 과정에 어떤 상태변수를 넘겨줌으로써 우리가 원하는 그림을 그려내야 할 것이다. 따라서 아래와 같은 그림으로 설명할 수 있다.

OpenGL을 이용하면 개발자가 직접 PipeLine을 개발해야하는 비용이 줄어들지만 각 Step마다 변수를 넘겨줌으로써 원하는 그림을 그릴 수도 있고, 어떠 부분을 가린다던지, 어떤 각도로 촬영을 할 것인지를 결정할 수 있다.

OpenGL 기본구조

- 응용프로그램은 게임과 같은 인터렉티브 그래픽이 될 수 있고 영화와 같은 시청물이 될수도 있다.

- GLUT는 윈도우를 생성한다던지(실질적으로 그림이 그려질 화면), 마우스나 키보드 입력에 대한 함수를 지원해준다.

- GLU는 GL라이브러리의 도우미 역할을 하는 라이브러리이다. 다각형 분할(Tesselation), 투상(Projection), 2차원 곡면(Quadratic Surface) 등의 고급기능을 제공하는 함수로써 GL함수로 작성되어 있다. 따라서, GLU는 GL의 일부로 취급되기도 한다.

- GL은 렌더링 기능을 제공하는 함수 라이브러리이다.

- 드라이버

- 운영체제 (Windows, Linux 등..)

응용프로그램의 특성에 따라서 꼭 사용해야할 라이브러리, 기능이 다르기 때문에 Step이 달라질 수 있다.

특히, GLUT에서 곧바로 운영체제로 가는그 경우는 마우스나 키보드 입력을 통해서 OS에 곧바로 엑세스하는 경우이다. 이외에는 일반적으로 우리가 생각하는 APP을 통해 원하는 그림을 화면에 렌더링하는 과정과 동일하다.

OpenGL 실습 코딩

본인은 Mac OS에서 xcode를 기반으로 코드를 작성하였으며, Windows와는 약간의 차이가 있다.
Mac은 기본적으로 OpenGL과 GLUT를 제공하고 있으며, Glew와 같은 확장라이브러리의 도움이 필요없다.
#include <OpenGL/OpenGL.h>
#include <GLUT/GLUT.h>
#include <iostream>

void display (void) //glutDisplayFunc함수에 의해 호출될 콜백함수
{
    glClear(GL_COLOR_BUFFER_BIT); //화면 Clear
    glBegin(GL_POLYGON); //그래픽 Object를 선언
    	glVertex3f(-0.5, -0.5, -0.5);//화면에 점을 찍음
    	glVertex3f(0.5, -0.5, 0.5);//화면에 점을 찍음
    	glVertex3f(0.5, 0.5, 0.0);//화면에 점을 찍음
    	glVertex3f(-0.5, 0.5, 0.0); //화면에 점을 찍음
    glEnd();//그래픽 Object 내용 마무리
    glFlush();//버퍼에 있는 내용을 그리도록 함
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv); // GLUT 라이브러리 초기화
    glutCreateWindow("Test"); // 윈도우 생성
    glutDisplayFunc(display); // 위에서 작성한 display 콜백함수를 넘겨줌
    glutMainLoop();//메인 루프 사용자가 게임종료를 할때까지 계속 무한루프 돌고있음
    return 0; //메인루프가 끝날 때까지 실행되지 않음
}

결과


void glclear(GLbitfield mask)

지정된 버퍼를 지워주는 역할을 한다. Frame Buffer의 Color Buffer에 저장된 색깔정보를 지우는 역할을 한다.

[파라미터]

GL_COLOR_BUFFER_BIT : 컬러 쓰기를 위해 활성화된 버퍼

GL_DEPTH_BUFFER_BIT : 깊이 버퍼

GL_ACCUM_BUFFER_BIT : 누적 버퍼

GL_STENCIL_BUFFER_BIT : 스텐실 버퍼


void glBegin(GLenum mode); -  void glEnd();

모든 디지털 그래픽의 기본은 점이며, 3차원 그래픽의 가장 원시적인 요소는 정점이다. 정점은 위치정보만 갖고 점은 위치와 색깔 크기를 갖고 있다. 정점은 두 블록 사이에 정의된다 : glBegin(GLenum mode); glEnd(void); 블록내의 정점들로 무엇을 어떻게 그려낼지는 glBegin으로 전달되는 파라미터에 따라 달라진다. 이 블록 사이에서 지정된 명령어들은 버퍼에 저장되고 나중에 Flush를  통해 한번에 프로세서에게 보낸다.

[파라미터]

GL_POINTS : 독립적인 점

GL_LINE_STRIP : 연결된 성분

GL_LINE_LOOP : 시작점과 끝점을 이은 선분

GL_LINES : 두개의 정점들을 이은 선분

GL_TRIANGLES : 세개씩 연결한 삼각형

GL_TRIANGLES_STRIP : 연결된 삼각형

GL_TRIANGLES_FAN : 중심을 공유하는 삼각형

GL_QUADS : 정점 4개씩을 연결하여 사각형을 그린다.

GL_QUAD_STRIP : 연결된 사각형

GL_POLYGON : 연결된 블록 다각형


void WINAPI glFlush();

더이상 명령어를 버퍼에 쌓지말고 지금까지 쌓인 명령어를 모두 프로세스에 전달하도록 강제하는 함수


GLUT와 GL의 화면좌표계

GLUT는 왼쪽 위가 원점이고, GL은 왼쪽 아래가 원점이다.

GLUT 모델링

출처 : https://www.youtube.com/watch?v=_y0J4Q_6Mmk&list=PL-sgB-_E4raa_6zJz0XYdpFrm2znDxjui&index=7