-
OpenGL 4.5 강좌 - (1) OpenGL 소개: C언어로 화면에 그림 그리기OpenGL 2021. 1. 31. 01:26
이 튜토리얼은 C언어를 이미 배우고, C++의 기초를 아시는 분들께 권장드립니다. 그래픽스의 가장 기초부터 차근차근 진행할 예정이니, 입문자들에게 가장 적합합니다.
여러분이 이 튜토리얼을 보고 계시는 이유는 아마 '화면에 (문자가 아닌) 뭔가를 그리고 싶어서'일 겁니다. 제가 십수년 전 C언어를 처음 배웠을 때도 C언어 책에서 까만 콘솔 창에 키보드로 문자를 입력하는 프로그램을 만드는 법만 가르쳐 주었지, 그림을 그리는 방법에 대해서는 아무런 설명도 없어서 당혹스러웠던 기억이 있습니다. 정작 제가 만들고 싶었던 것은 화려한 그림을 그려주는 프로그램이었는데 말이죠. 그럼 도대체 화면에 그림을 그리는 방법은 무엇일까요? 우선 화면의 작동 원리에 대해서 잠깐 알아봅시다.
지금 여러분 눈앞에 있는 화면(디스플레이)는 수많은 픽셀들로 이루어져 있지요? 화면에 아주 가까이 눈을 갖다대시면 아주 작은 네모들로 구성되어 있는 것을 볼 수 있을 겁니다. 이 네모 하나하나를 '픽셀' 또는 '화소'라고 합니다. 한 픽셀은 한 가지 색상을 띨 수 있습니다. 이런 단순한 픽셀들이 모여서 화면에 표시되는 그림이 되는 것이죠.
픽셀 하나를 더 쪼개면 빨간색 (Red 또는 R), 초록색 (Green 또는 G), 파란색 (Blue 또는 B) 세 가지 기본 색상으로 이루어져 있습니다. 즉, 한 픽셀의 색상은 숫자 세 개로 결정됩니다. 그 숫자가 0이면 꺼져 있음 (어두움), 최댓값이면 켜져 있음 (최대로 밝음)을 의미합니다. 몇 가지 예를 들자면, 만약 최댓값이 255라면, (R, G, B) = (0, 255, 0)은 화면에 표시할 수 있는 가장 밝은 초록색 (██) 을 의미하고, (0, 127, 0)은 중간 정도 어두운 초록색 (██), (255, 0, 0)은 가장 밝은 빨간색 (██), (255, 255, 0)은 빨간색 + 초록색이므로 가장 밝은 노란색 (██), (0, 0, 0)은 모든 색이 꺼져 있으므로 가장 어두운 검은색 (██)을, (255, 255, 255)는 모든 색이 켜져 있으므로 가장 밝은 흰색 (██)을 의미합니다. 이런 식으로 R, G, B 숫자 세 개의 조합으로 "모든 색상"을 표현할 수 있습니다.
그럼 디스플레이는 화면을 구성하는 이 색상 값들을 어디서 가져올까요? 결론적으로 여러분 컴퓨터의 그래픽 카드에 붙어있는 메모리(VRAM)에 있는 프레임버퍼(Framebuffer)라는 영역에서 가져옵니다. 프레임버퍼는 그냥 일반적인 램의 특정 영역에 불과한데, 그래픽 카드가 그 영역을 특별히 취급해서 그 내용(색상 값들)을 수시로 (1초에 몇십 번씩) 읽어 케이블을 통해 디스플레이에 전달해 주는 것입니다.
만약 프레임버퍼의 내용이 바뀐다면 화면도 바뀌는 것이죠. 여기까지 이해하셨다면 감이 잡히셨겠죠? 그렇습니다. 프레임버퍼 영역의 내용을 변경하면 화면에 그림을 그릴 수 있습니다. 그럼 그 프레임버퍼 영역의 메모리 주소는 뭘까요? 아쉽게도 우리가 운영체제 프로그래머가 아닌 이상 우리는 그 영역에 직접 접근할 수 없습니다. 멀티태스킹이 없던 DOS 시절에는 가능했었죠. 하지만 여러 프로그램이 동시에 프레임버퍼를 마구 건드린다면 눈이 아프겠죠? 그래서 요즘 OS들에서는 프레임버퍼에 응용 프로그램들이 직접 접근하는 것을 막아놨습니다.
드디어 여기서 OpenGL이 등장합니다. 간단히 말해, OpenGL은 이 제한을 우회해 프레임버퍼를 건드릴 수 있도록 도와주는 API (Application Programming Interface, 응용프로그램 프로그래밍 인터페이스)입니다. API란, 어떤 소프트웨어 (OS나 드라이버, 혹은 라이브러리)와 소통하기 위한 일종의 약속(Protocol)입니다. 그럼 OpenGL은 무엇과 소통하기 위한 API일까요? 정답은 그래픽카드드라이버(Driver)입니다. 장치 드라이버란, 컴퓨터에 장착된 기기들을 구동하기 위해 OS에 상주하는 일종의 프로그램입니다. 우리가 이 드라이버에 어떤 명령을 내리면, 드라이버는 그 명령을 해석해 장치의 알맞은 부분을 건드려 장치를 작동시킵니다. OpenGL은 C언어로 작성된 API로, C언어 함수 호출을 통해 이 소통이 이루어집니다. 예를 들어,
glEnable(GL_MULTISAMPLE)
로 API 함수를 호출하면, 드라이버가 이를 인식하고 그래픽 카드 내부의 상태를 바꿔 멀티샘플링을 활성화시키는 식입니다.OpenGL은 1992년에 처음 만들어져 역사가 깊습니다. 강산이 세 번 바뀌기 전, 1992년의 컴퓨터는 지금과는 달라도 많이 다른 컴퓨터였죠? 따라서 OpenGL 또한 변화에 변화를 거듭했습니다. 우리는 그 중에서 2015년에 발표된 OpenGL 4.5를 기준으로 배워보려고 합니다. 2021년 현재 기준으로 OpenGL 4.5를 지원하지 않는 컴퓨터는 아주 드물 겁니다. OpenGL 4.5부터는 Direct State Access (DSA, 직접상태접근) 이라는 새로운 하위 API가 제공되는데요, 이것은 기존 OpenGL API와는 확연히 다르지만 사용하고 이해하기에 훨씬 편한 면이 있습니다. 한국어로 된 튜토리얼 중에서는 이 DSA를 중심으로 설명하는 것이 잘 없는 것 같습니다. 따라서 이 튜토리얼에서는 DSA를 기준으로 설명할 예정입니다. 하지만 이것 때문에 다른 튜토리얼과는 좀 다른 점이 많으니 유의해주세요!
다음 강좌에서는 개발 환경을 셋팅해볼 예정입니다!
'OpenGL' 카테고리의 다른 글
OpenGL 4.5 강좌 - (5) VAO, VBO (2) 2021.01.31 OpenGL 4.5 강좌 - (4) Framebuffer, 더블 버퍼링, V-Sync (0) 2021.01.31 OpenGL 4.5 강좌 - (3) 창 띄우기 (0) 2021.01.31 OpenGL 4.5 강좌 - (2) 개발환경 셋팅하기 (0) 2021.01.31