1.OpenGL

1-1.3D 그래픽

3D 그래픽은 3차원 공간상의 물체를 그려내는 기술이다. 평면에 그리는 2차원 그래픽에 비해 훨씬 더 난이도가 높다. 우리가 사는 실세계인 3차원을 그려내지만 3D 그래픽의 최종 출력 형태는 모니터나 지면 등의 2차원 평면이어서 비직관적이고 헷갈린다. 평면 좌표계는 지면에 그려 보고 출력 결과를 쉽게 예측할 수 있지만 3차원의 물체를 직접 그릴 방법은 없으므로 허공에 대고 상상해 봐야 한다.

3차원의 물체를 평면에 투영해서 그리면서도 입체감을 살려야 하므로 굉장히 복잡하고 많은 연산이 필요하다. 변환, 채색, 조명, 텍스처, 그림자 등 변화를 주는 단계가 많고 수학적인 계산도 요구되어 소프트웨어만으로는 한계가 있으며 하드웨어 가속 기능이 필수적이다. 이런 복잡한 연산과 하드웨어 제어를 대신해 주는 것이 바로 3D 그래픽 라이브러리이며 그 중 하나가 OpenGL이다.

3D 그래픽은 우리 생활 도처에 두루 활용되지만 가장 주된 사용처는 역시 게임이다. 3D 그래픽으로 작성된 게임은 현실 세계를 사실감있게 그려내어 보기에도 예쁘고 몰입도도 높다. 다음은 최근 국내에서 발표한 테라 게임의 한 장면으로서 그래픽이 섬세해서 실제 야외로 나가 활동하는 듯한 느낌을 준다.

3D 그래픽은 CAD, CAM 같은 설계, 제작 프로그램에도 필수적인 기술이다. 컴퓨터로 부품을 설계하여 한치의 오차도 없이 제작해 내고 잘 동작하는지 시뮬레이션까지 해 볼 수 있다. 애니메이션 영화 제작에도 사용되며 가상현실(VRML)이나 증강현실도 3차원 기반이다. 교육용, 의료용으로도 많이 활용된다. 매킨토시나 아이폰은 인터페이스 구현에도 미려한 3차원 그래픽을 적용하여 사용자의 감성을 자극한다.

3차원 그래픽이 실생활에 사용된 것은 오래 전의 일이지만 어디까지나 사용자의 입장에서였으며 개발자 입장에서 OpenGL은 그다지 대중적이지 않았다. 게임이나 애니메이션은 누구나 즐기는 것이지만 극히 소수의 개발자만이 OpenGL을 직접 다루었으며 나머지는 고수준 라이브러리만으로도 원하는 효과를 다 구현할 수 있었다.

그러나 최근에는 모든 개발자가 OpenGL에 관심을 가져야 할 중요한 변화들이 발생했다. 우선 모바일 환경이 대중화됨으로써 3차원 그래픽의 사용처가 늘어났다. 예쁜 그래픽과 애니메이션 효과가 성패를 판가름하는 중요한 기준이 되었는데 2D 그래픽으로는 한계도 많고 차별화를 꾀하기도 어려워졌다. 그래서 3D 그래픽이 부쩍 관심을 받게 되었다.

또한 새롭게 떠오르는 신기술인 HTML5가 3차원 그래픽을 공식 지원하기 시작함으로써 웹 페이지를 만드는데도 OpenGL을 자유롭게 활용할 수 있게 되었다. 웹의 표준 3차원 그래픽인 WebGL은 OpenGL ES 2.0을 기반으로 한다. 전문 웹 개발자뿐만 아니라 일반 사용자들도 OpenGL로 자신의 홈 페이지를 멋지게 장식할 수 있게 되었다. 이런 여러 가지 이유로 미래에는 OpenGL이 지금보다 훨씬 더 대중화될 것으로 예측된다.

1-2.역사

OpenGL의 시초는 1982년 실리콘 그래픽스(SGI)가 유닉스용으로 개발한 그래픽 라이브러리인 IRIS GL이다. 최초 2D용으로 개발되었다가 자사의 그래픽 워크스테이션을 위해 3D로 업그레이드되었다. 특정 기계를 위해 만든 라이브러리이다 보니 이식성이 부족했고 특허 문제로 인해 범용적으로 사용하기도 어려웠다.

