OpenGL

0. 준비하기

codebank 2012. 11. 22. 16:37
간단하게 이러한 코드를 만들 것 이다.

OpenGL.
Open Graphics Library의 약자다. Open은 말그대로 열려있는 즉, 폐쇄적인 코드가 아닌 누구든지 소스 코드를 볼 수 있다는 뜻의 Open이다. 이것은 공짜와는 다른 의미이다. 가끔 영문의 Free를 공짜로 번역하는 경우가 있는데 program에서 말하는 Free는 공짜라는 의미보다 누구에게나 열려있는 소스 즉, Open에 뜻이 조금 더 비슷하다. Free라고 무조건 자유롭게 사용하기보다는 그것을 통해서 그동안 풀지 못했던 문제를 푼다거나 이미 누군가가 고민했던 수순을 다시한번 경험하지 않아도 된다거나 Free code보다 조금더 개선된 코드로 수정해서 마찬가지로 Free로 공개하도록 유도하기 위한 뜻이 있다.

즉, 받아먹기만해도 되지만 만일 생각이 있고 뜻이 있다면 같이 동참해서 좀더 좋은 코드를 만들어보자는 의미를 내포하고 있다는 것이다.

OpenGL역시 컴퓨터에서 그래픽을 표현하기 위한 코드를 Open함으로써 컴퓨터를 이용하여 그래픽을 표현하기 위한 진입장벽을 엄청나게 낮췄으며 아직도 계속적인 여러 회사들의 협의를 통해서 좀더 쉽게 코드를 작성할 수 있도록 수정되고 있는 중이다.

OpenGL의 뜻에서도 보였듯이 OpenGL은 라이브러리이다. 또한 라이브러리 코드가 소스형태로 되어있다보니 여러 OS에서 사용이 가능하다. 즉, 출력 환경 설정 부분만 OS별로 구현하면 라이브러리를 이용하는 부분은 거의 수정없이 사용이 가능하다. 단, PC급이 아닌 모바일의 경우에는 수정이 필요하다.

이번 글의 목적은 단순히 OpenGL을 어떻게 사용하느냐만 다룬다. 많은 책이나 웹사이트에서 체계적으로 설명하고 있으니 그것을 참조해도 된다. 이글을 쓰는 이유는 그냥 혼자 잊어버리지 않기 위해서이다. 즉, 누군가를 위한 글이 아니라 그냥 혼자쓰는 일기 형태이다. 머리가 나빠서 구현해 놓고도 또 다시 같은 시간을 들여서 구현하는게 귀찮아서...

이제 준비물부터 살펴보자.
OS는 MS-Windows와 Linux를 사용한다. 어차피 OpenGL은 같은 코드를 사용할 것이니 창 초기화 부분만 따로 작성하고 OS에 맞게 분류하도록 작성하면 되고 OS에 영향을 많이 받는 키보드, 마우스 입력 부분만 작성한다. 이후 OpenGL 코드 부분만 따로 작성해서 OS에 상관없이 코드를 테스트해볼 수 있도록 할 것이다.

OS의 선택도 끝났고 이제는 중요한 컴파일러이다. 돈이 많거나 학생일 경우에는 MS에서 판매하는 Visual Studio 제품을 구입하거나 공짜로 다운받아서 사용할 수 있는 Visual Studio 제품을 받아서 사용해도 된다. 하지만 앞으로 같은 코드로 MS-Windows나 Linux양쪽에서 작성할 생각이기 때문에 양 OS에서 유사하게 동작하는 Code::Blocks를 사용할 것이다. Code::Blocks은 편집기이고 MS-Windows용은 MinGW32라는 컴파일러를 포함해서 배포도 하기 때문에 그냥저냥 사용 할만하다. 만일 새로운 컴파일러가 필요하다면 Code::Blocks은 IDE부분만 있는 것만 다운로드해서 설치하고 MinGW32를 최신 안정버전으로 다운로드 받아서 설치하고 계속 업그레이드 시켜주면 된다.
설치방법은 검색사이트에서 'codeblocks'만 넣어도 엄청나게 자세한 설명이 나오니 여기서는 생략...

MinGW32는 기본이 gcc로 되어있고 gcc를 MS-Windows에서 사용할 수 있도록 컴파일 해 놓은 패키지이고 기본적으로 GL, GLU가 포함되어있으니 설치하는 것만으로도 기본적인 OpenGL프로그램은 가능하다. 나중에 GLSL을 하게 된다면 그것을 위해서 몇가지 수정부분이 있지만 그것까지 가려면 먼 미래 같고 아직은 설명할 단계도 아닌것 같다.

