■ 더블 버퍼링
요즈음 대부분의 GUI 프로그래밍에선 일반적으로 사용자에게 연속적인 이미지를 보여주기 위해 더블 버퍼링을 사용한다. 구성은 프론트(Front) 버퍼, 백(Back Buffer)가 있는데 프론트에서는 현재 프레임(마지막프레임)의 버퍼를 보관해주고 백에서는 이후에 (다음프레임) 보여줄 버퍼를 보관하고있다.
[원리]
그러므로 CPU에서 GPU에게 그래픽 데이터를 전달해주면은 GPU에서는 BackBuffer에다가 해당 데이터에 맞게 객체를 그려준다음 SwapBuffer 등을 통하여 FrontBuffer와 BackBuffer를 교체하여 디스플레이에 띄워준다.
[이유]
이렇게 까지 하는 이유는 무엇인가? 먼저 렌더링에는 (1) 내가 원하는 것을 그려줘 와 (2) 니가 그린 것을 보여줘의 두 가지 신호가 필요하다. 즉, 리얼타임에서 끊임없이 데이터를 쏴주고 있을 때 다 그리지도 못했는데 '이제 디스플레이에 띄워줘'라는 신호를 보내게 된다면 여러 부작용이 생겨날 수 있다. 이를 방지하고자 더블 버퍼링을 사용한다.
■ OpenGL
먼저 OpenGL은 State Machine과 비슷한 방식으로 구동한다. 이는 객체지향프로그래밍(OOP)와 설계를 다르게 해야하는데 예로 아래와 같다.
종류 | 예시 |
객체지향 (OOP) |
(1) Triangle t1, t2; // 삼각형 두 개를 정의한다. (2) Draw(t1) (3) Draw(t2) // Draw라는 함수에 앞서 정의한 삼각형들을 인자로 넘겨 호출하여 그려준다. |
State Machine | (1) Triangle t1, t2; // 삼각형 두 개를 정의한다 (2) Activate(t1); // 삼각형 1을 처리 중인 상태로 설정한다 (3) Draw(); // 현재 처리중인 데이터 (=삼각형 1)를 화면에 그려준다. (4) Activate(t2); // 삼각형 2를 처리 중인 상태로 처리한다. (5) Draw(); // 현재 처리중인 데이터 (=삼각형 2)를 화면에 그려준다. |
일단 위와 같은 구조를 띄고 있다는 것을 이해해야 OpenGL 소스코드를 봤을 때 이해가 될 것이다.
(1) Legacy
먼저 옛날 OpenGL의 방식은 glBegin()으로 시작하여 glEnd()를 끝맺음으로 렌더링하도록 처리한다.
위와 같이 glBegin함수에 삼각형을 그리겠다고 알린 뒤 glVertex2f로 정점의 위치를 담은 데이터를 전달하여 glEnd로 마무리한다.
Legacy방식은 사용자가 쉐이더 코드를 따로 작성해주지 않아도 정점의 위치를 알고있다면 디폴트값으로 흰색으로 채워주기 때문에 위 상태로 실행시 흰색 삼각형이 그려지게 된다.
그러기에 외부 소스코드를 구경할 때 glBegin, glEnd로 되어있는 구조의 코드는 옛날 방식으로 참고하지 않는 것이 좋을 수 있다.
(2) Modern
요즈음 방식은 조금 다르다. 먼저 glfw api를 활용하여 윈도우를 띄우기전에 아래와 같이 버퍼를 활성화 해주고 데이터를 넘겨줘야한다.
1. 먼저 GPU에게 던져줄 버퍼를 생성한다.
2. 버퍼를 Bind [Activation]해줘 활성화해준다. 인자로 몇번째 버퍼를 활성화시켜줄지 ID를 넘겨준다.
3. CPU에서 GPU로 정점의 데이터를 담은 버퍼를 넘겨준다.
- 첫번째 인자는 Array의 형태로 정점들의 데이터를 보내겠다는 뜻
- 두번째 는 버퍼의 사이즈
- 세번째는 정점의 위치들
- 네번째는 정적으로 그려달라는 요청사항
그 이후 창을 띄워주는 구간에선 아래와 같이 코드가 바뀌었다.
첫번째 인자로 Traingle을 그리겠다는 정보
두번째 인자는 데이터를 몇 번째부터 그릴 것인지에 대한 정보
세번째는 몇 번을 그릴 것인지에 대한 정보이다.
이 방식으로는 OpenGL이 이전 Legacy와 같이 디폴트로 흰색을 채워 보여주는 행위는 하지 않는다. 이에 대한 정보는 사용자가 제공해줘야 그에 맞춰 그려주게 되어있다.
* OpenGL 명령어 사전
'Computer Graphics > OpenGL' 카테고리의 다른 글
[OpenGL] 모델 행렬, 원근투영행렬 구현 및 적용 (1) | 2024.01.07 |
---|---|
[Computer Graphics] 공부 시작 및 목표 (0) | 2023.11.16 |