Open Graphics Library 1
Computer graphics through OpenGL
1. 그래픽스 시스템의 구성요소
- Input Device: 사용자와 시스템 간 상호작용을 위한 장치 (키보드, 마우스 등).
- CPU & GPU: CPU는 일반적인 연산을 수행하고, GPU는 그래픽 연산을 담당.
- 메모리 & Frame Buffer: 우리가 화면에서 보는 이미지는 픽셀로 구성되어 있고, 이 정보가 저장되는 곳.
- Output Device: 모니터 등 렌더링된 이미지를 출력하는 장치.
2. Graphics Pipeline (그래픽스 파이프라인)
- Pipeline의 기본 개념: 여러 단계로 이루어진 작업을 순차적이면서도 병렬적으로 처리.
- Graphics Pipeline의 4단계:
- Vertex Processing: 각 vertex의 위치와 색상 등을 결정.
- Clipping and Primitive Assembler: 시야 영역 내에서 필요한 부분만 남기는 과정.
- Rasterization: Primitive를 픽셀로 변환.
- Fragment Processing: 픽셀의 색상, 깊이 등을 처리.
GPU 사용 여부에 따라 Graphics Pipeline 차이가 있음. fixed-function pipeline -> programmable shader graphics pipeline
3. 좌표계 변환
- 좌표계 종류 및 변환 순서:
- Local (Model) Coordinate : 3D 물체 자체에 대한 고유한 좌표계
- World Coordinate : 여러 물체를 일률적으로 표현
- Eye (View) Coordinate : 세계 좌표계를 가상의 카메라(0, 0, 0) 방향을 기준으로 변환
- Clip Coordinate : 물체를 보는 카메라 입장에서 보이지 않는 물체 clip
- Normalized Device Coordinate (NDC) : 절단 좌표계를 정규화하여 좌표값을 -1에서 1사이로 변환.
- Screen Coordinate : 최종적으로 스크린에 보이는데 필요한 좌표계, 픽셀 단위로 표현하여 2D
4. OpenGL Libraries
- freeglut:
- OpenGL 프로그램의 윈도우 생성, 초기화, 입력 이벤트 처리 등 시스템 관련 작업을 담당.
- 이전의
glut
라이브러리를 대체하는 역할을 함.
- glew library:
- 다양한 OpenGL 확장 기능을 사용할 수 있게 해주는 라이브러리.
- 크로스 플랫폼 오픈 소스 C/C++ 확장 로딩 라이브러리로, OpenGL의 핵심 및 확장 기능을 하나의 헤더 파일에서 제공.
- glm library:
- 그래픽스 소프트웨어를 위한 수학 라이브러리로, 헤더 파일만 제공하는 C++ 라이브러리.
5. OpenGL 초기화 시 중요한 내용
OpenGL 컨텍스트 생성
OpenGL을 초기화할 때 가장 먼저 해야 할 일은 OpenGL 컨텍스트를 생성하는 것입니다. 이 컨텍스트는 렌더링과 관련된 모든 상태 정보와 데이터를 저장하는 일종의 상태 머신(state machine)입니다.상태 머신(State Machine)
OpenGL은 유한 상태 머신으로 동작합니다. 즉, 특정 상태를 설정하면 그 상태는 변경될 때까지 계속 유지됩니다. 예를 들어, 색상을 한 번 설정하면 새로운 색상을 지정하기 전까지 그 색상이 계속 사용됩니다.이벤트 처리(Event Processing)
그래픽 프로그램은 이벤트 처리 방식을 통해 사용자와 상호작용합니다. 이벤트란 운영 체제가 감지하는 변화로, 키보드 입력이나 마우스 클릭 등이 이에 해당합니다. 이러한 이벤트는 발생 시 이벤트 큐(event queue)에 저장되며, 프로그램은 이 큐를 확인하여 적절한 처리를 합니다.콜백 함수(Callback Functions)
이벤트에 반응하기 위해 사용하는 함수들을 콜백 함수라고 합니다. 이는 이벤트 리스너(Event Listener)의 역할을 하며, 특정 이벤트가 발생하면 자동으로 호출됩니다. 대표적인 예로 마우스 콜백(mouse callback), 디스플레이 콜백(display callback) 등이 있습니다.
아래는 이러한 초기화를 구현한 코드 예제입니다:
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
int main(int argc, char** argv)
{
glutInit(&argc, argv); // GLUT 라이브러리를 초기화합니다.
glutInitContextVersion(4, 3); // 사용할 OpenGL 컨텍스트 버전을 4.3으로 설정합니다.
glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE); // 호환성 프로파일을 사용합니다.
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); // 디스플레이 모드를 단일 버퍼와 RGBA 컬러 모드로 설정합니다.
glutInitWindowSize(500, 500); // 윈도우의 크기를 가로 500, 세로 500 픽셀로 설정합니다.
glutInitWindowPosition(500, 200); // 윈도우의 위치를 화면의 x=500, y=200 지점으로 설정합니다.
glutCreateWindow("OpenGL Initialization"); // 윈도우를 생성하고 제목을 설정합니다.
glutDisplayFunc(drawScene); // 화면을 그릴 때 호출될 함수를 등록합니다.
glutReshapeFunc(resize); // 윈도우 크기가 변경될 때 호출될 함수를 등록합니다.
glutKeyboardFunc(keyInput); // 키보드 입력이 있을 때 호출될 함수를 등록합니다.
glewExperimental = GL_TRUE; // GLEW의 실험적 기능을 활성화합니다.
glewInit(); // GLEW 라이브러리를 초기화합니다.
setup(); // 사용자 정의 초기 설정 함수를 호출합니다.
glutMainLoop(); // 이벤트 루프에 진입하여 프로그램이 종료될 때까지 실행합니다.
}
6. 주요 OpenGL 함수 설명
glColor3f
이 함수는 그릴 도형의 색상을 설정합니다. RGB 값으로 색상을 지정하며, 각 값은 0.0부터 1.0 사이의 실수입니다. 예를 들어,glColor3f(1.0, 0.0, 0.0);
은 빨간색을 의미합니다.glFlush()
이 함수는 현재까지의 OpenGL 명령들을 즉시 실행하도록 합니다. 단일 버퍼 모드에서 주로 사용되며, 그려진 내용을 화면에 표시합니다.glClearColor()
이 함수는 화면을 지울 때 사용할 배경 색상을 설정합니다. RGBA 값으로 색상을 지정하며,glClearColor(1.0, 1.0, 1.0, 0.0);
은 흰색 배경을 의미합니다.
아래는 이러한 함수들을 활용한 코드 예제입니다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void drawScene(void)
{
glClear(GL_COLOR_BUFFER_BIT); // 화면을 지워 초기화합니다.
glColor3f(0.0, 0.0, 0.0); // 그릴 도형의 색상을 검정색으로 설정합니다.
// 사각형을 그립니다.
glBegin(GL_POLYGON);
glVertex3f(20.0, 20.0, 0.0); // 좌측 하단 꼭지점
glVertex3f(80.0, 20.0, 0.0); // 우측 하단 꼭지점
glVertex3f(80.0, 80.0, 0.0); // 우측 상단 꼭지점
glVertex3f(20.0, 80.0, 0.0); // 좌측 상단 꼭지점
glEnd();
glFlush(); // 그리기 명령을 즉시 실행합니다.
}
// 초기 설정을 위한 함수입니다.
void setup(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0); // 배경 색상을 흰색으로 설정합니다.
}
7. 가시공간 (Viewing Volume)
가시공간(Viewing Volume)
가시공간은 가상의 카메라나 관찰자가 볼 수 있는 공간을 의미합니다. 이 영역 내에 있는 객체들만 화면에 렌더링됩니다.2D Viewing
2차원 그래픽에서는 화면에 보이는 직사각형 영역만 고려하면 됩니다. 이를 통해 2D 그래픽에서의 가시공간을 설정할 수 있습니다.glOrtho()
와gluOrtho2D()
이 함수들은 직교 투영을 설정하여 가시공간을 정의합니다.glOrtho()
는 3D 공간에서의 직교 투영을,gluOrtho2D()
는 2D 공간에서의 투영을 설정합니다.glViewport()
이 함수는 윈도우 내에서 실제로 그려질 영역을 설정합니다. 일반적으로 윈도우 전체를 사용하지만, 화면 분할 등의 경우에 유용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
// OpenGL 윈도우 크기가 변경될 때 호출되는 함수입니다.
void resize(int w, int h)
{
glViewport(0, 0, w, h); // 뷰포트를 윈도우 전체로 설정합니다.
glMatrixMode(GL_PROJECTION); // 투영 행렬 모드로 전환합니다.
glLoadIdentity(); // 투영 행렬을 초기화합니다.
glOrtho(0.0, 100.0, 0.0, 100.0, -1.0, 1.0); // 가시공간을 설정합니다.
// left, right, bottom, top, near, far
glMatrixMode(GL_MODELVIEW); // 모델뷰 행렬 모드로 전환합니다.
glLoadIdentity(); // 모델뷰 행렬을 초기화합니다.
}