그래서 여러 회사들과 OpenGL ARB(Architecture Review Board)를 결성하여 표준화 작업을 진행했다. IRIS GL의 범용성과 이식성을 개선하여 1992년 개방형 라이브러리도 다시 만든 것이 바로 OpenGL이다. OpenGL의 표준화 기구인 ARB에는 웬만한 대기업들이 모두 가입되어 있으며 이후 비영리 컨소시엄인 크로노스 그룹(Khronos Group)에 합류되었다. OpenGL을 만든 SGI는 2006년에 파산하여 현재는 크로노스 그룹에서 관리하고 있다.

 

버전

발표 년도

특징

1.0

1992

IRIS GL 공개 버전으로 발표

1.1

1995

텍스트 맵핑 개선, 논리 연산 기능 추가. 윈도우 95 내장됨

1.2

1998

ARB 확장 기능 제공.

1.3

2001

텍스처 압축, 멀티 샘플링, 전치 행렬

2.0

2005

GLSL 쉐이더 포함.

3.0

2008

하위 호환성 컨텍스트 개념 도입.

4.0

2010

쉐이더 4.0으로 업그레이드

4.1

2010.7

 

 

OpenGL 1.0은 윈도우즈 NT에 내장되었으며 1.1은 윈도우즈 95부터 포함되었다. 가장 대중적인 운영체제가 OpenGL을 공식 지원함으로써 이때부터 OpenGL이 널리 쓰이기 시작했다. 그러나 독점 운영체제를 가진 마이크로소프트가 고유의 3D API인 DirectX를 발표한 후부터 OpenGL에 대한 지원을 게을리 함으로써 상당한 기간동안 정체되기도 했다.

그러나 IDSoft의 존 카멕(John carmack)이 둠, 퀘이크 등의 유명한 게임을 OpenGL로 작성함으로써 다시금 급부상하기 시작했다. 현재는 3D API 시장을 DirectX와 OpenGL이 양분하고 있는 구도이며 대부분의 그래픽 카드들이 두 드라이버를 모두 제공한다. 두 라이브러리의 사용법이나 전체적인 구조가 거의 흡사한데 이는 DirectX가 OpenGL의 기능을 상당 부분 흡수했기 때문이다.

치열한 경쟁을 통해 서로가 닮아 감으로써 지금은 기능상의 우열을 따지는 것이 거의 무의미한 지경이지만 속도는 DirectX가 약간 더 우세한 것으로 평가되고 있다. 그러나 오로지 윈도우즈 환경에서만 동작한다는 큰 약점이 있다. OpenGL은 명실 상부한 국제 표준이고 다양한 플랫폼을 지원함으로써 현재는 더 긍정적인 평가를 받고 있다. 대부분의 모바일 장비에 이식됨은 물론이고 WebGL 표준으로도 채택되어 약간 더 우세한 위치를 점하고 있는 실정이다.

OpenGL과 DirectX를 통합하기 위해 두 회사는 2000년에 Fahrenheit라는 통합 라이브러를 개발하기로 합의했었다. 그러나 DirectX가 더 인기를 얻게 되자 마이크로소프트는 슬그머니 이 프로젝트에서 발뺌을 했고 SGI는 파산함으로써 결국은 무산되고 말았다.

OpenGL을 임베디드 시스템(ES)에 맞게 간략화하여 만든 축소판인 OpenGL ES도 발표되어 있다. OpenGL에서 일부 고급 기능을 제거하여 성능이 낮은 모바일 장비에 적합하게 경량화하고 모바일 환경에 필요한 기능 일부를 추가한 것이다. ES는 OpenGL의 서브셋이므로 OpenGL을 먼저 공부하는 것이 순서상 맞다.

1-3.특징

OpenGL의 특징은 이름에 포함된 Open이라는 단어에서 대부분 유추할 수 있다. 개방되어 있고 무료이며 이식성이 뛰어나다.

 

그래픽 라이브러리는 구체성을 기준으로 고수준과 저수준으로 분류되는데 OpenGL은 저수준 라이브러리이다. VRML같은 고수준 라이브러리는 물체간의 관계를 정의함으로써 장면을 그려낸다. 이에 비해 저수준 라이브러리는 모델링보다는 랜더링 기능이 주이며 세부적인 명령을 일일이 전달함으로써 물체의 가장 기본적인 요소를 그린다. 사용 방법이 훨씬 더 어렵지만 세세한 부분까지 그릴 수 있다.