일단 개발 환경은 Code::Blocks를 이용할 것이고 컴파일러는 gcc(MS-Windows는 MinGW32)를 이용할 것이다. Linux의 경우에도 gcc만 설치하면 되는 것이 아니라 개발툴(Library)를 추가 설치해 주어야한다. 이것 또한 웹사이트에서 'Ubuntu x window programming' 정도만 검색해봐도 어떠한 라이브러리를 추가 설치해야하는지를 알 수 있다. 참고로 라이브러리 뒤에 '-dev'가 붙은 것이 개발자용(developer) 라이브러리 및 헤더파일 이다. Ubuntu에서는 -dev가 붙은 것을 설치해야 개발이 가능하다. 다른 배포판도 비슷한 형태로 배포가 되고 있으니 각자 배포판에 따라서 설치해 주면 된다.

오늘은 OpenGL이 무엇이고 어떤 환경에서 어떤 것을 이용해서 개발 할 것인지에 대해서 설명했다.

참고로... 가끔 개발자를 꿈꾸는 사람들을 보면 기초지식은 필요없다고 생각하는 사람들이 많다. 사실 필요하지는 않다. 머리가 좋다면... 하지만 머리가 좋지 않다면 기초지식을 알아 두는 것이 배울 때는 모르지만 나중에 실전에서 엄청난 도움을 받을 수 있다. 사실 컴퓨터의 처음 시작은 어떻게 되고 0,1로 이뤄지고 진공관과 TR을 거쳐서 반도체로 넘어가는 고리타분한 이야기는 역사를 좋아하지 않는 이상 흥미있는 이야기는 아니다. 하지만 저 간단한 사실에서 상당히 고품질의 Know How가 숨겨져 있다면 믿지 못할 것이다.
간단한 예로 사람들은 컴퓨터를 100% 신뢰 하지만 난 100%신뢰하지는 않는다. 그 이유는 컴퓨터의 초기모델인 진공관 때부터 유래가 된다. (진공관에 대한 더 이상의 자세한 이야기는 생략한다...) 진공관 수명이 다되면 입력이나 출력이나 제대로 된다는 것을 보장할 수 없다. 현재의 PC에서는 어떨까? 아무렇지 않게 사용하는 PC이지만 가끔 이상한 동작을 하는 경우가 있다. 가장 유명했던 것은 MS-Windows의 기본 프로그램인 계산기에서 나오면 안되는 오류가 발생했던 사건이 있었다. 또한 intel CPU의 floating point의 문제점도 있었고... 사람들이 완벽하다는 컴퓨터도 상황에 따라서는 완벽하지 않을 수도 있다는 것을 예전부터 가지고 있었다는 것을 알기 위해서는 역사에 대해 숙지하는 것도 좋다고 생각한다. 암기가 아니라 숙지이다. 대충만 기억해 놓아도 된다는 것이다. 역사에 대해서 공부하다보면 아무 생각없이 사용하고 있는 OS의 동작들이 왜 그렇게 되었는지도 알 수 있고 어느정도 숙련되다면 접근가능한 대부분의 OS나 환경에서 적응을 빠르게 할 수도 있다. 프로그램에서도 그러한 환경을 이용할 수 있는 자신만의 노하우가 생길 것이다. 많은 사람들은 100줄 이상의 코드를 만들어야 결과를 볼 수 있지만 이러한 노하우를 알고 있다면 10여줄만 있어도 같은 결과를 얻을 수 있다.
또한 간단하게 C코드에서 x = 3 * 2; 라는 코드를 쓴다고 할 때 좀더 빠른 속도를 원하는 사람들은 x = 3 << 1;로 쓰기도 한다. 곱하기 연산자보다는 Shift연산자가 빠르기 때문에 간단하게 2를 곱할 때는 저렇게 사용하기도 하지만 이 방법을 알고 있는 사람들은 별로 많지 않다. 또한 요즘처럼 엄청난 속도를 자랑하는 환경에서는 속도차이를 느끼지 못한다. 하지만 저렇게 곱하기 2를 하는 수십만 코드가 있다면 그리고 그것을 엄청나게 반복하는 코드가 있다면 확실한 속도차이를 볼 수도 있다. 특히나 수학공식을 이용하는 많은 프로그램들에서는 확실히 이득을 볼 것이다.

아 글이 장황해 졌다. 다만 컴퓨터의 역사를 공부하는 것에 대해서 쓸모 없다고 생각하는 사람들에게 그렇게 쓸모 없지도 않다는 것을 알려주기 위한 글이었다.