개방된 표준이므로 플랫폼에 독립적이다. 운영체제와 연관된 부분이 없고 디바이스 드라이버를 통해 하드웨어를 직접 제어하므로 드라이버만 존재하면 모든 하드웨어 환경에서 실행할 수 있다. 대부분의 데스크탑 환경, 모바일 환경은 물론이고 PlayStation, Nintendo 등의 게임기 등에도 광범위하게 이식되어 있다.

간단한 함수들로 구성되어 있으므로 개발 언어에도 독립적이다. C/C++, C#, 자바, 파이썬 등 대부분의 언어에서 사용 가능하다. 함수 기반이므로 C 언어가 가장 적합하되 객체 지향의 이점까지 고려하면 C++이 가장 유리하다. 무엇보다 문서와 예제가 풍부하고 재사용한 코드를 쉽게 구할 수 있다는 것이 큰 이점이다. 또 그래픽 프로그램이 요구하는 속도를 충분히 만족한다.

하드웨어의 가속 기능을 최대한 활용하여 효율적으로 동작한다. 하드웨어가 지원하지 않는 기능은 소프트웨어로 흉내낼 수도 있으므로 느려지거나 품질이 나빠지더라도 최소한 그려내기는 한다.

 

OpenGL은 언어가 아니며 250개의 함수로 구성된 라이브러리이다. 함수를 호출하면 서비스를 해 주는 식으로 되어 있다. 빠른 속도를 위해 C 수준에서 작성되었으므로 객체 지향과는 거리가 멀다. 그리기에 필요한 명령인 함수들을 절차적으로 순서대로 호출하는 식이다.

1-4.개발 환경

OpenGL은 플랫폼과 언어에 독립적이므로 학습 및 개발 환경이 광범위하다. 어떤 운영체제에서나 사용할 수 있으며 아이폰이나 안드로이드같은 모바일 환경에서도 활용할 수 있다. 그러나 학습을 위한 환경은 PC가 가장 편리하다. 설사 최종 타겟이 모바일이더라도 일단 PC 환경에서 기본 개념을 실습한 후 모바일 환경에서 달라지는 부분만 따로 학습하는 것이 현명하다. 모바일 환경은 에뮬레이터상에서 결과를 확인하므로 절차가 번거롭고 느리다.

OpenGL 학습에 가장 권장되는 환경은 윈도우즈 플랫폼에서 C 컴파일러를 사용하는 것이다. 무엇보다 대중적이고 개발 환경을 구축하기도 쉽기 때문이다. 이 강좌에서는 비주얼 스튜디오 2010으로 프로젝트를 제공한다. 전통적으로 많이 사용되는 비주얼 C++ 6.0도 실습 컴파일러로 충분하지만 실습을 위해 일부러 따로 설치하는 것도 무척 귀찮은 일이다. 실무 프로젝트를 위해 어차피 2010이 설치되어 있는 경우가 많으므로 이 컴파일러를 기준으로 한다.

비주얼 스튜디오는 덩치가 크고 상용 프로그램이라 기업에서 설치하기는 부담스러운 경우가 종종 있다. 이런 경우는 공개용 컴파일러인 Dev-C++을 사용하면 된다. 고작 30M 정도밖에 안되며 설치에 1분도 안 걸리는 초소형 컴파일러지만 윈도우즈 응용 프로그램 제작은 문제없이 지원한다. 다음 사이트에서 다운받아 설치한다.

 

http://www.bloodshed.net/

 

현재 최신 버전은 4992 버전이되 더 최신 버전이 나와도 사용 방법은 거의 동일할 것이다. 리눅스이거나 다른 컴파일러를 사용하더라도 개발 과정에는 큰 차이점이 없다. 이 강좌는 C/C++ 문법과 컴파일러 사용법은 안다고 가정한다. 코딩을 한번도 해 보지 않은 사람이 의욕만 넘쳐 이 강좌를 읽고 있다면 순서가 완전히 잘못된 것이므로 C 언어부터 먼저 배우기 바란다.

3차원 그래픽은 본질적으로 수학을 많이 사용하므로 기본적인 수학적 개념이 필요하다. 그렇다고 지레 겁을 먹을 필요는 없으며 수학을 따로 공부할 필요도 없다. 중학교만 제대로 나왔고 고등학교 수학은 졸면서라도 들은 정도면 충분하다. 사실 복잡한 수학적 계산이 엄청나게 많이 사용되지만 그걸 대신 해주는 것이 바로 OpenGL이다. 개념만 이해하고 OpenGL을 잘 부려 먹으면 된다.

마치 컴퓨터를 잘 몰라도 웹 서핑이나 게임을 잘 할 수 있는 것과 비슷하다. 상세하게는 몰라도 내부 동작을 대충이나마 유추할 수 있는 정도면 충분하다. OpenGL의 연산 과정을 잘 알고 있으면 함수들의 인터페이스를 더 잘 이해할 수 있고 에러 발생시 대처 능력이 향상된다. C 언어 외에 3DS MAX 같은 3차원 그래픽 소프트웨어를 사용해 본 경험이 있다면 많은 도움이 된다.

1-5.구성

OpenGL은 다음 두 가지 라이브러리로 구성되어 있다.

 

GL : 가장 기본적인 그리기 기능을 제공하는 핵심 라이브러리이며 OpenGL의 본체에 해당한다. 기초 도형을 랜더링하는 함수들이 포함되어 있다. 시스템 디렉토리에 opengl32.dll(773K) 파일로 제공되며 미리 설치되어 있다.

GLU : GL의 도우미 역할을 하는 유틸리티 라이브러리이다. 분할, 투영 등의 고급 기능을 제공하며 원구나 원뿔, 원기둥 등의 테스트 입체 도형을 생성하는 편의 기능도 제공한다. glu32.dll(127K) 파일로 제공된다. 내부적으로 GL 함수를 호출하므로 GL의 일부로 취급하기도 한다.

 

OpenGL은 순수한 그래픽 라이브러리이며 그래픽 관련 기능만 제공한다. 그래픽을 출력하려면 윈도우가 있어야 하고 사용자로부터 입력도 받아야 하는데 OpenGL은 이런 기능을 전혀 제공하지 않는다. 본연의 임무가 아닌 기능은 과감하게 제외함음으로써 전문성을 높이고 그럼으로써 플랫폼 독립성이 확보되는 것이다. 반면 DirectX는 입출력 기능까지 제공하므로 윈도우즈에서만 사용 가능하다.

플랫폼마다 윈도우를 생성 및 관리하는 방법이 다르고 입출력 방법도 상이하다. 그래서 윈도우나 입출력 관련 기능은 플랫폼마다 제공되는 고유의 명령어를 직접 사용해야 한다. 이들을 통칭하여 OpenGL 보조 라이브러리(AUX)라고 부르며 운영체제별로 다음과 같은 라이브러리가 제공된다.

 

운영 체제

라이브러리

유닉스 X 윈도우

GLX

윈도우즈

WGL

애플 매킨토시

AGL

IBM OS/2

PGL

 

플랫폼마다 특성이 다르므로 AUX도 완전히 다를 수밖에 없다. 그래픽 프로그래머가 개별 운영체제의 GUI를 직접 다루어야 하며 플랫폼별로 프로그램을 따로 만들어야 하는 불편함이 있다. 예를 들어 윈도우즈 환경에서 OpenGL을 사용한다면 WGL 라이브러리도 구사할 수 있어야 하며 Win32의 구조도 대충이나마 알아야 한다.

껍데기 없이 그래픽 코드만으로 프로그램을 만들 수는 없으므로 실무에서는 어쩔 수 없는 일이다. 그러나 학습을 하는 입장에서는 그래픽 외의 코드까지 공부하는 것이 너무 귀찮고 시간도 많이 걸린다. 하지만 최소한 출력해볼 창은 만들어야 뭔가를 그려 볼 수 있으므로 그래픽 이론보다는 창을 만드는 것을 먼저 배워야 한다.

다행히 이런 불편함을 해소해 주는 통합 보조 라이브러리가 있다. SGI의 직원인 마크 킬가드(Mark Kilgard) 아저씨가 이런 목적으로 GLUT(GL Utility Toolkit) 라이브러리를 제작하여 배포한다. GLUT은 운영체제를 추상화함으로써 동일한 예제를 다양한 운영체제에서 실행할 수 있도록 한다. 운영체제의 내부를 잘 몰라도 몇줄의 코드만으로 그래픽 입출력 환경을 쉽게 구현할 수 있으며 하나의 소스로 여러 운영체제에서 실행해 볼 수 있다.

그래서 학습용으로는 GLUT이 최적의 해결책이다. 환경 설정에 대한 부분은 GLUT에게 맡기고 그래픽 관련 코드만 작성하면 된다. 그러나 GLUT은 개별 운영체제의 고유한 기능을 활용하지 못하고 공통적인 부분만 추상화 하므로 섬세함은 떨어질 수밖에 없다. 극히 기본적인 기능만 제공할 뿐이므로 실제 프로젝트를 할 때는 운영체제에 맞는 AUX를 사용해야 한다.

GLUT는 OpenGL의 일부가 아니므로 운영체제에 포함되어 있지 않다. 그래서 다운로드받아 설치해야 한다. GLUT는 OpenGL의 홈 페이지에서 쉽게 구할 수 있다. 다음 사이트를 방문해 보자.

 

http://www.opengl.org

 

이 사이트에서 OpenGL의 각종 스펙 문서와 예제, 레퍼런스 등이 제공되며 관련 툴들도 배포한다. 메뉴 바의 오른쪽에는 크로노스 그룹의 링크도 마련되어 있다.

상단 메뉴의 Coding Resources/GLUT & Utility Libraries로 들어간다. 첫번째 항목인 About GLUT을 선택하면 아래쪽에 다운로드 링크가 있다. 자신의 환경에 맞는 링크를 선택하되 Win32 for Intel이 대부분일 것이다.

소스도 공개되어 있으므로 관심있는 사람은 분석해 보도록 하자. 다운로드 받은 압축 파일에는 다음 5개의 파일이 포함되어 있다.

각 파일들을 해당 폴더로 복사하면 GLUT 설치가 완료된다. DLL 파일은 운영체제의 System32 폴더로 복사하고 헤더 파일과 임포트 라이브러리(*.lib)는 컴파일러의 해당 폴더로 복사한다. 복사 위치는 컴파일러 버전에 따라 다른데 VS 2010 버전의 경우 다음 경로에 복사한다.

 

c:\Program Files\Microsoft SDKs\Windows\v7.0A

 

Dev-C++의 경우 설치 폴더 루트에 Inlcude와 lib 폴더가 있으므로 바로 복사하면 된다. 헤더 파일은 inlcude 폴더 바로 아래에 복사하지 말고 include/gl 서브 폴더에 복사하는 것이 좋다. 이 폴더에 이미 gl.h와 glu.h가 위치해 있으므로 같이 모아 두도록 하자. glut 관련 자료는 opengl.org의 Documentation/Specification/GLUT에 있다. 웹에서 HTML로 바로 볼 수도 있고 pdf로 다운로드하여 인쇄해 볼 수도 있는데 필요한 함수만 그때 그때 찾아 보는 것이 좋다.

1-6.참고 자료

이 강좌는 작성자가 학습을 하면서 썼기 때문에 완벽하지도 못하고 상세함도 떨어진다. 좀 더 깊이있게 공부해 보려면 다른 참고 자료를 많이 읽어야 한다. 다음은 OpenGL 학습에 도움이 될만한 서적과 강좌, 사이트 목록이다. OpenGL을 다루는 책이 많지 않고 그나마도 대부분 번역서이며 국내서는 몇 권 되지 않는다. 이 강좌로 대충의 오버뷰를 한 후에 다음 자료들을 더 읽어 보도록 하자.

 

OpenGL Super Bible 제 3 판

2005년 3월 17일

1173쪽

Richard S. Wright Jr 공저

최현호 역

정보 문화사

32000원

현재로서는 가장 참고할만한 책이다. OpenGL에 대한 전반적인 이론을 고루 다루고 있으며 쉐이더에 대해서도 상세하게 설명되어 있다. 처음부터 순서대로 차근 차근 잘 설명되어 있으며 번역도 양호하다. 각 장마다 주요 함수에 대한 레퍼런스도 제공한다. 예제들도 대부분 잘 컴파일되며 단순하고 핵심적이다. 뒤로 가면 지면 절약을 위해 필수 소스 덤프를 생략한 곳이 많고 진행이 너무 빨라지는 것이 흠이다. 원서는 2010년 7월에 5판까지 나왔으나 번역서는 현재 3판이 최신이다.

 

IT COOKBOOK OpenGL로 배우는 컴퓨터 그래픽스

2006년 1월 7일

860쪽

주우석 저

한빛 미디어

34000원

거의 유일한 국내 서적이다. 윈도우즈 환경에서 GLUT로 개발하므로 실습하기 편리하다. 쉐이더는 다루지 않는다. 풀 컬러로 인쇄되어 있어 보기에 예쁘다. 내용에 상당한 깊이가 있고 수학적인 해석이 잘 되어 있다. 그러나 교수님이 쓰신 책이라 이론에 치중하는 경향이 있고 친절하지는 못하다. 자습서로는 적당하지 않지만 이론적인 심화 학습에는 상당히 많은 도움이 된다.

 

OpenGL 프로그래밍 가이드

2005년 1월 10일

782쪽

Dave Shreiner, Mason Woo, Jackie Neider, Tom Davis 공저

남기혁 역

정보 문화사

28000원

 

1.2 버전의 3판과 1.4버전의 4판이 번역되었다. 내용이 상당히 쉽게 잘 설명되어 있다. 앞부분은 괜찮은데 뒤로 갈수록 난잡해지는 느낌이 든다. 현재 절판 상태라 새 책은 구하기 어려우며 중고로 구해 봐야 한다. 원서는 2009년 7월에 3.0 버전으로 출시되어 있으나 아직 국내에 번역되지는 않았다. 1.1 버전을 다루는 이전판은 opengl.org에 원고가 공개되어 있어 인쇄해서 볼 수 있다.

 

OpenGL ES 2.0 프로그래밍 가이드

2009년 11월 10일

416쪽

Dave Shreiner 저

정희경 역

홍릉과학출판사

29000원

OpenGL ES를 다루는 책이다. OpenGL ES 1.x가 아닌 2.0의 쉐이더만을 다룬다. OpenGL 자체를 안다고 가정하고 OpenGL ES를 설명하며 기본 그래픽 이론은 설명하지 않는다. 원서 자체도 그다지 호평은 받지 못했으며 번역자는 발로 번역을 하는 놀라운 내공의 소유자로 알려져 있다.

 

이 외에 아이폰 관련 서적 일부와 DirectX 관련 서적 몇 권이 더 발표되어 있다. OpenGL이 HTML5의 WebGL에도 적용되므로 차후에는 더 많은 국내서와 번역서가 출판될 것으로 기대된다. 다음은 OpenGL 관련 참고 사이트 목록이다.

 

http://nehe.gamedev.net/

OpenGL의 성지라고 일컬어지는 곳이다. 단계별로 튜토리얼이 제공되어 순서대로 실습해 볼 수 있다. glut를 사용하지 않고 Win32 API 위주로 되어 있다.

 

http://www.galexandria.com/main/nehe-opengl-tutorials

NeHe의 강좌를 한국어로 번역해 둔 갈렉산드리아님의 블로그이다. 현재 1~8편, 16, 47, 48까지 번역되어 있으며 NeHe로부터 정식 번역 허가를 받았다고 한다. 번역의 질은 상당히 양호하다.

 

http://insanitydesign.com/wp/projects/nehe-android-ports

NeHe 사이트의 예제들을 안드로이드 버전으로 포팅해 놓았다. 설명은 간략하게 작성되어 있고 예제는 모두 컴파일 가능한 상태로 제공된다.

 

http://yooninsung.blog.me/

코스모스님의 블로그이다. 8개의 OpenGL 강좌가 있으며 처음 시작할 때 읽어볼만하다. 쉽게는 쓰여졌으나 다소 장난스럽다. 예제 위주이며 이론 설명은 거의 없다.

 

아쉽게도 한글로 된 쉬운 강좌는 아직도 많이 부족하다. 이 강좌가 빈자리를 조금이나마 채우기를 희망하지만 그러기 위해서는 한참 더 보강해야 한다.